android 坐标绘图 缩放,在缩放/缩小或拖放到Android后获取画布坐标

我正在开发一个应用程序,我在其中粘贴图像,在画布上绘制和绘画.此应用程序还可以向上/向下缩放画布或将其拖动到不同的位置.

我的问题是:在缩放或拖动画布后,无法获得正确的画布坐标.画布缩放或拖动后,我想绘制手指油漆,但无法检索正确的地方,我已经感动了.. 🙁

我也是新的蜜蜂这是代码.

@Override

public void onDraw(Canvas canvas) {

super.onDraw(canvas);

canvas.save();

//canvas.translate(mPosX, mPosY);

canvas.scale(mScaleFactor, mScaleFactor, super.getWidth() * 0.5f,

super.getHeight() * 0.5f);

mIcon.draw(canvas);

for (Path path : listPath) {

canvas.drawPath(path, paint);

}

canvas.restore();

}

public TouchExampleView(Context context, AttributeSet attrs, int defStyle) {

super(context, attrs, defStyle);

}

@Override

public boolean onTouchEvent(MotionEvent ev) {

// Let the ScaleGestureDetector inspect all events.

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();

mLastTouchX = x;

mLastTouchY = y;

mActivePointerId = ev.getPointerId(0);

break;

}

case MotionEvent.ACTION_MOVE: {

final int pointerIndex = ev.findPointerIndex(mActivePointerId);

final float x = ev.getX(pointerIndex);

final float y = ev.getY(pointerIndex);

// Only move if the ScaleGestureDetector isn't processing a gesture.

if (!mScaleDetector.isInProgress()) {

final float dx = x - mLastTouchX;

final float dy = y - mLastTouchY;

mPosX += dx;

mPosY += dy;

invalidate();

}

mLastTouchX = x;

mLastTouchY = y;

break;

}

case MotionEvent.ACTION_UP: {

mActivePointerId = INVALID_POINTER_ID;

break;

}

case MotionEvent.ACTION_CANCEL: {

mActivePointerId = INVALID_POINTER_ID;

break;

}

case MotionEvent.ACTION_POINTER_UP: {

final int pointerIndex = (ev.getAction() & 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;

}

}

float objectNewX,objectNewY;

if (mScaleFactor >= 1) {

objectNewX = ev.getX() + (ev.getX() - super.getWidth() * 0.5f) * (mScaleFactor - 1);

objectNewY = ev.getY() + (ev.getY() - super.getHeight() * 0.5f) * (mScaleFactor - 1);

} else {

objectNewX = ev.getX() - (ev.getX() - super.getWidth() * 0.5f) * (1 - mScaleFactor);

objectNewY = ev.getY() - (ev.getY() - super.getHeight() * 0.5f) * (1 - mScaleFactor);

}

if (ev.getAction() == MotionEvent.ACTION_DOWN) {

path = new Path();

path.moveTo(objectNewX,objectNewY);

path.lineTo(objectNewX,objectNewY);

} else if (ev.getAction() == MotionEvent.ACTION_MOVE) {

path.lineTo(objectNewX,objectNewY);

listPath.add(path);

} else if (ev.getAction() == MotionEvent.ACTION_UP) {

path.lineTo(objectNewX,objectNewY);

listPath.add(path);

}

return true;

}

private class ScaleListener extends

ScaleGestureDetector.SimpleOnScaleGestureListener {

@Override

public boolean onScale(ScaleGestureDetector detector) {

mScaleFactor *= detector.getScaleFactor();

// Don't let the object get too small or too large.

mScaleFactor = Math.max(0.1f, Math.min(mScaleFactor, 5.0f));

invalidate();

return true;

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值