Android中的多点触摸

代码下载地址

代码一:自定义支持多点触摸的TextView

http://download.csdn.net/detail/zhiyuan0932/9513852

什么是多点触摸

允许计算机用户同时通过多个手指来控制图形界面的一种技术

多点触摸的应用场景

  • 对图片、文字、网页进行放大或者缩小
  • 多手指手势操作自定义控件和布局

触摸事件的重要方法

  • event.getActionMasked(); 获取事件类型

    在只使用单手指操作的时候,这个方法我们一般使用的是event.getAction(),来获取事件类型,但是对于多个手指,我们使用event.getActionMasked()或者event.getAction() & MotionEvent.ACTION_MASK 来获取支持多个手指触摸的事件类型。

  • MotionEvent.ACTION_POINTER_DOWN 手指按下事件

    这个方法可以获取到多个手指按下的状态

  • MotionEvent.ACTION_POINTER_UP 手指抬起事件

    这个方法可以获取到多个手指抬起的状态

  • MotionEvent.ACTION_MOVE 手指移动事件
  • event.getPointerCount() 获取手指个数

    这个方法是获取当前手指的个数

案例一:通过两指触摸实现字体缩放

  • 在这里直接贴代码,首先贴出布局代码
<RelativeLayout 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" >

    <com.example.scaletextview.ZoomTextView
        android:id="@+id/textView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_centerInParent="true"
        android:gravity="center"
        android:text="@string/hello_world"
        android:textSize="30sp" />

</RelativeLayout>
  • 贴出自定义支持多点触控的TextView代码
package com.example.scaletextview;

import android.content.Context;
import android.util.AttributeSet;
import android.util.FloatMath;
import android.util.Log;
import android.view.MotionEvent;
import android.widget.TextView;

public class ZoomTextView extends TextView {

    private static final String TAG = "ZoomTextView";

    private float textSize;
    private int mode;
    private float oldDist;

    public ZoomTextView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    public ZoomTextView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public ZoomTextView(Context context) {
        super(context);
    }

    /**
     * 处理TextView的触摸事件
     */
    @Override
    public boolean onTouchEvent(MotionEvent event) {
        //在一开始,计算当前字体的大小
        if (textSize == 0) {
            textSize = this.getTextSize();
        }
        // 获取触摸事件的类型,如果是单点是event.getAction(),当涉及到多点触控时,就使用getActionMasked来获取触摸事件类型
        switch (event.getActionMasked()) {

        case MotionEvent.ACTION_POINTER_DOWN:
            // 当手指按下的时候,就去获取当前手指的间距
            oldDist = spacing(event);
            break;
        case MotionEvent.ACTION_MOVE:
            // 获取当前触摸点的个数
            if (event.getPointerCount() >= 2) {
                // 如果触摸点>=2 获取当前两个手指的距离,然后进行缩放
                float newDist = spacing(event);
                zoom(newDist / oldDist);
                //重新置位
                oldDist = newDist;
            }
            break;
        }
        return true;
    }

    /**
     * 不断进行缩放
     *
     * @param f
     */
    private void zoom(float f) {
        textSize *= f;
        this.setTextSize(px2sp(getContext(), textSize));
    }

    /**
     * 将px值转换为sp值,保证文字大小不变
     *
     * @param pxValue
     * @param fontScale
     *            (DisplayMetrics类中属性scaledDensity)
     * @return
     */
    public static int px2sp(Context context, float pxValue) {
        float fontScale = context.getResources().getDisplayMetrics().scaledDensity;
        return (int) (pxValue / fontScale + 0.5f);
    }

    /**
     * 计算两个手指的大小
     *
     * @param event
     * @return
     */
    private float spacing(MotionEvent event) {
        //获取第一个点的x坐标和第二个点的x坐标
        float x = event.getX(0) - event.getX(1);
        //分别获取y坐标
        float y = event.getY(0) - event.getY(1);
        //使用勾股定理计算两点距离
        return FloatMath.sqrt(x * x + y * y);
    }
}
时间: 2024-10-27 04:53:09

Android中的多点触摸的相关文章

Android学习之多点触摸并不神秘

