Android开发:对图片的手势操作——旋转、缩放、移动

来源:互联网 发布:男士整容知乎 编辑:程序博客网 时间:2024/06/02 20:15

以下代码经过测试,如有问题,请留言!

activity_main.xml文件:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:paddingBottom="@dimen/activity_vertical_margin"    android:paddingLeft="@dimen/activity_horizontal_margin"    android:paddingRight="@dimen/activity_horizontal_margin"    android:paddingTop="@dimen/activity_vertical_margin"    tools:context=".MainActivity" >    <TextView        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:text="@string/hello_world" />    <LinearLayout        android:layout_width="fill_parent"        android:layout_height="fill_parent" >        <ImageView            android:id="@+id/imageview"            android:layout_width="match_parent"            android:layout_height="match_parent"            android:contentDescription="@string/app_name"            android:scaleType="matrix"            android:src="@drawable/image" />    </LinearLayout></RelativeLayout>

java文件:


import android.app.Activity;import android.graphics.Matrix;import android.graphics.PointF;import android.os.Bundle;import android.util.FloatMath;import android.util.Log;import android.view.MotionEvent;import android.view.View;import android.view.View.OnTouchListener;import android.widget.ImageView;public class PictureRotate extends Activity {private ImageView imageView;@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);imageView = (ImageView) this.findViewById(R.id.imageview);imageView.setOnTouchListener(new TouchListener());}private final class TouchListener implements OnTouchListener {private PointF startPoint = new PointF();private Matrix matrix = new Matrix();private Matrix currentMatrix = new Matrix();private int mode = 0;private static final int DRAG = 1;private static final int ZOOM = 2;private float startDis;// 开始距离private PointF midPoint;// 中间点private double startAngle;// 开始角度public boolean onTouch(View v, MotionEvent event) {switch (event.getAction() & MotionEvent.ACTION_MASK) {case MotionEvent.ACTION_DOWN:// 手指压下屏幕Log.e("onTouch", "ACTION_DOWN");mode = DRAG;currentMatrix.set(imageView.getImageMatrix());// 记录ImageView当前的移动位置startPoint.set(event.getX(), event.getY());break;case MotionEvent.ACTION_MOVE:// 手指在屏幕移动,该 事件会不断地触发// Log.e("onTouch", "ACTION_MOVE");if (mode == DRAG) {float dx = event.getX() - startPoint.x;// 得到在x轴的移动距离float dy = event.getY() - startPoint.y;// 得到在y轴的移动距离matrix.set(currentMatrix);// 在没有进行移动之前的位置基础上进行移动matrix.postTranslate(dx, dy);} else if (mode == ZOOM) {// 缩放float endDis = distance(event);// 结束距离int trunAngel = (int) (angle(event) - startAngle);// 变化的角度// Log.v("ACTION_MOVE", "trunAngel="+trunAngel);if (endDis > 10f) {float scale = endDis / startDis;// 得到缩放倍数matrix.set(currentMatrix);matrix.postScale(scale, scale, midPoint.x, midPoint.y);Log.v("ACTION_MOVE", "imageView.getHeight()="+ imageView.getHeight());Log.v("ACTION_MOVE", "imageView.getWidth()="+ imageView.getWidth());if (Math.abs(trunAngel) > 5) {// 设置变化的角度matrix.postRotate(trunAngel, midPoint.x, midPoint.y);}}}break;case MotionEvent.ACTION_UP:// 手指离开屏// Log.e("onTouch", "ACTION_UP");break;case MotionEvent.ACTION_POINTER_UP:// 有手指离开屏幕,但屏幕还有触点(手指)// Log.e("onTouch", "ACTION_POINTER_UP");mode = 0;break;case MotionEvent.ACTION_POINTER_DOWN:// 当屏幕上还有触点(手指),再有一个手指压下屏幕// Log.e("onTouch", "ACTION_POINTER_DOWN");mode = ZOOM;startDis = distance(event);startAngle = angle(event);if (startDis > 10f) {midPoint = mid(event);currentMatrix.set(imageView.getImageMatrix());// 记录ImageView当前的缩放倍数}break;}// Bitmap// bitmap0=((BitmapDrawable)getResources().getDrawable(R.drawable.test2)).getBitmap();// LayerDrawable layerDrawable=LayerDrawable.// Bitmap bitmap=Bitmap.createBitmap(bitmap0, x, y, width, height,// m, filter)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);}/** * 计算两个手指连线与坐标轴的角度(单位为。C) *  * @param event * @return */public static double angle(MotionEvent event) {double delta_x = (event.getX(0) - event.getX(1));double delta_y = (event.getY(0) - event.getY(1));double radians = Math.atan2(delta_y, delta_x);return (float) Math.toDegrees(radians);}}


原创粉丝点击