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);}}
- Android开发:对图片的手势操作——旋转、缩放、移动
- android中手势操作图片的平移、缩放、旋转
- android中手势操作图片的平移、缩放、旋转
- android中手势操作图片的平移、缩放、旋转
- Android之关于手势操作图片的缩放与移动
- 使用手势UIGestureRecognizer对图像进行缩放、移动、旋转操作
- iOS开发:使用手势UIGestureRecognizer对图像进行缩放、移动、旋转操作
- UNITY移动平台上的手势操作——旋转、缩放
- 自定义控件: android中手势操作图片的平移、缩放、旋转 并保存
- iOS开发之图片操作,移动,旋转,缩放实例演示
- iOS开发笔记之二十七——UIImage图片的移动、旋转、缩放和裁剪
- iOS 使用手势UIGestureRecognizer对图像进行缩放、移动、旋转操作
- iOS 使用手势UIGestureRecognizer对图像进行缩放、移动、旋转等操作
- iOS 使用手势UIGestureRecognizer对图像进行缩放、移动、旋转等操作
- iOS 使用手势UIGestureRecognizer对图像进行缩放、移动、旋转操作
- iOS 使用手势UIGestureRecognizer对图像进行缩放、移动、旋转操作
- Android对图片进行平移,缩放,旋转操作
- Android对图片进行平移,缩放,旋转操作
- 创建SvcHost.exe调用的服务原理与实践(1)
- C# Excel导入的几种方法
- VIMRC-我喜欢的
- UISearchBar背景透明,去掉背景,自定义背景
- 创建SvcHost.exe调用的服务原理与实践(2)
- Android开发:对图片的手势操作——旋转、缩放、移动
- Android游戏开发之横竖屏的切换
- C# OleDb读取Excel异常:外部表不是预期的格式 解决方案
- drawable文件夹详解
- ffmpeg中available encoder
- Rockmongo 查询条件总结
- 八年
- swing中通过.class文件(把.java都删除)打包成jar文件,使用皮肤包遇到的问题。
- poj 2234 尼姆博弈