最近研究了一下多点触摸,写了个利用多点触摸来控制图片大小和单点触摸控制图片移动的程序,和大家分享分享. Android中监听触摸事件是onTouchEvent方法,它的参数为MotionEvent,下面列举MotionEvent的一些常用的方法: getPointerCount() 获得触屏的点数. getX() 获得触屏的X坐标值 getY() 获得触屏的Y坐标值 getAction() 获得触屏的动作 ACTION_DOWN:按下的动作开始,比如用手指按屏幕. ACTION_UP:按下的动作

Cocos2d-x 3.0中实现多点触摸

Cocos2d-x 3.0中实现多点触摸 尊重原创:http://cn.cocos2d-x.org/tutorial/show?id=2713 在上一篇<Cocos2d-x 3.0 中使用单点触摸>中介绍了在Cocos2d-x 3.0中实现单点触摸,但是有些游戏还会用到多点触摸,其中最典型的游戏是节奏大师,在节奏大师中会不断产生运动的音符,玩家需要不停地点击音符以获得高分,而且玩家可以多个手指头一起点,多个手指头一起点就是使用多点触摸实现的. 下面通过一个小的例子介绍如何在Cocos2d-x

WPF中的多点触摸事件

原文:WPF中的多点触摸事件 UIElement在WPF4下添加了很多支持多点触摸的事件,通过它们可以在硬件支持的情况下处理多点触摸,以下通过代码来说明通过处理这些事件,我们可以做些什么: 一.触摸相关的多种事件,跟鼠标事件是对应的,通过这些事件可以获取到多个触摸的鼠标点,并进行相应的处理 public static readonly RoutedEvent TouchDownEvent; public static readonly RoutedEvent TouchEnterEvent; p

Android事件处理之多点触摸与手势识别

一.Muilti-touch 双指缩放的实现探索: 首先要实现OnTouchListener接口,然后重写方法: public boolean onTouch(View v, MotionEvent event); 从这个方法中我们就可以获取实现两指缩放功能的全部信息. View v是触发事件的源,MotionEvent event即一个触摸事件.对屏幕的几乎所有操作都会触发事件,如点击.放开.滑动等. 不同的事件在MotionEvent中有不同的id,我们可以根据event.getAction

android中禁用多点触控的方法

在自定义一些控件,或者使用别人写的自定义控件的时候,偶尔会遇到多点触控的时候出现各种问题,所以需要对一些地方进行多点触控的禁用,下面是我找到的两个简单的方法: 1. 直接使用自定义主题Theme来修改整个APP的样式,禁止全局多点触控: <style name="MyThemeStyle"> <!-- 禁止多点触控 --> <item name="android:windowEnableSplitTouch">false</

zepto中的多点触摸

在用zepto中做屏幕的触摸来滑动图片的过程中,获取touchstart中的数据,是用e.touches[0],当时我就奇怪为什么是放在数组里面,而且打印出来的全部都是长度为1的touches数组. 后面,我想做两只手指来滑动图片的时候,才觉得一条触摸路径对应一个touches数组中的数据.但是在手机端无法console.log()测试.于是我定义了一个变量touchestime,用来记录touches的次数.touchstart的时候就++,touchend的时候就--,然后等于2的时候就al

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多点触摸交互处理,放大缩小图片

多点触摸(MultiTouch),指的是允许计算机用户同时通过多个手指来控制图形界面的一种技术.与多点触摸技术相对应的就是单点触摸,单点触摸的设备已经有很多年了,小尺寸的有触摸式的手机,大尺寸的最常见的就是银行里的ATM机和排队查询机等等. 多点触摸技术在实际开发过程中,用的最多的就是放大缩小功能.比如有一些图片浏览器,就可以用多个手指在屏幕上操作,对图片进行放大或者缩小.再比如一些浏览器,也可以通过多点触摸放大或者缩小字体.其实放大缩小也只是多点触摸的实际应用样例之一,有了多点触摸技术,在一定

多点触摸与单点触摸接口主要区别【转】

转自:http://blog.csdn.net/eleven_yy/article/details/7723079 上发单点触摸事件 input_report_key(input,ABS_MT_TRACKING_ID,0); input_report_key(input, BTN_TOUCH, 1); input_report_abs(input, ABS_MT_POSITION_X, ts->tc.x1); input_report_abs(input, ABS_MT_POSITION_Y,