我正在开发一个安卓应用程序(API 19 4.4),并且在ImageViews上遇到了一些问题。我有一个SurfaceView,在其中动态添加ImageViews,我希望它们能够对触摸事件做出反应。到目前为止,我已经成功地使ImageView平滑移动和缩放,但是我有一个令人讨厌的行为。
当我将图像缩小到一定限度(我会说是原始大小的一半)并尝试移动它时,图像会闪烁。经过简短的分析,似乎它在手指在屏幕上的位置对称地切换其位置,累积距离,最终消失在视线之外(所有这些都发生得非常快(<1s)。我认为我在触摸事件相对于ImageView / SurfaceView的相对值方面存在问题,但我是个新手,陷入了困境...
以下是我的代码:
当我将图像缩小到一定限度(我会说是原始大小的一半)并尝试移动它时,图像会闪烁。经过简短的分析,似乎它在手指在屏幕上的位置对称地切换其位置,累积距离,最终消失在视线之外(所有这些都发生得非常快(<1s)。我认为我在触摸事件相对于ImageView / SurfaceView的相对值方面存在问题,但我是个新手,陷入了困境...
以下是我的代码:
public class MyImageView extends ImageView {
private ScaleGestureDetector mScaleDetector ;
private static final int MAX_SIZE = 1024;
private static final String TAG = "MyImageView";
PointF DownPT = new PointF(); // Record Mouse Position When Pressed Down
PointF StartPT = new PointF(); // Record Start Position of 'img'
public MyImageView(Context context) {
super(context);
mScaleDetector = new ScaleGestureDetector(context,new MySimpleOnScaleGestureListener());
setBackgroundColor(Color.RED);
setScaleType(ScaleType.MATRIX);
setAdjustViewBounds(true);
RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT);
lp.setMargins(-MAX_SIZE, -MAX_SIZE, -MAX_SIZE, -MAX_SIZE);
this.setLayoutParams(lp);
this.setX(MAX_SIZE);
this.setY(MAX_SIZE);
}
int firstPointerID;
boolean inScaling=false;
@Override
public boolean onTouchEvent(MotionEvent event) {
// get pointer index from the event object
int pointerIndex = event.getActionIndex();
// get pointer ID
int pointerId = event.getPointerId(pointerIndex);
//First send event to scale detector to find out, if it's a scale
boolean res = mScaleDetector.onTouchEvent(event);
if (!mScaleDetector.isInProgress()) {
int eid = event.getAction();
switch (eid & MotionEvent.ACTION_MASK)
{
case MotionEvent.ACTION_MOVE :
if(pointerId == firstPointerID) {
PointF mv = new PointF( (int)(event.getX() - DownPT.x), (int)( event.getY() - DownPT.y));
this.setX((int)(StartPT.x+mv.x));
this.setY((int)(StartPT.y+mv.y));
StartPT = new PointF( this.getX(), this.getY() );
}
break;
case MotionEvent.ACTION_DOWN : {
firstPointerID = pointerId;
DownPT.x = (int) event.getX();
DownPT.y = (int) event.getY();
StartPT = new PointF( this.getX(), this.getY() );
break;
}
case MotionEvent.ACTION_POINTER_DOWN: {
break;
}
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_POINTER_UP:
case MotionEvent.ACTION_CANCEL: {
firstPointerID = -1;
break;
}
default :
break;
}
return true;
}
return true;
}
public boolean onScaling(ScaleGestureDetector detector) {
this.setScaleX(this.getScaleX()*detector.getScaleFactor());
this.setScaleY(this.getScaleY()*detector.getScaleFactor());
invalidate();
return true;
}
private class MySimpleOnScaleGestureListener extends SimpleOnScaleGestureListener {
@Override
public boolean onScale(ScaleGestureDetector detector) {
return onScaling(detector);
}
@Override
public boolean onScaleBegin(ScaleGestureDetector detector) {
Log.d(TAG, "onScaleBegin");
return true;
}
@Override
public void onScaleEnd(ScaleGestureDetector arg0) {
Log.d(TAG, "onScaleEnd");
}
}
我还有另一个关于旋转的问题。我应该如何实现它? 我能否以某种方式使用ScalegestureDetector,或者必须在视图触摸事件中进行操作?我希望能够在同一手势中缩放和旋转(在另一个手势中移动)。
谢谢您的帮助,我将不胜感激!
对不起,我的英语不好。