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);

           }

    }

}

原创粉丝点击