多点触控

简介: 多点触控

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()方法,没错,在此方法里面就可以根据特定手机绘制特定的图形,因为本文具体讲解多点触控,不在于介绍完整的实例故略过。

相关文章
|
7月前
|
XML 存储 Android开发
Android系统 添加动态控制USB TP触摸方向、触摸唤醒
Android系统 添加动态控制USB TP触摸方向、触摸唤醒
255 0
触摸屏模拟按键
该项目较为简单,功能需求是用触摸屏模拟20个按键,按下一次打开继电器,再次按下关闭继电器,最多可以同时打开三个,主页面能够显示总电流I。
99 1
|
存储 Android开发 索引
【Android 应用开发】多点触控 ( 多点触控事件 | PointerId | PointerIndex | 坐标获取 | 触摸点个数 )
【Android 应用开发】多点触控 ( 多点触控事件 | PointerId | PointerIndex | 坐标获取 | 触摸点个数 )
397 0
多点触控与多鼠标支持
原文:多点触控与多鼠标支持 多点触控与多鼠标支持   最进将工作流平台进行了升级,除了用WF4重新构建了后台,最大的改变就是全部图形化了用户界面 原计划在用户界面中全面启用多点触控技术,但发现多点触控的效果没有想象中的那么绚.
1093 0
|
容器
多点触摸操作
原文:多点触摸操作 版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/m0_37591671/article/details/69487226 1.
812 0
|
C# Windows
触摸屏:屏幕键盘(虚拟键盘)解决方案
原文:触摸屏:屏幕键盘(虚拟键盘)解决方案  最近需要在win XP系统的工控机上进行程序的开发,工控机是电阻式触摸屏,需要在上面使用触摸键盘,使工控机可以脱离鼠标和键盘独立运行程序。调研后得到一系列的解决方案,mark如下: (1)自己在程序中开发虚拟键盘 这个是最先想到的,本人用C#进行开发,所以只关注C#相关的虚拟键盘开发。
2580 0
|
存储 Android开发 iOS开发