多点触控

1.要了解多点触控,我们必须先了解一下View的生命周期,毕竟在Android用的到多点触控的地方,一般都是自定义控件。就像Fragment和Activity都有生命周期一样,View也有自己的生命周期。该生命周期并不直接和展示它的Fragment或者Activity相连,相反,它和显示它的窗口状态已经渲染循环相关。

当视图被添加到View层次结构中时,第一个被回调的函数是View.onAttachedToWindow(),这标志着它现在可以加载所需的资源了,构建自定义视图时,开发者应该重载该方法,并在该方法中加载所有资源并初始化视图所需的依赖。基本上,所有耗时的初始化操作都应放在该方法中。

还有一个匹配的回调名为View.onDetachedFromWindow(),从View层次结构中移除视图时调用这个方法。在这里,你需要关注那些需要显式清理的操作,比如所有被加载的资源,启动的Service,或者其他依赖。

试图被添加到View层次结构中之后,它会经过一个循环,该循环首先计算动画,接下来会依次调用View.onMeasure(),View.onLayout(),View.onDraw()等方法。系统会确保这些方法每次都按完全相同的顺序被调用.

View的生命周期如下:

View.onAttachedToWindow()--->动画视图--->View.onMeasure()--->View.onLayout()--->View.onDraw()--->View.onDetachedFromWindow();

在onLayout()方法中,计算每个按键的大小和位置,在onDraw()方法中,应避免执行任何耗时的操作,而只关注实际的绘制,从而避免潜在的性能问题.onMeasure()一般配合onlayout一起使用。

当手指按下屏幕的时候系统会回调View的onTouchEvent();所以多点触控的大部分代码都写在该方法中.

2.多点触控

多点触控的基本方法和参数

public boolean onTouchEvent(MotionEvent event)

参数event:参数event为手机屏幕触摸事件封装类的对象,其中封装了该事件的所有信息,例如触摸的位置、触摸的类型以及触摸的时间等。该对象会在用户触摸手机屏幕时被创建。

返回值:该方法的返回值机理与键盘响应事件的相同,同样是当已经完整地处理了该事件且不希望其他回调方法再次处理时返回true,否则返回false。

event.getAction()
//获取触控动作比如ACTION_DOWN

event.getPointerCount(); //获取触控点的数量,比如2则可能是两个手指同时按压屏幕

event.getPointerId(nID); //对于每个触控的点的细节,我们可以通过一个循环执行getPointerId方法获取索引

event.getX(nID); //获取第nID个触控点的x位置

event.getY(nID); //获取第nID个点触控的y位置

event.getPressure(nID); //LCD可以感应出用户的手指压力,当然具体的级别由驱动和物理硬件决定的

event.getDownTime() //按下开始时间

event.getEventTime() // 事件结束时间

event.getEventTime()-event.getDownTime()); //总共按下时花费时间

event.getActionIndex()//获取触摸手指的坐标ID也是上面的nID

event.getPointerCount()//获取有多少个手指按下

当然这里有个小小变化,在Android4.2以后,就基本不getAction获取触摸动作而是用event.getActionMasked()代替.

下面写一小段程序供参考:

public class MyView extends View {

public MyView(Context context) {

super(context);

}

public MyView(Context context, AttributeSet attrs) {

super(context, attrs);

}

public MyView(Context context, AttributeSet attrs, int defStyle) {

super(context, attrs, defStyle);

}

@Override

protected void onAttachedToWindow() {

super.onAttachedToWindow();

}

//因为举例简单起见,按照480*800的手机绘制的四个矩形

@Override

protected void onDraw(Canvas canvas) {

super.onDraw(canvas);

Paint paint = new Paint();

paint.setColor(Color.RED);

paint.setStyle(Style.STROKE);

canvas.drawRect(0, 0, 480, 200, paint);

canvas.drawRect(0, 200, 480, 400, paint);

canvas.drawRect(0, 400, 480, 600, paint);

canvas.drawRect(0, 600, 480, 800, paint);

}

//具体酷炫的操作都写在这里,比如以四个矩形为钢琴键,播放特定音效等等

@Override

public boolean onTouchEvent(MotionEvent event) {

int pointerCount = event.getPointerCount();//获取有多少个手指按下

int actionIndex = event.getActionIndex();//获取手指按下的唯一索引

int action = event.getActionMasked();//获取按键的特征

int id = event.getPointerId(actionIndex);//获取索引

if ((action == MotionEvent.ACTION_DOWN || action == MotionEvent.ACTION_POINTER_DOWN)) {

Log.i("MyView", event.getX(actionIndex)+"-" + event.getY(actionIndex));

}

return true;

}

}

