onTouch调用使onDraw失效 - 不顺利

时间:2016-04-02 03:33:19

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

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

// 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;
}

当我慢慢移动时,运动是平稳的。但是当我快速移动时,人们会感觉到闪烁。我想invalidate()很多次发生,导致闪烁。有没有办法让它更顺畅(减少绘制圆圈上的闪烁)?

3 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:0)

我知道这个问题很旧,但是如果其他人遇到同样的问题,解决方案是在postInvalidate()方法中使用invalidate()而不是onTouchEvent更加流畅。

当我们在onTouchEvent中收到许多事件时,将无效调用放入事件队列中以供将来处理而不是立即执行会更有效。

答案 2 :(得分:-1)

public class MyView extend FrameLayout implement OnTouchListener{
   public MyView(params){
      init();
   }

   private void init(){
      ImageView imageView = new ImageView();
      imageView.setImageResource(R.mipmap.logo);
      addView(imageview)

      imageView.setOnTouchListener(this);
   }

   private boolean onTouch(params){
       //some logic to control
       //use imageView.setLayoutParams() instead of invalidate();
   }
}