您的位置:首页 > 移动开发 > Android开发

Android开发中多点触摸的实现方法

2017-04-12 11:40 417 查看
在处理单点触摸中,我们一般会用到MotionEvent.ACTION_DOWN、ACTION_UP、ACTION_MOVE,然后可以用一个Switch语句来分别进行处理。ACTION_DOWN和ACTION_UP就是单点触摸屏幕,按下去和放开的操作,ACTION_MOVE就是手指在屏幕上移动的操作。

在处理多点触摸的过程中,我们还需要用到MotionEvent.ACTION_MASK。一般使用switch(event.getAction() & MotionEvent.ACTION_MASK)就可以处理处理多点触摸的ACTION_POINTER_DOWN和ACTION_POINTER_UP事件。代码调用这个“与”操作以后,当第二个手指按下或者放开,就会触发ACTION_POINTER_DOWN或者ACTION_POINTER_UP事件。

下面我们以一个实际的例子来说明如何在代码中实现多点触摸功能。在这里我们载入一个图片,载入图片后,可以通过一个手指对图片进行拖动,也可以通过两个手指的滑动实现图片的放大缩小功能。

复制代码 代码如下:

// import略  

public class ImageViewerActivity extends Activity implements OnTouchListener { 

    private ImageView mImageView; 

    private Matrix matrix = new Matrix(); 

    private Matrix savedMatrix = new Matrix(); 

    private static final int NONE = 0; 

    private static final int DRAG = 1; 

    private static final int ZOOM = 2; 

    private int mode = NONE; 

    // 第一个按下的手指的点  

    private PointF startPoint = new PointF(); 

    // 两个按下的手指的触摸点的中点  

    private PointF midPoint = new PointF(); 

    // 初始的两个手指按下的触摸点的距离  

    private float oriDis = 1f; 

    @Override 

    protected void onCreate(Bundle savedInstanceState) { 

        super.onCreate(savedInstanceState); 

        this.setContentView(R.layout.imageviewer); 

        mImageView = (ImageView) this.findViewById(R.id.imageView); 

        mImageView.setOnTouchListener(this); 

    } 

    @Override 

    public boolean onTouch(View v, MotionEvent event) { 

        ImageView view = (ImageView) v; 

        // 进行与操作是为了判断多点触摸  

        switch (event.getAction() & MotionEvent.ACTION_MASK) { 

        case MotionEvent.ACTION_DOWN: 

            // 第一个手指按下事件  

            matrix.set(view.getImageMatrix()); 

            savedMatrix.set(matrix); 

            startPoint.set(event.getX(), event.getY()); 

            mode = DRAG; 

            break; 

        case MotionEvent.ACTION_POINTER_DOWN: 

            // 第二个手指按下事件  

            oriDis = distance(event); 

            if (oriDis > 10f) { 

                savedMatrix.set(matrix); 

                midPoint = middle(event); 

                mode = ZOOM; 

            } 

            break; 

        case MotionEvent.ACTION_UP: 

        case MotionEvent.ACTION_POINTER_UP: 

            // 手指放开事件  

            mode = NONE; 

            break; 

        case MotionEvent.ACTION_MOVE: 

            // 手指滑动事件  

            if (mode == DRAG) { 

                // 是一个手指拖动  

                matrix.set(savedMatrix); 

                matrix.postTranslate(event.getX() - startPoint.x, event.getY() 

                        - startPoint.y); 

            } else if (mode == ZOOM) { 

                // 两个手指滑动  

                float newDist = distance(event); 

                if (newDist > 10f) { 

                    matrix.set(savedMatrix); 

                    float scale = newDist / oriDis; 

                    matrix.postScale(scale, scale, midPoint.x, midPoint.y); 

                } 

            } 

            break; 

        } 

        // 设置ImageView的Matrix  

        view.setImageMatrix(matrix); 

        return true; 

    } 

    // 计算两个触摸点之间的距离  

    private float distance(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); 

    } 

    // 计算两个触摸点的中点  

    private PointF middle(MotionEvent event) { 

        float x = event.getX(0) + event.getX(1); 

        float y = event.getY(0) + event.getY(1); 

        return new PointF(x / 2, y / 2); 

    } 



以下是布局文件。

复制代码 代码如下:

<?xml version="1.0" encoding="utf-8"?> 

<RelativeLayout 

  xmlns:android="http://schemas.android.com/apk/res/android" 

  android:layout_width="fill_parent" 

  android:layout_height="fill_parent"> 

    <ImageView  

        android:id="@+id/imageView" 

        android:layout_width="fill_parent" 

        android:layout_height="fill_parent" 

        android:src="@drawable/example" 

        android:scaleType="matrix" > 

    </ImageView> 

</RelativeLayout> 

在这段代码中,我们通过手指的操作来计算Matrix的值,然后设置图片的Matrix,实现图片的移动和缩放。

需要注意的是,在资源文件中,需要设置ImageView的scaleType为“matrix”。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: