进阶篇-安卓系统:2.多点触控的交互处理

1.android 触摸事件侦听

安卓的用户交互方式包括两种,一种是点击交互,一种是触摸交互。点击交互就是手指按下抬起一个动作组。而触摸交互分为按下(down),移动(move),抬起(up)。

触摸事件侦听代码:输出触摸事件的三个动作:

我们用一个framlayout布局进行操作

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.View;
import android.widget.FrameLayout;

public class MainActivity extends AppCompatActivity {
    private FrameLayout container;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        container = (FrameLayout) findViewById(R.id.container);
        container.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View view, MotionEvent motionEvent) {
                switch (motionEvent.getAction()){
                    case MotionEvent.ACTION_DOWN:
                        System.out.println("action:down");
                        break;
                    case MotionEvent.ACTION_MOVE:
                        System.out.println("action:move");
                        break;
                    case MotionEvent.ACTION_UP:
                        System.out.println("action:up");
                        break;
                }
                return true;   //remember to change this return to ture
            }
        });

    }
}

注意:记得把onTouch方法的返回值改成true。

运行结果:

07-13 14:35:19.883 11720-11720/bhu.com.myapplication I/System.out: action:down
07-13 14:35:19.924 11720-11720/bhu.com.myapplication I/System.out: action:move
07-13 14:35:19.954 11720-11720/bhu.com.myapplication I/System.out: action:move
07-13 14:35:19.964 11720-11720/bhu.com.myapplication I/System.out: action:move
07-13 14:35:19.984 11720-11720/bhu.com.myapplication I/System.out: action:move
07-13 14:35:19.984 11720-11720/bhu.com.myapplication I/System.out: action:up

2.获取触摸的当前坐标

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.View;
import android.widget.FrameLayout;

public class MainActivity extends AppCompatActivity {
    private FrameLayout container;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        container = (FrameLayout) findViewById(R.id.container);
        container.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View view, MotionEvent motionEvent) {
                switch (motionEvent.getAction()){
                    case MotionEvent.ACTION_DOWN:
                        System.out.println("action:down");
                        break;
                    case MotionEvent.ACTION_MOVE:

                        System.out.println(String.format("(%f,%f)",motionEvent.getX(),motionEvent.getY()));

                        break;
                    case MotionEvent.ACTION_UP:
                        System.out.println("action:up");
                        break;
                }
                return true;   //remember to change this return to ture
            }
        });

    }
}

输出结果:

07-13 14:39:50.442 11720-11720/bhu.com.myapplication I/System.out: (366.251312,682.000000)
07-13 14:39:50.452 11720-11720/bhu.com.myapplication I/System.out: (367.076874,682.000000)
07-13 14:39:50.472 11720-11720/bhu.com.myapplication I/System.out: (367.000000,680.500000)
07-13 14:39:50.482 11720-11720/bhu.com.myapplication I/System.out: (368.067780,681.000000)
07-13 14:39:50.512 11720-11720/bhu.com.myapplication I/System.out: (369.000000,681.000000)
07-13 14:39:50.532 11720-11720/bhu.com.myapplication I/System.out: (370.142609,681.000000)
07-13 14:39:50.542 11720-11720/bhu.com.myapplication I/System.out: (371.500000,681.000000)
07-13 14:39:50.582 11720-11720/bhu.com.myapplication I/System.out: (373.497681,681.000000)
07-13 14:39:50.592 11720-11720/bhu.com.myapplication I/System.out: (374.960114,681.000000)
07-13 14:39:50.612 11720-11720/bhu.com.myapplication I/System.out: (376.413116,681.000000)

3.实现拖动控件

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.View;
import android.widget.FrameLayout;
import android.widget.ImageView;

