2012-01-16 112 views
2

我有问题在画布上绘制缩放和变换图像上的线条,以及转换后我能够在图像上绘制线条,但是如果缩放图像(放大或缩小)然后线用手指触摸画出意外的像素。由于我在涂料应用方面的工作,但没有更多关于这方面的知识,所以我需要你的帮助,我在谷歌搜索它,但没有运气,我没有找到任何东西android在画布上缩放和变换图像上画线

这里是图像1st是默认正常工作和第二移动图像工作正常提请线正常

enter image description hereenter image description here

而在第三缩放后的图像上不能正常画画,我的意思是如果从顶部/左上角开始绘制后再行画点是不同于此处

enter image description here

那么,如果你需要的代码说我会编辑的问题

回答

2

确定后,许多实现我得到了这个解决方案。

这是我在的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(默认值),则还原画布第1行,然后画线/在使用手指触摸绘制时间的路径。

这里是我的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 2013-05-14 06:35:50

+0

是的,请发布您的视图类。陷入同样的​​问题! – 2014-05-19 05:55:47