android基础---拖拉与缩放
来源:互联网 发布:云南省精准扶贫大数据 编辑:程序博客网 时间:2024/05/29 15:34
实现图片的拖动,放大,缩小
Main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<!-- 采用矩阵实现图形移动scaleType="matrix" -->
<ImageView
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:src="@drawable/a"
android:scaleType="matrix"
android:id="@+id/imageView"
/>
</LinearLayout>
MainActivity.java
public class MainActivity extends Activity {
private ImageView imageView;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.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 static final int DRAG = 1;//拖拉功能为1
private static final int ZOOM = 2;//缩放功能为2
private int type = 0;//记录当前功能
private float startDist;
private PointF midPoint ;//记录两个手指之间的中间点
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction() & MotionEvent.ACTION_MASK) {//getAction动作的高八位存放手指的ID,低八位存放动作,现在只需要低八位,故&255
case MotionEvent.ACTION_DOWN://只有一个手指摁下屏幕时触发的事件
currentMatrix.set(matrix);//每次移动的时候把上一次的位置存进去
startPoint.set(event.getX(), event.getY());//存入位置
type = DRAG;//类型为拖拉操作
break;
case MotionEvent.ACTION_MOVE://手指在屏幕移动时触发的事件,该事件在移动时不断的被触发
if(type == DRAG){//如果是拖拉操作
float dx =event.getX()-startPoint.x;//计算移动距离
float dy =event.getY()-startPoint.y;
matrix.set(currentMatrix);//在目前位置基础上进行移动
matrix.postTranslate(dx, dy);//**该方法实现移动
}else if(type == ZOOM){//如果是缩放操作
float dist = distance(event);//两手指移动后两手指之间的距离
if(dist > 10f){//距离大于10个像素才处理
matrix.set(currentMatrix);//在上次缩放结果基础上进行缩放
float scale = dist / startDist;//得到放大倍数
matrix.postScale(scale ,scale , midPoint.x,midPoint.y);//根据中间点进行放大
}
}
break;
case MotionEvent.ACTION_POINTER_DOWN://如果已经有一个手指摁下屏幕,后续再有手指按下屏幕就会触发该事件,移动的时候用不上,但是要将图片缩放的时候要用到
startDist = distance(event);//取得两个手指之间的距离
if(startDist > 10f){//如果两个手指之间的距离大于10才认为要实现放大功能
currentMatrix.set(matrix);//保存当前的缩放结果
type = ZOOM;//又有手指按下,则为缩放操作
midPoint = midPoint(event);//得到两个手指之间的中间点
}
break;
case MotionEvent.ACTION_UP://最后一个手指离开屏幕后触发的事件
type = 0;//手指都离开了,类型还原为0
break;
case MotionEvent.ACTION_POINTER_UP://有一个手指离开屏幕,但还有手指在屏幕上,此时触发该事件
break;
}
imageView.setImageMatrix(matrix);
return true;
}
//根据勾股定理求两手指之间的距离
private float distance (MotionEvent event ){
float dx = event.getX(1)-event.getX(0);//第二个手指的X坐标-第一个手指X坐标
float dy = event.getY(1)-event.getY(0);//第二个手指的Y坐标-第一个手指Y坐标
return FloatMath.sqrt(dx*dx+dy*dy);//斜边的距离
}
//计算两点之间的中间点
private PointF midPoint(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);
}
}
}
- android基础---拖拉与缩放
- android基础---拖拉与缩放
- android学习笔记---58_拖拉功能与多点触摸,实现图片的拖拉和缩放功能
- android中图片的拖拉和缩放
- Android应用开发之图片拖拉和多点触摸缩放
- JavaScript 拖拉缩放效果
- JavaScript 拖拉缩放效果
- JavaScript 拖拉缩放效果
- js拖拉缩放效果
- JavaScript 拖拉缩放效果
- JavaScript 拖拉缩放效果
- Android:拖拉功能与多点触摸
- JavaScript 拖拉缩放效果 实例
- Android之拖拉功能与多点触控
- 克服懒惰与拖拉
- android 拖拉控件
- android 拖拉控件
- 拖拉功能与多点触摸
- Export GridView with Images from database to Word Excel and PDF Formats
- C语言嵌入式系统编程之软件架构篇
- cmd命令行访问远程mysql数据库
- 配置vim开发Android[神器终究是神器]
- android基础--采用方向传感器实现指南针
- android基础---拖拉与缩放
- 项目登录、注册页面的收获
- A*启发式算法模拟实现
- List、Map、Set基本操作
- computer vision resources
- 复制,粘贴 -- 调用浏览器 -- 根据包名,去软件市场查找 -- Toast一直显示 -- 自定义Dialog
- Export GridView To WordExcelPDFCSV in ASP.Net
- c++
- 《c和指针》3.1.3 二 、字符串常量 :不能用赋值语句将一个字符串常量或字符数组直接给一个字符数组赋值