public class MainActivity extends AppCompatActivity {
    private FrameLayout container;
    private ImageView imv;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        container = (FrameLayout) findViewById(R.id.container);
        imv = (ImageView) findViewById(R.id.imv);
        container.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View view, MotionEvent motionEvent) {
                switch (motionEvent.getAction()){
                    case MotionEvent.ACTION_DOWN:
                        System.out.println("action:down");
                        break;
                    case MotionEvent.ACTION_MOVE:

                        //System.out.println(String.format("(%f,%f)",motionEvent.getX(),motionEvent.getY()));
                        FrameLayout.LayoutParams lp = (FrameLayout.LayoutParams) imv.getLayoutParams();
                        lp.leftMargin = (int) motionEvent.getX();
                        lp.topMargin = (int) motionEvent.getY();

                        imv.setLayoutParams(lp);

                        break;
                    case MotionEvent.ACTION_UP:
                        System.out.println("action:up");
                        break;
                }
                return true;   //remember to change this return to ture
            }
        });

    }
}

运行结果:

该图片无法显示!

4.获取多个触控点的坐标

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.View;
import android.widget.FrameLayout;
import android.widget.ImageView;

public class MainActivity extends AppCompatActivity {
    private FrameLayout container;
    private ImageView imv;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        container = (FrameLayout) findViewById(R.id.container);
        imv = (ImageView) findViewById(R.id.imv);
        container.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View view, MotionEvent motionEvent) {
                switch (motionEvent.getAction()){
                    case MotionEvent.ACTION_DOWN:
                        System.out.println("action:down");
                        break;
                    case MotionEvent.ACTION_MOVE:

                        //System.out.println(String.format("(%f,%f)",motionEvent.getX(),motionEvent.getY()));
                        System.out.println("pointers count:"+motionEvent.getPointerCount());  //get the number of pointers

                        System.out.println(String.format("point1:(%f,%f)  point2:(%f,%f)",motionEvent.getX(0),motionEvent.getY(0),motionEvent.getX(1),motionEvent.getY(1)));
                        //when you put just one finger on the screen,there will be a exception,because there is not a getX(1).

                        break;
                    case MotionEvent.ACTION_UP:
                        System.out.println("action:up");
                        break;
                }
                return true;   //remember to change this return to ture
            }
        });

    }

输出结果:

07-13 14:54:52.855 5804-5804/bhu.com.myapplication I/System.out: point1:(245.296295,718.407410)  point2:(456.000000,389.000000)
07-13 14:54:52.865 5804-5804/bhu.com.myapplication I/System.out: pointers count:2
07-13 14:54:52.865 5804-5804/bhu.com.myapplication I/System.out: point1:(244.000000,721.000000)  point2:(455.000000,392.000000)
07-13 14:54:52.885 5804-5804/bhu.com.myapplication I/System.out: pointers count:2
07-13 14:54:52.885 5804-5804/bhu.com.myapplication I/System.out: point1:(242.387100,722.612915)  point2:(454.000000,394.000000)
07-13 14:54:52.895 5804-5804/bhu.com.myapplication I/System.out: pointers count:2
07-13 14:54:52.905 5804-5804/bhu.com.myapplication I/System.out: point1:(242.000000,724.000000)  point2:(453.000000,396.000000)
07-13 14:54:52.915 5804-5804/bhu.com.myapplication I/System.out: pointers count:2
07-13 14:54:52.915 5804-5804/bhu.com.myapplication I/System.out: point1:(241.000000,724.000000)  point2:(452.000000,397.000000)
07-13 14:54:52.935 5804-5804/bhu.com.myapplication I/System.out: pointers count:2
07-13 14:54:52.935 5804-5804/bhu.com.myapplication I/System.out: point1:(241.000000,725.000000)  point2:(452.000000,397.000000)

5.根据手势动作实现图片的缩放(两点触控)<并且可以拖动>

import android.net.Uri;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.View;
import android.widget.FrameLayout;
import android.widget.ImageView;

import com.google.android.gms.appindexing.Action;
import com.google.android.gms.appindexing.AppIndex;
import com.google.android.gms.common.api.GoogleApiClient;

