Android SDK – 触摸中心不缩放

我的应用程序有点问题。 我刚刚实施了捏放大,但是当我捏缩放,图像不会缩放在2点的中心,如下图所示。 图像1是我的手指在捏之前的位置,图像2是显示它没有缩放在我的手指的中心,就像它应该。

图片1 vs图片2:
此搜索图像2

这是我的代码:

package com.jpiionefourone.guitarimage; import android.content.Context; import android.graphics.Canvas; import android.graphics.drawable.Drawable; import android.util.AttributeSet; import android.view.MotionEvent; import android.view.ScaleGestureDetector; import android.view.View; public class MultiTouchView extends View { private Drawable mIcon; private float mPosX; private float mPosY; private float mLastTouchX; private float mLastTouchY; private static final int INVALID_POINTER_ID = -1; // The 'active pointer' is the one currently moving our object. private int mActivePointerId = INVALID_POINTER_ID; private ScaleGestureDetector mScaleDetector; private float mScaleFactor = 1.f; public MultiTouchView(Context context) { this(context, null, 0); } public MultiTouchView(Context context, AttributeSet attrs) { this(context, attrs, 0); } public MultiTouchView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); mIcon = context.getResources().getDrawable(R.drawable.guitar); mIcon.setBounds(0, 0, mIcon.getIntrinsicWidth(), mIcon.getIntrinsicHeight()); // Create our ScaleGestureDetector mScaleDetector = new ScaleGestureDetector(context, new ScaleListener()); } @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; } } return true; } @Override public void onDraw(Canvas canvas) { super.onDraw(canvas); canvas.save(); canvas.translate(mPosX, mPosY); canvas.scale(mScaleFactor, mScaleFactor); mIcon.draw(canvas); canvas.restore(); } 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; } } } 

谢谢,

贾里德

Solutions Collecting From Web of "Android SDK – 触摸中心不缩放"

在你的ScaleListener类中,你只调整mScaleFactor所以你的图像确实不会在你的多点触摸手势的中心放大!

此外,您需要更新mPosXmPosY以使用不同的缩放中心。

对于我自己的一个应用程序,我使用了这样的东西:

 final float scale = detector.getScaleFactor(); mScaleFactor = Math.max(0.1f, Math.min(mScaleFactor * scale, 5.0f)); if (mScaleFactor < 5f) { // 1 Grabbing final float centerX = detector.getFocusX(); final float centerY = detector.getFocusY(); // 2 Calculating difference float diffX = centerX - mPosX; float diffY = centerY - mPosY; // 3 Scaling difference diffX = diffX * scale - diffX; diffY = diffY * scale - diffY; // 4 Updating image origin mPosX -= diffX; mPosY -= diffY; } 

基本上,它通过计算图像原点的相对变化

  1. 抓住你的多点触摸手势的起源( getFocus()
  2. 计算你的图像原点( diffXdiffY
  3. 应用比例因子
  4. 并通过使用缩放的差异来更新图像的原点

这(仍然)适用于我的情况。 我不知道我们是否都使用(d)相同的坐标系,但是像这样的东西可以帮助您正确缩放多点触摸手势中心的图像。

我花了很长时间才得到这个工作..但是,感谢几乎工作的代码! 我不知道是我只是搞乱或什么,但在这个代码中的变化,我得到了我想要的缩放工作! 希望这会安全的时间。

 mScaleFactor *= detector.getScaleFactor(); mScaleFactor = Math.max(0.5f, Math.min(mScaleFactor, 3.0f)); scale = mScaleFactor / scaleAtm mTranslateMatrix.preTranslate(diffX, diffY); mTranslateMatrix.invert(mTranslateMatrixInverse); mPosX += diffX; mPosY += diffY; scaleAtm = mScaleFactor; 

在开始scaleAtm = 1。