安卓触屏进行的图形变换--平移,缩放核心代码
2016-03-30 10:19
393 查看
平移核心代码
... //单指针起始位置 ////MotionEvent.ACTION_DOWN,第一个指针 float originalx = motionevent.getX(index); float originaly = motionevent.getX(index); ... private void handleTranslate(MotionEvent ev){ final int historySize = ev.getHistorySize(); float currentx=0,currenty=0; for(int h=0;h<historySize;h++){ currentx = ev.getHistoricalX(h); currenty = ev.getHistoricalY(h); matrix.postTranslate(-(originalx - currentyx), -(originaly - currentyy)); imageView.setImageMatrix(matrix);//通过图形变换完成 //等价于imageView.scrollBy((int)(originalx-currentx),(int)(original-currenty));//通过移动坐标系完成 originalx = currentx; originaly = currenty; } currentx = ev.getX(); currenty = ev.getY(); matrix.postTranslate(-(originalx-currentx),-(originaly-currenty)); imageView.setImageMatrix(matrix); originalx = currentx; originaly = currenty; }
缩放核心代码
... //双指针起始位置 //MotionEvent.ACTION_DOWN,第一个指针 float originalx1 = motionevent.getX(index); float originaly1 = motionevent.getX(index); ... //MotionEvent.ACTION_POINTER_DOWN,第二个指针 float originalx2 = motionevent.getX(index); float originaly2 = motionevent.getX(index); ... private void handleScale(MotionEvent ev){ final int historySize = ev.getHistorySize(); float firstpointercurrentx1 = 0,firstpointercurrenty1 = 0,secondpointercurrentx2 = 0,secondpointercurrenty2 = 0; //中心点 float pivotx,pivoty; //点间距离 float old_distance,new_distance; for(int h=0;h<historySize;h++){ firstpointercurrentx1 = ev.getHistoricalX(0,h); firstpointercurrenty1 = ev.getHistoricalY(0,h); secondpointercurrentx2 = ev.getHistoricalX(1,h); secondpointercurrenty2 = ev.getHistoricalY(1,h); pivotx = (firstpointercurrentx1+secondpointercurrentx2)/2; pivoty = (firstpointercurrenty1+secondpointercurrenty2)/2; old_distance = distance(originalx1,originaly1originalx2,originaly2); new_distance = distance(firstpointercurrentx1,t\firstpointercurrenty1,secondpointercurrentx2,secondpointercurrenty2); matrix.postScale(new_distance/old_distance,new_distance/old_distance,pivotx,pivoty); imageView.setImageMatrix(matrix); originalx1 = firstpointercurrentx1; originaly1 = firstpointerecurrenty1; originalx2 = secondpointercurrent2; originaly2 = secondpointercurrenty2; } firstpointercurrentx1 = ev.getX(0); firstpointercurrenty1 = ev.getX(0); secondpointercurrentx2 = ev.getX(1); secondpointercurrenty2 = ev.getX(1); pivotx = (originalx1+originalx2)/2; pivoty = (originaly1+originaly2)/2; old_distance = distance(originalx1,originaly1,originalx2,originaly2); new_distance = distance(firstpointercurrentx1,firstpointercurrenty1,secondpointercurrentx2,secondpointercurrenty2); matrix.postScale(new_distance/old_distance,new_distance/old_distance,pivotx,pivoty); imageView.setImageMatrix(matrix); originalx1 = firstpointercurrentx1; originaly1 = firstpointercurrenty1; originalx2 = secondpointercurrentx2; originaly2 = secondpointercurrenty2; } //距离计算代码 private float distance(float x1,float y1,float x2,float y2){ return (float)Math.sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)); }
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件
- SourceProvider.getJniDirectories