public class MainActivity extends AppCompatActivity {
    private FrameLayout container;
    private ImageView imv;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        container = (FrameLayout) findViewById(R.id.container);
        imv = (ImageView) findViewById(R.id.imv);
        container.setOnTouchListener(new View.OnTouchListener() {

            float cureentDistance;
            float lastDistance = -1; //the distance of two point can not be a minus,when the distance is -1 ,it means it‘s a initial value.

            @Override
            public boolean onTouch(View view, MotionEvent motionEvent) {
                switch (motionEvent.getAction()) {
                    case MotionEvent.ACTION_DOWN:
                        System.out.println("action:down");
                        break;
                    case MotionEvent.ACTION_MOVE:

                        if (motionEvent.getPointerCount() >= 2) {//there must be two finger on the screen

                            float offsetX = motionEvent.getX(0) - motionEvent.getX(1);
                            float offsetY = motionEvent.getY(1) - motionEvent.getY(1);

                            cureentDistance = (float) Math.sqrt(offsetX * offsetX + offsetY * offsetY);
                            if (lastDistance < 0) {
                                lastDistance = cureentDistance;
                            } else {
                                if (cureentDistance - lastDistance > 5) {
                                    System.out.println("Zoom in");
                                    FrameLayout.LayoutParams lp = (FrameLayout.LayoutParams) imv.getLayoutParams();
                                    lp.width = (int) (1.1f*imv.getWidth());
                                    lp.height = (int) (1.1f*imv.getHeight());
                                    imv.setLayoutParams(lp);

                                    lastDistance = cureentDistance;
                                } else if (lastDistance - cureentDistance > 5) {
                                    System.out.println("Zoom out");
                                    FrameLayout.LayoutParams lp = (FrameLayout.LayoutParams) imv.getLayoutParams();
                                    lp.width = (int) (0.9f*imv.getWidth());
                                    lp.height = (int) (0.9f*imv.getHeight());
                                    imv.setLayoutParams(lp);
                                    lastDistance = cureentDistance;
                                }
                            }
                        }else{
                            FrameLayout.LayoutParams lp = (FrameLayout.LayoutParams) imv.getLayoutParams();
                            lp.leftMargin = (int) (motionEvent.getX()-(imv.getWidth()/2));
                            lp.topMargin = (int) (motionEvent.getY()-(imv.getHeight()/2));

                            imv.setLayoutParams(lp);

                        }

                        break;
                    case MotionEvent.ACTION_UP:
                        System.out.println("action:up");
                        break;
                }
                return true;   //remember to change this return to ture
            }
        });

    }

}
时间: 2024-11-05 18:46:29

进阶篇-安卓系统:2.多点触控的交互处理的相关文章

【朝花夕拾】Android自定义View篇之(八)多点触控(上)基础知识

