最初版本参考:https://www.itcodemonkey.com/article/6238.html
第二版 参考:https://blog.csdn.net/lpcrazyboy/article/details/80777112
第二版ontouch和onclick冲突处理参考:https://blog.csdn.net/nihaoqiulinhe/article/details/51556103
最终版参考:https://blog.csdn.net/dpl12/article/details/78160993或者我的文章 android图片缩放photoview也可以
java 代码
public class OtherActivityextends Activityimplements View.OnTouchListener{
// private MyImageView imageView;
// 縮放控制
private Matrixmatrix =new Matrix();
private MatrixsavedMatrix =new Matrix();
// 不同状态的表示:
private static final int NONE =0;
private static final int DRAG =1;
private static final int ZOOM =2;
private int mode =NONE;
// 定义第一个按下的点,两只接触点的重点,以及出事的两指按下的距离:
private PointFstartPoint =new PointF();
private PointFmidPoint =new PointF();
private float oriDis =1f;
boolean is =true;
private int firstX;
private int secondX;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.requestWindowFeature(Window.FEATURE_NO_TITLE);
this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
setContentView(R.layout.other);
imageView = findViewById(R.id.imageView2);
Intent intent = getIntent();
String content = intent.getStringExtra("photo");
Glide.with(this)
.load(content)
.into(imageView);
imageView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
// 注意这里不使用finish
ActivityCompat.finishAfterTransition(OtherActivity.this);
}
});
// imageView.setOnTouchListener(this);
}
// 计算两个触摸点之间的距离
private float distance(MotionEvent event) {
float x = event.getX(0) - event.getX(1);
float y = event.getY(0) - event.getY(1);
return Float.valueOf(String.valueOf(Math.sqrt(x * x + y * y)));
}
// 计算两个触摸点的中点
private PointFmiddle(MotionEvent event) {
float x = event.getX(0) + event.getX(1);
float y = event.getY(0) + event.getY(1);
return new PointF(x /2, y /2);
}
@Override
public boolean onTouch(View v, MotionEvent event) {
ImageView view = (ImageView) v;
switch (event.getAction() & MotionEvent.ACTION_MASK) {
// 单指
//表示按下了屏幕,第一个执行也是必然执行的方法。
case MotionEvent.ACTION_DOWN:
firstX = (int) event.getX();//按下的时候开始的x的位置
// if (event.getAction() == MotionEvent.ACTION_DOWN){
// is = false;
// }else {
matrix.set(view.getImageMatrix());
savedMatrix.set(matrix);
startPoint.set(event.getX(), event.getY());
mode =DRAG;
// }
break;
// 双指
case MotionEvent.ACTION_POINTER_DOWN:
oriDis = distance(event);
if (oriDis >10f) {
savedMatrix.set(matrix);
midPoint = middle(event);
mode =ZOOM;
}
break;
// 手指放开
//表示为离开屏幕,触摸停止的时候执行。
case MotionEvent.ACTION_UP:
secondX = (int)event.getX();//up的时候x的位置
int distance =secondX -firstX;
if (distance ==0) {
//当没有变化的时候什么都不做
is =false;
}else {
//执行move滑动后的操作
is =true;
}
break;
case MotionEvent.ACTION_POINTER_UP:
mode =NONE;
break;
// 单指滑动事件
//表示为移动手势,会不断的执行直到触摸停止。
case MotionEvent.ACTION_MOVE:
if (mode ==DRAG) {
// 是一个手指拖动
matrix.set(savedMatrix);
matrix.postTranslate(event.getX() -startPoint.x, event.getY() -startPoint.y);
}else if (mode ==ZOOM) {
// 两个手指滑动
float newDist = distance(event);
if (newDist >10f) {
matrix.set(savedMatrix);
float scale = newDist /oriDis;
matrix.postScale(scale, scale, midPoint.x, midPoint.y);
}
}
break;
}
// 设置ImageView的Matrix
view.setImageMatrix(matrix);
return is;
}
}
布局
布局有缺点
主要是横版图片放得太大主要是没有边界控制
竖版图片还好
没有回弹效果
放大和缩小没有控制在一定范围内
网友评论