android 双指缩放 一根手指拿开画面剧变
时间: 2023-06-30 14:09:21 浏览: 101
这个问题通常是由于手指拿开时触摸事件的处理不正确导致的。在双指缩放时,Android会产生多个触摸事件,通常是ACTION_DOWN、ACTION_POINTER_DOWN、ACTION_MOVE、ACTION_POINTER_UP和ACTION_UP。当一根手指拿开时,会触发ACTION_POINTER_UP事件,这时我们需要判断还有多少根手指在屏幕上,如果还有至少一根手指在屏幕上,那么我们应该继续处理缩放事件,如果没有手指在屏幕上了,那么我们需要停止缩放操作。
下面是一个简单的示例代码,可以参考一下:
```java
public class MyView extends View {
private float mScaleFactor = 1.0f;
private float mLastTouchX;
private float mLastTouchY;
private boolean mIsZooming;
public MyView(Context context) {
super(context);
}
public MyView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public MyView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
switch (event.getActionMasked()) {
case MotionEvent.ACTION_DOWN:
mLastTouchX = event.getX();
mLastTouchY = event.getY();
mIsZooming = false;
break;
case MotionEvent.ACTION_POINTER_DOWN:
mIsZooming = true;
break;
case MotionEvent.ACTION_MOVE:
if (mIsZooming && event.getPointerCount() >= 2) {
float distanceX = event.getX(0) - event.getX(1);
float distanceY = event.getY(0) - event.getY(1);
float distance = (float) Math.sqrt(distanceX * distanceX + distanceY * distanceY);
if (mScaleFactor * distance / mLastDistance > 0.1f) {
mScaleFactor *= distance / mLastDistance;
invalidate();
}
mLastDistance = distance;
} else if (!mIsZooming) {
float distanceX = event.getX() - mLastTouchX;
float distanceY = event.getY() - mLastTouchY;
mLastTouchX = event.getX();
mLastTouchY = event.getY();
scrollBy((int) -distanceX, (int) -distanceY);
}
break;
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_POINTER_UP:
if (event.getPointerCount() <= 1) {
mIsZooming = false;
}
break;
default:
break;
}
return true;
}
}
```
在这个示例中,我们使用mIsZooming标志来表示当前是否正在进行缩放操作。在ACTION_POINTER_UP事件中,如果屏幕上只有一根手指,那么我们将这个标志设置为false,表示缩放操作已经结束。
阅读全文