前言 转载请声明,转自[https://www.cnblogs.com/andy-songwei/p/11155259.html],谢谢! 在前面的文章中,介绍了不少触摸相关的知识,但都是基于单点触控的,即一次只用一根手指.但是在实际使用App中,常常是多根手指同时操作,这就需要用到多点触控相关的知识了.多点触控是在Android2.0开始引入的,在现在使用的Android手机上都是支持多点触控的.本系列文章将对常见的多点触控相关的重点知识进行总结,并使用多点触控来实现一些常见的效果,从而达到将

【朝花夕拾】Android自定义View篇之(九)多点触控(下)实践出真知

前言 在上一篇文章中,已经总结了MotionEvent以及多点触控相关的基础理论知识和常用的函数.本篇将通过实现单指拖动图片,多指拖动图片的实际案例来进行练习并实现一些效果,来理解前面的理论知识.要理解本文的代码,需要先掌握上一篇的理论知识,事件处理基础,以及一定的自定义View基础,这些我也在本系列文章的前几篇中讲过,有兴趣的可以按照本系列的顺序依次阅读学习,相信您一定会有不小的收获.. 一.实现单指拖动图片 要实现单指拖动图片,大致思路就是监控手指的ACTION_MOVE事件.手指移动过程中

(五)多点触控之兼容ViewPager

在上一篇文章中,自定义的ZoomImageView已经实现了自由缩放,自由移动以及双击放大与缩小的功能.已经可以投入使用这个控件了.下面我们就在ViewPager中使用这个控件.如果你还没读过上一篇文章,可以点击下面的链接: http://www.cnblogs.com/fuly550871915/p/4940193.html 一.在ViewPager中使用自定义的ZoomImageView 快速的代建起ViewPager吧.修改activity_main.xml中的代码,如下: <Relati

Android多点触控技术实战,自由地对图片进行缩放和移动

转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/11100327 在上一篇文章中我带着大家一起实现了Android瀑布流照片墙的效果,虽然这种效果很炫很酷,但其实还只能算是一个半成品,因为照片墙中所有的图片都是只能看不能点的.因此本篇文章中,我们就来对这一功能进行完善,加入点击图片就能浏览大图的功能,并且在浏览大图的时候还可以通过多点触控的方式对图片进行缩放. 如果你还没有看过 Android瀑布流照片墙实现,体验不规则排列的美感

Android 多点触控错误处理(java.lang.IllegalArgumentException: pointerIndex out of range)

最近做View的多点触控时,每次第一次触控事件完美运行,第二次就直接崩了,错误信息如下: 01-03 00:05:44.220 4377-4410/system_process E/AndroidRuntime: *** FATAL EXCEPTION IN SYSTEM PROCESS: android.ui java.lang.IllegalArgumentException: pointerIndex out of range at android.view.MotionEvent.nat

Android多点触控技术,实现对图片的放大缩小平移,惯性滑动等功能

首先推荐一下鸿洋大大的打造个性的图片预览与多点触控视频教程,这套教程教我们一步一步实现了多点触控实现对图片的平移和缩放的功能,这篇文章我将在鸿洋大大的基础之上做了一些扩展功能: 1.图片的惯性滑动 2.图片缩放小于正常比例时,松手会自动回弹成正常比例 3.图片缩放大于最大比例时,松手会自动回弹成最大比例 实现图片的缩放,平移,双击缩放等基本功能的代码如下,每一行代码我都做了详细的注释 public class ZoomImageView extends ImageView implements

Android官方开发文档Training系列课程中文版:手势处理之多点触控处理

原文地址:http://android.xsoftlab.net/training/gestures/multi.html 多点触控是指多个手指同时触摸屏幕的情况.这节课主要学习如何检测多点触控手势. 记录多个触控点 当多根手指同时触碰到屏幕时,系统会产生以下触摸事件: ACTION_DOWN -第一个触碰到屏幕的点.它是手势的起始事件.这个触控点的指针数据在MotionEvent对象中的索引总是0. ACTION_POINTER_DOWN -除第一个触控点之外的其它点.这个触控点的指针数据的索

(三)多点触控之自由移动缩放后的图片

在上一篇文章中,将图片的自由缩放功能基本上完成了.效果还不错.如果你还没读过,可以点击下面的链接:http://www.cnblogs.com/fuly550871915/p/4939954.html 接下来这个项目要往前走,在自由缩放的基础上实现自由移动.要用的知识点就是OnTouchListener对移动手势的监控.在写代码之前我们应该考虑下面的几个问题: (1)什么时候可以移动?当图片比屏幕大时才需要移动,如果图片在屏幕内显示,没必要移动.(2)当移动的距离达到多少时才触发移动效果?在这里

Android笔记:触摸事件的分析与总结----多点触控

一.多点触控 当多点同时触摸屏幕时,系统将会产生如下的触摸事件: 1.ACTION_DOWN:触摸屏幕的第一个点.此时手势开始.该点的数据通常在MotionEvent事件队列索引位置0处. 2.ACTION_POINTER_DOWN:除了第一个点的其他触摸点数据.该点的数据的索引位置由getActionIndex()方法返回. 3.ACTION_MOVE:在手势过程中发生的一次变化. 4.ACTION_POINTER_UP:当不是第一个点的其他点UP后触发. 5.ACTION_UP:当手势中的最