多点触控

简介: 多点触控

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

相关文章
|
安全 JavaScript 前端开发
QML信号与信号槽实践指南:轻松掌握现代软件开发的关键技术(三)
QML信号与信号槽实践指南:轻松掌握现代软件开发的关键技术
332 0
|
2月前
|
JSON 人工智能 数据挖掘
LLM开发者必备:掌握21种分块策略让RAG应用性能翻倍
本文将系统介绍21种文本分块策略,从基础方法到高级技术,并详细分析每种策略的适用场景,以帮助开发者构建更加可靠的RAG系统。
197 0
LLM开发者必备:掌握21种分块策略让RAG应用性能翻倍
|
2月前
|
缓存 网络安全 PHP
解决 Laravel PHP Warning: PHP Startup: Unable to load dynamic library ‘zip.so’ 报错问题以及关于php版本混淆问题-深度详解优雅草卓伊凡
解决 Laravel PHP Warning: PHP Startup: Unable to load dynamic library ‘zip.so’ 报错问题以及关于php版本混淆问题-深度详解优雅草卓伊凡
95 6
|
2月前
|
传感器 人工智能 运维
AI驱动的智能设备健康评估系统究竟如何应对企业运维挑战?
AI驱动的智能设备健康评估系统通过人工智能技术实现设备状态的主动监测和预测性维护。该系统由Prompt规则库、评估任务触发机制、Agent执行等核心组件构成,能够自动获取数据、智能分析设备状态并生成可视化报告。相比传统运维方式,系统具有规则灵活定义、低成本集成、高阶智能分析等优势,适用于能耗监测、异常检测、预测性维护等多种工业场景。产品专家三桥君通过详细解析系统工作流程和实际案例,展示了如何帮助企业实现从"事后维护"到"预测性运维"的智能化转型。
121 0
|
3月前
|
XML 数据格式
QQ群聊天网警已经介入,最新QQ xml卡片生成器,装逼娱乐神器代码
本项目为QQ卡片XML生成器,包含核心生成器、卡片增强器和主程序界面。支持多种样式、动态效果与主题,代码超过300行,适合学习参考。
|
5月前
|
机器学习/深度学习 数据可视化 机器人
比扩散策略更高效的生成模型:流匹配的理论基础与Pytorch代码实现
扩散模型和流匹配是生成高分辨率数据(如图像和机器人轨迹)的先进技术。扩散模型通过逐步去噪生成数据,其代表应用Stable Diffusion已扩展至机器人学领域形成“扩散策略”。流匹配作为更通用的方法,通过学习时间依赖的速度场将噪声转化为目标分布,适用于图像生成和机器人轨迹生成,且通常以较少资源实现更快生成。 本文深入解析流匹配在图像生成中的应用,核心思想是将图像视为随机变量的实现,并通过速度场将源分布转换为目标分布。文中提供了一维模型训练实例,展示了如何用神经网络学习速度场,以及使用最大均值差异(MMD)改进训练效果。与扩散模型相比,流匹配结构简单,资源需求低,适合多模态分布生成。
333 13
比扩散策略更高效的生成模型:流匹配的理论基础与Pytorch代码实现
|
7月前
|
人工智能 自然语言处理 供应链
《DeepSeek:工业互联网与人工智能融合的“催化剂”》
在工业4.0和智能制造的浪潮下,DeepSeek技术作为工业互联网与人工智能融合的“催化剂”,通过智能数据处理、精准建模预测、智能决策支持及智能交互,全面优化生产流程,提升企业竞争力。它能高效处理多源异构数据,挖掘关键信息,预测设备故障,提供科学决策建议,并简化操作流程,推动制造业向智能化、高效化、绿色化方向迈进,引领工业互联网新时代的发展潮流。
183 5
《DeepSeek:工业互联网与人工智能融合的“催化剂”》
|
6月前
|
搜索推荐 API SEO
WordPress上 好用的自动别名插件
这款插件支持为文章、页面、标签、分类等设置个性化别名,提升网站在搜索引擎中的排名。主要功能包括:自动别名生成(随机字符串、拼音、英文翻译三种规则),兼容自定义内容类型,可重新生成别名确保一致性。通过简单配置,用户能轻松优化URL结构,提高SEO效果。产品截图展示了设置界面及不同别名类型的使用场景。
108 0
|
8月前
|
人工智能 运维 应用服务中间件
OS Copilot测评报告
作为一名全栈开发,我在日常维护阿里云服务器时遇到了不少Linux操作难题。最近尝试了阿里云推出的OS Copilot,基于大模型的AI助手,大大简化了运维工作。通过简单的对话式命令,如“co nginx是否安装”和“co 将nginx设置为开启自启动 -t”,轻松完成任务。甚至可以通过文件定义复杂任务,如解析日志并提取攻击IP。OS Copilot显著提升了效率,降低了学习成本,真是运维利器!
135 24
|
7月前
|
传感器 人工智能 数据可视化
数字孪生高效赋能,打造水利新质生产力
数字孪生水利运用云计算、大数据、AI、实景三维等技术,实现江河水库等水利工程的可视化展示与智能化模拟。通过三维可视化和实时数据映射,平台提供智能感知、分析、预测和预演功能,支持监测预警、调度优化及灾害预防,助力提升水利管理水平,保障水安全。