你的位置:首页 > 信息动态 > 新闻中心
信息动态
联系我们

Android图片的拖拽与缩放,移动端混合开发技术

2021/12/17 15:44:08

import android.graphics.PointF;

import android.os.Bundle;

import android.util.FloatMath;

import android.view.MotionEvent;

import android.view.View;

import android.view.View.OnTouchListener;

import android.widget.ImageView;

/**

  • 对图片进行拖拽和缩放

  • @author wwj

*/

public class MainActivity extends Activity {

private ImageView imageView;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

imageView = (ImageView) findViewById(R.id.imageView);

imageView.setOnTouchListener(new TouchListener());

}

private class TouchListener implements OnTouchListener {

private PointF startPoint = new PointF();

private Matrix matrix = new Matrix();

private Matrix currentMaritx = new Matrix();

private int mode = 0; // 用于标记模式

private static final int DRAG = 1; // 拖动

private static final int ZOOM = 2; // 放大

private float startDis = 0;

private PointF midPoint; // 中心点

@Override

public boolean onTouch(View v, MotionEvent event) {

switch (event.getAction() & MotionEvent.ACTION_MASK) {

case MotionEvent.ACTION_DOWN:

mode = DRAG; // 拖拽

currentMaritx.set(imageView.getImageMatrix()); // 记录ImageView当前移动位置

startPoint.set(event.getX(), event.getY()); // 开始点

break;

case MotionEvent.ACTION_MOVE:// 移动事件

if (mode == DRAG) { // 图片拖动事件

float dx = event.getX() - startPoint.x; // x轴移动距离

float dy = event.getY() - startPoint.y;

matrix.set(currentMaritx); // 在当前的位置基础上移动

matrix.postTranslate(dx, dy);

} else if (mode == ZOOM) { // 图片放大事件

float endDis = distance(event); // 结束距离

if (endDis > 10f) {

float scale = endDis / startDis; // 放大倍数

matrix.set(currentMaritx);

matrix.postScale(scale, scale, midPoint.x, midPoint.y);

}

}

break;

case MotionEvent.ACTION_UP:

mode = 0;

break;

// 有手指离开屏幕,但屏幕还有触点(手指)

case MotionEvent.ACTION_POINTER_UP:

mode = 0;

break;

// 当屏幕上已经有触点(手指),再有一个手指压下屏幕

case MotionEvent.ACTION_POINTER_DOWN:

mode = ZOOM;

startDis = distance(event);

if (startDis > 10f) { // 避免手指上有两个

midPoint = mid(event);

currentMaritx.set(imageView.getImageMatrix()); // 记录当前的缩放倍数

}

break;

}

// 显示缩放后的图片

《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》

【docs.qq.com/doc/DSkNLaERkbnFoS0ZF】 完整内容开源分享

imageView.setImageMatrix(matrix);

return true;

}

}

/**

  • 计算两点之间的距离

  • @param event

  • @return

*/

public static float distance(MotionEvent event) {

float dx = event.getX(1) - event.getX(0);

float dy = event.getY(1) - event.getY(0);

return FloatMath.sqrt(dx * dx + dy * dy);

}