2011-08-09 7 views
2

私は描画アプリケーションで作業しています。それはかなり簡単で、onTouchEvent、パス、およびcanvas.drawPathを使用します。ユーザーがすばやくスワイプして停止せずに離すと、パスの最後のセグメントが連続して点滅します。 ACTION_UP条件では、パスを更新し、boolean resetPathをtrueに設定し、onDrawでパスを描画し、resetPathがtrueの場合はpath.reset()を呼び出してresetPathをfalseに設定します。私は間違って何をしていますか?キャンバス上の描画パス。タッチ入力が素早く移動して停止すると、最後のセグメントが連続的に点滅します

class DrawingPanel extends SurfaceView implements SurfaceHolder.Callback { 
    private DrawingThread _thread; 
    private Path path; 
    private Boolean resetPath = false; 

    public DrawingPanel(Context context) { 
     super(context); 
     getHolder().addCallback(this); 
     _thread = new DrawingThread(getHolder(), this); 
     path = new Path(); 
    } 


    private float mX, mY; 
    private static final float TOUCH_TOLERANCE = 25; 



    public boolean onTouchEvent(MotionEvent event) { 

     synchronized (_thread.getSurfaceHolder()) { 
      if(event.getAction() == MotionEvent.ACTION_DOWN){ 
       path.reset(); 
       path = new Path(); 
       path.moveTo(event.getX(), event.getY()); 
       mX = event.getX(); 
       mY = event.getY(); 
      }else if(event.getAction() == MotionEvent.ACTION_MOVE){ 
       float dx = Math.abs(event.getX() - mX); 
       float dy = Math.abs(event.getY() - mY); 
       if (dx >= TOUCH_TOLERANCE || dy >= TOUCH_TOLERANCE) { 
        path.quadTo(mX, mY, (event.getX() + mX)/2, (event.getY() + mY)/2); 
        mX = event.getX(); 
        mY = event.getY(); 
       } 
      }else if(event.getAction() == MotionEvent.ACTION_UP){ 
       resetPath = true; 
      } 
      return true; 
     } 
    } 

    @Override 
    public void onDraw(Canvas canvas) { 
     canvas.drawPath(path, mPaint); 
     if (resetPath) { 
      path.reset(); 
      resetPath = false; 
     } 
    } 

答えて

0

、あなたがあなたのパスを描画する前に、全体のキャンバスをペイントしたり、リセットされていないonDrawで、次の

  1. を考えてみましょう。通常、あなたはすべきです。そうでなければ、常に前のビットマップの上にパスを描画します。ペイントが透明を使用していた場合、描画するパスの最も古い部分は、オーバーラップするため、最新の部分よりも透明性が低くなります。
  2. OnTouchEventonDrawは同じスレッドで実行されません。
  3. SurfaceViewは、ダブルバッファリング技術を透過的に使用します。 onDrawへの連続した2回の呼び出しは、2つの異なるキャンバスに描画されます。したがって、onDrawへの2つの呼び出しの間にACTION_MOVEACTION_UPがある場合、2番目のバッファは最初のバッファより多く描画されます。これがあなたの瞬き効果をもたらす理由です。

ソリューション

変更resetPathあなたがそれをリセットする前に二回のパスを描くことができるように、整数です。

private int resetPath = 0; 

...else if(event.getAction() == MotionEvent.ACTION_UP){ 
      resetPath = 2; 
    }... 

public void onDraw(Canvas canvas) { 
    canvas.drawPath(path, mPaint); 
    if (resetPath == 1) { 
     path.reset(); 
     resetPath = 0; 
    } else if(resetPath == 2) { 
     resetPath = 1 
    } 
} 
関連する問題