Android图片的拖拽与缩放

来源:互联网 发布:oracle数据库运维方案 编辑:程序博客网 时间:2024/05/03 15:48

Android图片的拖拽与缩放

2014年5月9日 

我们在使用应用当中经常需要浏览图片,比如在微信当中,点击图片之后可以对图片进行缩放。

本博客介绍如何对图片进行拖拽和缩放,这首先要了解Android中的触摸机制了,在屏幕中有手指按下、手指抬起、手指移动还有多个手指触摸的动作。我们要实现对图片的拖拽和缩放就是要基于这些动作来进行逻辑处理。

图片的拖拽主要是计算手指开始的位置与当前手指的位置关系,来进行平移的,具体可以看代码。

图片的缩放就涉及到计算两点之间的距离来得到缩放比,调用矩阵方法来达到缩放的效果。

示例代码:http://download.csdn.net/detail/wwj_748/7324363




package com.wwj.dragscale;import android.app.Activity;import android.graphics.Matrix;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;@Overrideprotected 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; // 中心点@Overridepublic 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;}// 显示缩放后的图片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);}/** * 计算两点之间的中间点 *  * @param event * @return */public static PointF mid(MotionEvent event) {float midX = (event.getX(1) + event.getX(0)) / 2;float midY = (event.getY(1) + event.getY(0)) / 2;return new PointF(midX, midY);}}




2 1
原创粉丝点击