2012-01-16 18 views
2

キャンバス上の拡大縮小され変換された画像に線を引く問題があります。画像上に線を描くことができますが、画像が拡大/縮小されている)その後、指は指でタッチして予期せず線を引いた。私はペイントアプリケーションに取り組んでいますが、これ以上の知識はありませんでしたので、私はあなたの助けが必要ですが、私はgoogleで検索しましたが、何も見つかりませんでしたキャンバス上で縮尺変更された画像上のアンドロイドの描画線

ここは最初の画像ですスタートは左/上隅から引き出す場合はスケーリングされた画像上の第三に、適切に私は意味、描くないその行は、ポイントを集めながら、適切に動作し、第二に正常に動作した画像を移動することは適切

enter image description hereenter image description here

行をして描きましたここのように違う

enter image description here

あなたは、コードのために必要ならば、私はこのためのソリューションを持って、多くの実装後のご質問

答えて

2

[OK]を編集しますそれを言います。ここ

これはonDraw(に描画するための私のコードです)

@Override 
public void onDraw(Canvas canvas) { 
    super.onDraw(canvas); 
    canvas.save(); 
    canvas.translate(mPosX, mPosY); 
    canvas.scale(mScaleFactor, mScaleFactor); 

    canvas.drawBitmap(MoveImageTestActivity.bmp, 0,0,null); 
    if(mScaleFactor!=1.f) 
     canvas.restore(); 

    if(isDrawing) 
     canvas.drawPath(tempPath,get_paint()); 

    if(mScaleFactor==1.f) 
     canvas.restore(); 
} 

キャンバスを復元するためのスケールファクタの値をチェックする必要があります。スケールファクター値がデフォルトで1.fで、画像が動いてから描画ライン/パスの後に復元された場合、スケールファクターが1.f(デフォルト)に等しくなければ、最初にキャンバスを復元し、ライン/指タッチの描画時間を使用してパス。ここ

は私onTouch()コード

@Override 
public boolean onTouchEvent(MotionEvent ev) { 
    mScaleDetector.onTouchEvent(ev); 
    final int action = ev.getAction(); 
    switch (action & MotionEvent.ACTION_MASK) { 
    case MotionEvent.ACTION_DOWN: { 
     final float x = ev.getX(); 
     final float y = ev.getY(); 

     if(isDrawing){ 
      float dx = ev.getX(); 
      float dy = ev.getY();; 

      if(mScaleFactor==1.f){ 
       dx = ev.getX() - mPosX; 
       dy = ev.getY() - mPosY; 
      } 
      tempPath = new Path(); 
      tempPath.moveTo(dx,dy); 
     }else{ 
      mLastTouchX = x; 
      mLastTouchY = y; 
      // Save the ID of this pointer 
      mActivePointerId = ev.getPointerId(0); 
     } 
     break; 
    } 

    case MotionEvent.ACTION_MOVE: { 
     // Find the index of the active pointer and fetch its position 
     if(isDrawing){ 
      float dx = ev.getX(); 
      float dy = ev.getY();; 

      if(mScaleFactor==1.f){ 
       dx = ev.getX() - mPosX; 
       dy = ev.getY() - mPosY; 
      } 
      tempPath.lineTo(dx,dy); 
     }else{ 
      final int pointerIndex = ev.findPointerIndex(mActivePointerId); 
      final float x = ev.getX(pointerIndex); 
      final float y = ev.getY(pointerIndex); 

      final float dx = x - mLastTouchX; 
      final float dy = y - mLastTouchY; 

      mPosX += dx; 
      mPosY += dy; 

      mLastTouchX = x; 
      mLastTouchY = y; 
     } 
     break; 
    } 
    case MotionEvent.ACTION_UP: { 
     points.clear(); 
     mActivePointerId = INVALID_POINTER_ID; 
     break; 
    } 

    case MotionEvent.ACTION_CANCEL: { 
     mActivePointerId = INVALID_POINTER_ID; 
     break; 
    } 

    case MotionEvent.ACTION_POINTER_UP: { 
     if(!isDrawing){ 
      // Extract the index of the pointer that left the touch sensor 
      final int pointerIndex = (action & MotionEvent.ACTION_POINTER_INDEX_MASK) >> MotionEvent.ACTION_POINTER_INDEX_SHIFT; 
      final int pointerId = ev.getPointerId(pointerIndex); 
      if (pointerId == mActivePointerId) { 
       // This was our active pointer going up. Choose a new 
       // active pointer and adjust accordingly. 
       final int newPointerIndex = pointerIndex == 0 ? 1 : 0; 
       mLastTouchX = ev.getX(newPointerIndex); 
       mLastTouchY = ev.getY(newPointerIndex); 
       mActivePointerId = ev.getPointerId(newPointerIndex); 
      } 
     } 
     break; 
    } 
    } 
    invalidate(); 
    return true; 
} 
+0

uはウルビュークラスを投稿することができますか。? – kyogs

+0

はい、表示クラスを投稿してください。同じ問題に悩まされた! –

関連する問題