Android 使用缩放和暗线绘制路径
我正在开发一个应用程序,我在其中粘贴图像,在画布上画画。此应用程序还可以放大/缩小画布或将其拖动到不同的位置。我的问题是:缩放或拖动画布后,无法获得正确的画布坐标。我想在画布缩放或拖动后绘制手指绘画,但无法检索到我触摸过的正确位置Android 使用缩放和暗线绘制路径,android,bitmap,android-canvas,drawing2d,pinchzoom,Android,Bitmap,Android Canvas,Drawing2d,Pinchzoom,我正在开发一个应用程序,我在其中粘贴图像,在画布上画画。此应用程序还可以放大/缩小画布或将其拖动到不同的位置。我的问题是:缩放或拖动画布后,无法获得正确的画布坐标。我想在画布缩放或拖动后绘制手指绘画,但无法检索到我触摸过的正确位置 @Override public boolean onTouchEvent(MotionEvent event) { scaleListener.onTouchEvent(event); synchronized(thread.getSurface
@Override
public boolean onTouchEvent(MotionEvent event) {
scaleListener.onTouchEvent(event);
synchronized(thread.getSurfaceHolder()){
switch ( event.getAction() & MotionEvent.ACTION_MASK ){
case MotionEvent.ACTION_DOWN :
// Remember our initial down event location.
savedMatrix.set(m_matrix);
start.set(event.getX() , event.getY());
mode = DRAG;
break;
case MotionEvent.ACTION_POINTER_DOWN :
oldDist = spacing(event);
if (oldDist > 10f) {
savedMatrix.set(m_matrix);
m_matrix.getValues(matrixValues);
midPoint(mid, event);
mode = ZOOM;
}
break;
case MotionEvent.ACTION_UP :
case MotionEvent.ACTION_POINTER_UP :
mode = NONE;
break;
case MotionEvent.ACTION_MOVE :
if(mode==DRAG && isDragAllowd){
m_matrix.set(savedMatrix);
rebound(event.getX() , event.getY());
}
else if(mode==ZOOM){
float newDist = spacing(event);
if (newDist > 10f){
m_matrix.set(savedMatrix);
float scale = newDist/oldDist;
m_matrix.getValues(matrixValues);
float currentScale = matrixValues[Matrix.MSCALE_X];
// limit zoom
if (scale * currentScale > maxZoom){
scale = maxZoom / currentScale;
//scale = maxZoom;
}
else if (scale * currentScale < minZoom){
scale = minZoom / currentScale;
//scale = minZoom;
}
m_matrix.postScale(scale, scale, mid.x, mid.y);
m_matrix.getValues(matrixValues);
}
}
break;
}
return true; //done with this event so consume it
}
}
@Override
protected void onDraw(Canvas canvas){
super.onDraw(canvas);
canvas.drawColor(Color.WHITE);
canvas.drawBitmap(currentBitmap, m_matrix, null);
c2.drawColor(Color.BLACK);
commandManager.executeAll(c2); // Drawing all the Paints on Canvas c2
// Overlay bitmap it's a transparent layour
canvas.drawBitmap(overlayBitmap, 0, 0, pTouch);
@覆盖
公共布尔onTouchEvent(运动事件){
scaleListener.onTouchEvent(事件);
已同步(thread.getSurfaceHolder()){
开关(event.getAction()&MotionEvent.ACTION\u掩码){
case MotionEvent.ACTION\u DOWN:
//记住我们最初的下降事件位置。
savedMatrix.set(m_矩阵);
set(event.getX(),event.getY());
模式=拖动;
打破
case MotionEvent.ACTION\u指针\u向下:
oldDist=间距(事件);
如果(旧区>10f){
savedMatrix.set(m_矩阵);
m_矩阵。获取值(矩阵值);
中点(中点,事件);
模式=缩放;
}
打破
case MotionEvent.ACTION\u UP:
case MotionEvent.ACTION\u指针\u向上:
模式=无;
打破
case MotionEvent.ACTION\u移动:
如果(模式==拖动(&isDragAllowd){
m_矩阵集(savedMatrix);
反弹(event.getX(),event.getY());
}
else if(模式==缩放){
float newDist=间距(事件);
如果(新距离>10f){
m_矩阵集(savedMatrix);
浮动比例=新距离/旧距离;
m_矩阵。获取值(矩阵值);
float currentScale=矩阵值[Matrix.MSCALE_X];
//极限变焦
如果(缩放*当前缩放>最大缩放){
比例=最大缩放/当前比例;
//比例=最大缩放;
}
else if(缩放*当前缩放<最小缩放){
比例=最小缩放/当前比例;
//比例=最小缩放;
}
m_矩阵。后标度(标度、标度、中x、中y);
m_矩阵。获取值(矩阵值);
}
}
打破
}
return true;//此事件已完成,请使用它
}
}
@凌驾
受保护的void onDraw(画布){
super.onDraw(帆布);
画布。drawColor(颜色。白色);
drawBitmap(currentBitmap,m_矩阵,null);
c2.drawColor(颜色:黑色);
commandManager.executeAll(c2);//在画布c2上绘制所有绘制
//叠加位图这是一个透明的布局
drawBitmap(overlayBitmap,0,0,pTouch);
}
当用户缩放位图时,他无法在其上绘制,在缩放后,绘制不会在适当的位置发生。使用以下方程式转换点,之后用户将不会在缩放期间或滚动后遇到任何绘制困难
float f1 = (( motionEvent.getX() - m_transformedPoints[0] )/( m_transformedPoints[2] - m_transformedPoints[0] ))*currentBitmapWidth;
float f2 = (( motionEvent.getY() - m_transformedPoints[1] )/( m_transformedPoints[3] - m_transformedPoints[1] ))*currentBitmapHeight;
//calculate the transformed view in onDraw Method
this.m_transformedPoints[0] = 0.0F;
this.m_transformedPoints[1] = 0.0F;
this.m_transformedPoints[2] = currentBitmapWidth;
this.m_transformedPoints[3] = currentBitmapHeight;
this.m_matrix.mapPoints(this.m_transformedPoints);
请帮我解决上面的问题。嗨,Strike,你能分享缩放图像和绘画的代码吗?m_transformedPoints是什么?