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 大量数据按周分组,该如何解决
- android RadioButton如何设置默认选中
- ksoap2-android-这个包,连接webService怎么设置超时
- android 怎么重新设置锚点
- android UI界面设计解决方案
- android 图片对象获取的有关问题
- android 怎么调用淘宝支付宝接口
- Android 沿袭InputMethodService自定义输入法
- android 关于服务连接的疑义
- android 两个activity如何通信
- android 怎么实现对view的放大和缩小
- android 教程解决方法
- android ID,该如何处理
- 准备复习2-3个月,看java+android,请问有经验者,怎么看效果最好》
- android UI线程与AsyncTask的有关问题
- android(java)中的java.net能不能和c#的system.net.sockets进行tcp通信,该如何解决
- android ListView 中的onItemClick Intent 没法跳转
- android(java) 中文乱码的有关问题
- c#c++,android,ios(iphone),php,java视屏课程 散分
- android Post文件到ASP.NET的有关问题,能收到参数收不到文件
- RIM 替 Android 开发者提供免费的 PlayBook!2月13日前
- android 动态设立控件高度
- Android test project 编译方法
- android -相机使用教程(1)解决方法