java - onTouch 调用使 onDraw 无效 - 不流畅

标签 java android android-canvas android-custom-view ondraw

我的自定义 View 中有一个代码,如果我触摸,就会绘制一个圆圈。当我移动圆圈时,请跟随。代码如下

// override onDraw
@Override
protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    if (circleBounds != null) {
        canvas.drawArc(circleBounds, 360, 360, false, mPaint);
    }
}

// when ACTION_DOWN start touch according to the x,y values
private void startTouch(float x, float y) {
    mPath.moveTo(x, y);
    mX = x;
    mY = y;
    circleBounds.set(mX - mRadius, mY - mRadius, mX + mRadius, mY + mRadius);

    invalidate();
}


//override the onTouchEvent
@Override
public boolean onTouchEvent(MotionEvent event) {
    float x = event.getX();
    float y = event.getY();

    switch (event.getAction()) {
    case MotionEvent.ACTION_DOWN:
        startTouch(x, y);
        break;
    case MotionEvent.ACTION_MOVE:
        startTouch(x, y);
        break;
    }
    return true;
}

当我缓慢移动时, Action 很流畅。但当我快速移动时,人们会感觉到闪烁。我猜 invalidate() 发生了很多次,导致闪烁。有没有办法让它更平滑(减少绘制圆圈的闪烁)?

最佳答案

无效不是你的问题,系统有双缓冲,你不应该看到闪烁。 从你的代码中,我可以想到两种改进方法:

  1. 在 onStartTouch 中调用 mPath.moveTo()。目前尚不清楚为什么需要 mPath,但这条路径会不断增长,并且需要更多内存
  2. canvas.drawArc 由 CPU 渲染(它创建一个位图并在每次调用 onDraw 时将弧线绘制到其中)。将圆渲染成位图并在 onDraw 中绘制该位图会更快。如果您继续使用相同的位图,它将被加载到 GPU 一次,并且绘图速度会更快

关于java - onTouch 调用使 onDraw 无效 - 不流畅,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36368861/

相关文章:

java - 在 RESTful Web 服务中使用 @Consumes(MediaType.APPLICATION_JSON) 时出现问题

java - 在构建新的 Android 应用程序期间没有 project.properties 文件和 NullPointerException

android - 为什么在使用弃用项之前验证 Build.VERSION.SDK_INT 时弃用警告不会消失?

android - 在 Canvas 中旋转文本

java - 如何在android中使用CanvasView显示按钮?

android - 使 Canvas 透明

java - 从maven junit中的依赖jar加载文件

java - 如何在没有 xml 的 Spring MVC 中启用 REST gzip 压缩?

java - 绕过 Gson 数字解析器实现

java - 是否有Java,Javascript,Python中用于日历计算的良好框架,可以从公历转换为希伯来语日历?