Android开发:对图片的手势操作——旋转、缩放、移动
2013-05-16 16:04
766 查看
以下代码经过测试,如有问题,请留言!
activity_main.xml文件:
java文件:
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; @Override public 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图片的操作,判断方向,旋转,根据uri获取绝对路径,缩放与移动
- Bitmap位图渲染与操作(图片移动,放大,缩小,旋转,镜像发转)--android游戏开发
- 自定义控件: android中手势操作图片的平移、缩放、旋转 并保存
- Android之关于手势操作图片的缩放与移动
- android中手势操作图片的平移、缩放、旋转
- iOS开发:使用手势UIGestureRecognizer对图像进行缩放、移动、旋转操作
- Android之关于手势操作图片的缩放与移动
- android中手势操作图片的平移、缩放、旋转
- iOS开发之图片操作,移动,旋转,缩放实例演示
- android开发步步为营之83:android图片处理技术之二(通过Matrix移动缩放旋转错切)
- android中手势操作图片的平移、缩放、旋转
- 【Android】自定义ImageView实现图片的平移、缩放、旋转(手势操作)
- Android matrix 控制图片的旋转、缩放、移动
- android 手机拍照上传项目的开发-----Camera1.2(图片文件的翻转及缩放操作)
- iOS用三个手势和仿射变换实现图片的旋转缩放移动效果(类iBooks教科书)
- Android对图片进行平移,缩放,旋转操作
- Android单点触控技术,对图片进行平移,缩放,旋转操作
- web手势库AlloyFinger运用( 控制CANVAS中图片移动、缩放、旋转)
- ios开发--旋转、移动、缩放手势实例代码
- iOS 使用手势UIGestureRecognizer对图像进行缩放、移动、旋转等操作