public class MainActivity extends Activity { private ImageView operImage; private PointF point = new PointF();//记录手指的位置 private PointF midPoint = new PointF();//记录手指间的中点的位置 private Matrix matrix = new Matrix();//记录拖动和缩放前手指按下的matrix private Matrix newMatrix = new Matrix();//记录手指正在拖动和缩放的matrix private int type = 0;//操作类型 private float pointerDistance;//两个手指的距离 private static final int DRAG = 1;//拖动 private static final int SCALE = 2;//缩放 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); operImage= (ImageView) findViewById(R.id.before); operImage.setOnTouchListener(new OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { int action = event.getAction()&MotionEvent.ACTION_MASK; switch (action) { case MotionEvent.ACTION_DOWN: float startX = event.getX(); float startY = event.getY(); //记录手指的位置 point.set(startX, startY); //得到当前图片的位置 matrix.set(operImage.getImageMatrix()); type = DRAG;//拖动 break; case MotionEvent.ACTION_POINTER_1_DOWN: //记录图片没有缩放前的大小 matrix.set(operImage.getImageMatrix()); //记录两个手指的距离 pointerDistance = getDistance(event); //记录两个手指距离的中点 midPoint= getMidPoint(event); type = SCALE;//缩放 break; case MotionEvent.ACTION_MOVE: switch (type) { case DRAG://拖动 float newX = event.getX(); float newY = event.getY(); newMatrix.set(matrix); float dx = newX - point.x; float dy = newY - point.y; newMatrix.postTranslate(dx, dy); break; case SCALE://缩放 newMatrix.set(matrix); float nowDistance = getDistance(event); //根据此时的两个手指间的距离除以开始的两个手指间的距离计算缩放比 float scale = nowDistance/pointerDistance; //根据中心点进行缩放 newMatrix.postScale(scale, scale, midPoint.x, midPoint.y); break; default: break; } break; case MotionEvent.ACTION_UP: type = 0; break; case MotionEvent.ACTION_POINTER_1_UP: type = 0; break; } operImage.setImageMatrix(newMatrix); return true; } }); } /* * 计算两个手指的中点 */ protected PointF getMidPoint(MotionEvent event) { float x = (event.getX(1) + event.getX(0))/2; float y = (event.getY(1) + event.getY(0))/2; return new PointF(x, y); } /* * 计算两点间的距离 */ protected float getDistance(MotionEvent event) { float x = event.getX(0) - event.getX(1); float y = event.getY(0) - event.getY(1); return FloatMath.sqrt(x*x + y*y); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.main, menu); return true; }} 详细解决方案
Android小应用-图片的拖动、缩放
热度:90 发布时间:2016-04-28 05:36:16.0
相关解决方案
- android 读取byte[]中的元素解决方案
- android 标题栏兑现方式
- android 中Activity向BroadcastReceiver发送数据,该怎么解决
- Android 4.0 为什么模拟器老是提示小弟我谷歌拼音输入法已停止
- android:getSharedPreferences() 这是哪个类的方法解决思路
- android 怎么判断一个程序是否联网
- android RadioButton如何设置默认选中
- android 怎么重新设置锚点
- android 图片对象获取的有关问题
- android 关于服务连接的疑义
- android 怎么实现对view的放大和缩小
- android ID,该如何处理
- 准备复习2-3个月,看java+android,请问有经验者,怎么看效果最好》
- android UI线程与AsyncTask的有关问题
- android(java) 中文乱码的有关问题
- android 动态设立控件高度
- Android test project 编译方法
- android 4.03启动出错,显示"Encryption Unsuccessful"该如何解决
- Android 下面的listView的动态效果怎么实现的?求源代码,多谢
- Android?Palm?Symbian?Windows Mobile?学哪个有“钱图”?解决方案
- Android 开发语言,该怎么解决
- 单个人去做手机开发选什么平台好?android,iphone?解决办法
- Android 虚拟机崩溃的有关问题
- 想学学移动平台的开发 android 还是windows phone7好啊该怎么处理
- Android 上的如何读写设备文件
- Android 2.2 API 汉语文档系列(3) —— AccessibilityService
- 【先睹为快】ArcGIS Android SDK上一版本新特性
- ArcGIS for Android app v2.0.4公布
- android.hardware.USB种介绍
- android linux开发 在线电子书解决方案