使用多点触控 实现图片的缩放和移动
来源:互联网 发布:腾达路由器mac怎么改 编辑:程序博客网 时间:2024/04/30 08:04
实现的效果如图:
代码如下
public class XImageView extends ImageView { public XImageView(Context context) { super(context); init(); } public XImageView(Context context, @Nullable AttributeSet attrs) { super(context, attrs); init(); } //拖动 private static final int MODE_DRAG = 1; //缩放 private static final int MODE_ZOOM = 2; private int mode; //图像状态矩阵 private Matrix matrix; //记录拖动的一个点 private Point lastPoint; //缩放的上一个参考点距离 private float lastDis; //缩放中心点 private Point center; private void init() { lastPoint = new Point(); center = new Point(); } @Override public boolean onTouchEvent(MotionEvent event) { int action = event.getAction(); switch (action & MotionEvent.ACTION_MASK) { case MotionEvent.ACTION_DOWN: //单个触控点按下 //记录当前的状态 matrix = getImageMatrix(); lastPoint.set((int) event.getX(), (int) event.getY()); mode = MODE_DRAG; break; case MotionEvent.ACTION_POINTER_DOWN: //得到触控点的个数(触控点的下标从0开始) //int count = event.getPointerCount(); //记录缩放中心点 lastDis = getDistance(event); if (lastDis > 10) { mode = MODE_ZOOM; getCenter(event); } break; case MotionEvent.ACTION_MOVE: //触控在屏幕上的过程 switch (mode) { case MODE_DRAG: //得到当前的点 int x = (int) event.getX(); int y = (int) event.getY(); //计算偏移 matrix.postTranslate(x - lastPoint.x, y - lastPoint.y); //记录当前点为下一个移动的参考点 lastPoint.set(x, y); break; case MODE_ZOOM: //处理缩放 float newDis = getDistance(event); if (Math.abs(newDis - lastDis) <= 10) { //旋转 } else if (newDis > 20) { // 计算缩放比例 float sc = newDis / lastDis; matrix.postScale(sc, sc, center.x, center.y); lastDis = newDis; } break; } //改变状态 //setImageMatrix(matrix); //刷新 invalidate(); break; case MotionEvent.ACTION_POINTER_UP: break; case MotionEvent.ACTION_UP: //单个触控点离开 break; } return true; } /** * 获取两个触控点之间的距离 * * @param event * @return */ private float getDistance(MotionEvent event) { return (float) Math.sqrt(Math.pow(event.getX(0) - event.getX(1), 2) + Math.pow(event.getY(0) - event.getY(1), 2)); } /** * 获取缩放中心点 * * @param event */ private void getCenter(MotionEvent event) { int x = (int) ((event.getX(0) + event.getX(1)) / 2); int y = (int) ((event.getY(0) + event.getY(1)) / 2); center.set(x, y); }}
阅读全文
0 0
- 使用多点触控 实现图片的缩放和移动
- Android onTouch 多点触控实现图片移动缩放
- 使用view的OnTouchListener来实现图片的移动和多点触控放大图片
- 图片的多点触控缩放与移动
- 多点触控 实现图片自由缩放
- 实现多点触控图片缩放
- Android-图片预览(自定义ImageView实现图片缩放,多点触控,自由移动)
- 图片处理系列三Android多点触控对图片自由缩放和移动
- 多点触控实现图片移动和放大缩小
- 多点触控实现图片移动和放大缩小
- Android多点触控技术实战,自由地对图片进行缩放和移动
- Android多点触控技术实战,自由地对图片进行缩放和移动
- Android多点触控技术实战,自由地对图片进行缩放和移动
- LruCache之Android多点触控技术实战,自由地对图片进行缩放和移动
- Android多点触控技术实战,自由地对图片进行缩放和移动
- Android多点触控技术实战,自由地对图片进行缩放和移动
- Android多点触控技术实战,自由地对图片进行缩放和移动
- Android多点触控技术实战,自由地对图片进行缩放和移动
- 1065. A+B and C (64bit) (20)
- 网络流二十四题之一 飞行员配对问题
- 计算圆的面积和周长
- 翻转链表
- 基于JSP实现字母+数字随机验证码
- 使用多点触控 实现图片的缩放和移动
- Microsoft Excel函数总结
- 数据结构实验之链表一:顺序建立链表
- Unity3D面试题整合——第一部分及答案
- spark,keyValue对RDDs
- MCCP问题( Minimum color cut problem)
- 了解undefined、null、NaN的区别
- Java SE(七)——IO文件
- 机器学习算法与Python实践之(五)k均值聚类(k-means)