上面程序是不是少了一个onLayout()方法,没错,在此方法里面就可以根据特定手机绘制特定的图形,因为本文具体讲解多点触控,不在于介绍完整的实例故略过。

时间: 2024-10-09 05:13:09

多点触控的相关文章

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

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

android 多点触控

多点触控 1.多点触控从字面意思讲就是你用大于等于2根的手指触摸子啊手机屏幕上. Android中监听触摸事件是onTouchEvent方法,它的参数为MotionEvent,下面列举MotionEvent的一些常用的方法: getPointerCount() 获得触屏的点数. getPointerId(int pointerIndex) 返回一个触摸点的标示,pointIndex是你第几个触控点的索引 getX() 获得触屏的X坐标值 getY() 获得触屏的Y坐标值 getAction()

Android实现图片多点触控自由伸缩

简介 作为Android开发者,我们经常需要自定义控件,比如下面我们说的实现图片的多点触控和伸缩释放,这也是由于用户已经有这样的常识了,那就是看见有图片的地方就可以点击查看大图,并且可以通过手指对图片进行伸缩和移动,如果应用没有实现这一点,那么对用户来说将会是很糟糕的体验,用户很"愤怒".所以作为Android开发者,我们的任务就是让用户"爽".哈哈哈....下面我们将通过自定义ImageView实现以上功能. 涉及技术 一.Matrix(矩阵),Android是通

(五)多点触控之兼容ViewPager

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

Cocos2dx 多点触控

1 最容易忽略的东西,对于ios平台,须得设置glView的属性: [__glView setMultipleTouchEnabled:YES]; 2 如果调用CCLayer的方法setTouchEnabled,则不需要手动加touchDelegate,因为这个函数里会自动做这些事情. 3 如果调用CCLayer的方法setTouchEnabled,之前可以调用一个设置多点或单点的函数来控制setTouchEnable的注册行为,这个函数是: setTouchMode 4 也可以直接调用 coc

Cocos2d-x3.2 多点触控

//GameScene.h #include "cocos2d.h" USING_NS_CC; class GameScene : public cocos2d::Layer { public:     static cocos2d::Scene* createScene();          virtual bool init();          virtual void onTouchesBegan(const std::vector<Touch*>& t

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

MultiTouch————多点触控,伸缩图片,变换图片位置

前言:当今的手机都支持多点触控功能(可以进行图片伸缩,变换位置),但是我们程序员要怎样结合硬件去实现这个功能呢? 跟随我一起,来学习这个功能 国际惯例:先上DEMO免费下载地址:http://download.csdn.net/detail/cnwutianhao/9443667 示例图片: 我是用Genymotion录制的,没有真机上多点触控显示的效果那么好,大家在真机上跑程序,会体会到多点触控功能.(注:Genymotion多点触控快捷键是 ctrl+鼠标指针上下拖动) 具体代码实现: 布局

Android实现多点触控,自由缩放图片

Android多点触控涉及到的知识点 1.ScaleGestureDetector 2.OnScaleGestureListener 3.Matrix 4.OnTouchListener 四个知识点需要了解一下,需要注意的是Matrix在内存中是一个一维数组,操控图片的Matrxi是一个3X3的矩阵,在内存中也就是一个大小为9的一维数组. 实现多点触控,自由变化图片 1. ImageView的基础上继承 2.因为要在图片加载完成就获取到相关的属性,所以实现OnGlobalLayoutListen

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

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