Android多点触摸交互处理,放大缩小图片

多点触摸(MultiTouch),指的是允许计算机用户同时通过多个手指来控制图形界面的一种技术。与多点触摸技术相对应的就是单点触摸,单点触摸的设备已经有很多年了,小尺寸的有触摸式的手机,大尺寸的最常见的就是银行里的ATM机和排队查询机等等。

多点触摸技术在实际开发过程中,用的最多的就是放大缩小功能。比如有一些图片浏览器,就可以用多个手指在屏幕上操作,对图片进行放大或者缩小。再比如一些浏览器,也可以通过多点触摸放大或者缩小字体。其实放大缩小也只是多点触摸的实际应用样例之一,有了多点触摸技术,在一定程度上就可以创新出更多的操作方式来,实现更酷的人机交互。

理论上,Android系统本身可以处理多达256个手指的触摸,这主要取决于手机硬件的支持。当然,支持多点触摸的手机,也不会支持这么多点,一般是支持2个点或者4个点。对于开发者来说,编写多点触摸的代码与编写单点触摸的代码,并没有很大的差异。这是因为,Android SDK中的MotionEvent类不仅封装了单点触摸的消息,也封装了多点触摸的消息,对于单点触摸和多点触摸的处理方式几乎是一样的。

在处理单点触摸中,我们一般会用到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事件。

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

view

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
    android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity"
    android:id="@+id/frame">

    <ImageView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/img"
        android:background="@drawable/paoku00199"/>

</FrameLayout>

java

private  float currentDistance=0;
    private float lastDistance=-1;
    private FrameLayout frame;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        frame= (FrameLayout) findViewById(R.id.frame);
        final ImageView img= (ImageView) findViewById(R.id.img);

        frame.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                switch (event.getAction()){
                    case MotionEvent.ACTION_DOWN: //触摸按下
                        Log.i("MotionEvent","ACTION_DOWN");
                        break;
                }
                switch (event.getAction()){
                    case MotionEvent.ACTION_MOVE: //触摸移动
                        Log.i("MotionEvent","ACTION_MOVE");

                        FrameLayout.LayoutParams layoutParams = (FrameLayout.LayoutParams) img.getLayoutParams();

                        if(event.getPointerCount()==1) {
                            //单个触摸点,并拖动图片
                            System.out.println(String.format("X:%f,Y:%f", event.getX(), event.getY()));

                            layoutParams.leftMargin = (int) event.getX()-10;
                            layoutParams.topMargin = (int) event.getY()-10;

                            img.setLayoutParams(layoutParams);
                        }

                        System.out.println("pointer count 触摸点个数"+event.getPointerCount());//触摸点个数
                        //多个触摸点的坐标

                        //手势放大缩小图片
                        if (event.getPointerCount()>=2){
                            System.out.println(String.format("多个触摸点的坐标X1:%f;Y1:%f", event.getX(0), event.getX(0)));
                            float offsetX=event.getX(0)-event.getX(1);
                            float offsetY=event.getY(0)-event.getY(1);
                            currentDistance=(float)Math.sqrt(offsetX*offsetX+offsetY*offsetY);

                            if(lastDistance<0){
                                lastDistance=currentDistance;
                            }else {
                               if(currentDistance-lastDistance>5){    //5px;有误差
                                   FrameLayout.LayoutParams lp = (FrameLayout.LayoutParams) img.getLayoutParams();
                                   System.out.println("放大");
                                   lp.width= (int) (1.1f*img.getWidth());
                                   lp.height=(int) (1.1f*img.getHeight());
                                   img.setLayoutParams(lp);
                                   lastDistance=currentDistance;  //放大
                               }else if (lastDistance-currentDistance>5){
                                   lastDistance=currentDistance;    //缩小
                                   FrameLayout.LayoutParams lp = (FrameLayout.LayoutParams) img.getLayoutParams();
                                   lp.width= (int) (0.9f*img.getWidth());
                                   lp.height=(int) (0.9f*img.getHeight());
                                   img.setLayoutParams(lp);
                               }

                            }
                        }
                        break;
                }
                switch (event.getAction()){
                    case MotionEvent.ACTION_UP: //触摸弹起
                        Log.i("MotionEvent","ACTION_UP");
                        break;
                }

                return true;//true:需要催发后续事件;false:不需要须发后续事件(只能执行一次)
            }
        });
    }

注意:

private  float currentDistance=0;
    private float lastDistance=-1;

要onClick写在外面;

时间: 2024-12-24 07:04:59

Android多点触摸交互处理,放大缩小图片的相关文章

Android多点触摸放大缩小图片

1.Activity package com.fit.touchimage; import android.app.Activity; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Matrix; import android.graphics.PointF; import android.os.Bundle; import android.util.F

基于jquery的鼠标滚动放大缩小图片

一直以来都想写一个图片放大和缩小的小玩意,本来以为会很复杂,这几天自己思考了一下,原来是so easy啊.目前实现的放大缩小,主要时依据鼠标的滚轮触发事件来实现的,废话少说直接上源码. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns

Linux Android 多点触摸协议 原文出自【比特网】,转载请保留原文链接:http://soft.chinabyte.com/os/71/12306571.shtml

为了使用功能强大的多点触控设备.就须要一种方案去上报用户层所需的具体的手指触摸数据. 这个文档所描写叙述的多点触控协议能够让内核驱动程序向用户层上报随意多指的数据信息. 使用说明 单点触摸信息是以ABS承载并按一定顺序发送,如BTN_TOUCH.ABS_X.ABS_Y.SYNC.而多点触摸信息则是以ABS_MT承载并按一定顺序发送.如ABS_MT_POSITION_X.ABS_MT_POSITION_Y,然后通过调用input_mt_sync()产生一个 SYN_MT_REPORT event来

Android 手势滑动,多点触摸放大缩小图片

学习安卓两点触摸滑动缩放图片 1.布局文件如下main.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="

Android 多点触摸(图片放大缩小)

就不说什么了,有注释 基本有基础的都看得懂 欢迎加入我的交流群: 386451316 main.xml文件 <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layou

Android多点触摸缩放图片-android学习之旅(四)

获取多触摸点 核心代码: 获取触摸点的个数和位置 public boolean onTouch(View v, MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: System.out.println("down"); break; case MotionEvent.ACTION_UP: System.out.println("触摸点的个数:"+event.g

scaleform mobile sdk for android 多点触摸 修正

修正 scaleform 的多点触控 (随手一记 给后来的人做个参考) scaleform 版本号 4.2.24 (估计这就是最后一个 移动版的版本了,万年没有更新了) 开始 一直以为 scaleform 没有做  多点触控 和 手势 .其实 都已经封装好了.只是PC端的模拟器不支持.(调试 比较蛋疼只能 用真机了) 但是在用的时候发现 TouchEvent.Begin  有问题 只能获取第一个点击点,和第一个抬起点,move 操作可以正常获取. 如果不修改 代码的话  完全可以用 通过监听 m

HTML5:使用Canvas和Input range控件放大缩小图片

引自:http://blog.csdn.net/ClementAD/article/details/48938261 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>图片缩放</title> </head> <body style="background: black;"> <canvas id

layui等比例放大/缩小图片

HTML <img class="layui-upload-img" id="photo" style="max-height: 100px;max-width: 100px;"> JS $("#photo").click(function(){ showImg($(this)); }); function showImg(imgData){ var img = new Image(); img.src = img