Android 图片双指缩放 单指拖拽 、拖到边界回弹
时间: 2023-06-15 22:03:54 浏览: 90
实现图片的双指缩放和单指拖拽可以通过使用Android中的GestureDetector 和 ScaleGestureDetector这两个类来完成。
首先,在你的Activity中,你需要创建一个GestureDetector和ScaleGestureDetector的实例,并重写onTouch方法来接收触摸事件。
```java
public class MainActivity extends Activity implements View.OnTouchListener {
private GestureDetector mGestureDetector;
private ScaleGestureDetector mScaleDetector;
private ImageView mImageView;
private float mScaleFactor = 1.f;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mGestureDetector = new GestureDetector(this, new MyGestureListener());
mScaleDetector = new ScaleGestureDetector(this, new MyScaleListener());
mImageView = (ImageView) findViewById(R.id.imageView);
mImageView.setOnTouchListener(this);
}
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
mGestureDetector.onTouchEvent(motionEvent);
mScaleDetector.onTouchEvent(motionEvent);
return true;
}
private class MyGestureListener extends GestureDetector.SimpleOnGestureListener {
@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
// 处理图片的拖拽操作
mImageView.setTranslationX(mImageView.getTranslationX() - distanceX);
mImageView.setTranslationY(mImageView.getTranslationY() - distanceY);
return true;
}
}
private class MyScaleListener extends ScaleGestureDetector.SimpleOnScaleGestureListener {
@Override
public boolean onScale(ScaleGestureDetector detector) {
// 处理图片的缩放操作
mScaleFactor *= detector.getScaleFactor();
mScaleFactor = Math.max(0.1f, Math.min(mScaleFactor, 10.0f));
mImageView.setScaleX(mScaleFactor);
mImageView.setScaleY(mScaleFactor);
return true;
}
}
}
```
在MyGestureListener中,我们实现了onScroll方法来处理图片的拖拽操作。我们通过计算两次触摸事件之间的距离,来调整ImageView的translationX和translationY属性,从而实现图片的拖拽操作。
在MyScaleListener中,我们实现了onScale方法来处理图片的缩放操作。我们通过获取ScaleGestureDetector的getScaleFactor方法来计算缩放因子,然后调整ImageView的scaleX和scaleY属性,从而实现图片的缩放操作。
最后,为了实现拖到边界时的回弹效果,你可以在onScroll方法中添加一些边界检查的代码,如果ImageView的位置超出了屏幕边界,就将它移动回边界。例如:
```java
private class MyGestureListener extends GestureDetector.SimpleOnGestureListener {
@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
// 处理图片的拖拽操作
float newX = mImageView.getTranslationX() - distanceX;
float newY = mImageView.getTranslationY() - distanceY;
float maxX = mImageView.getWidth() * (mImageView.getScaleX() - 1) / 2;
float maxY = mImageView.getHeight() * (mImageView.getScaleY() - 1) / 2;
if (newX > maxX) newX = maxX;
if (newX < -maxX) newX = -maxX;
if (newY > maxY) newY = maxY;
if (newY < -maxY) newY = -maxY;
mImageView.setTranslationX(newX);
mImageView.setTranslationY(newY);
return true;
}
}
```
在这个例子中,我们计算了ImageView在X轴和Y轴上的最大偏移量,然后在每次拖拽操作时,检查ImageView的位置是否超出了这个范围,如果超出了,就将它移动回边界。