View的事件体系---V3.1 View基础知识

2024-05-12 11:08

本文主要是介绍View的事件体系---V3.1 View基础知识,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

  • 什么是View
    • View是Android中所有控件的基类,像我们平时用到的Button TextView都继承自View。
    • 同时,像RelativeLayout LinearLayout等ViewGroup也同样继承于View,ViewGroup内部同时可以包含多个子View,并且这个子View同样还可以是ViewGroup。继承关系如下
    • View是一种界面层的控件的一种抽象。
  • View的位置参数
    • View的位置主要由它的四个顶点决定的,分别对应View的四个属性:top left bottom right。其中top是左上角纵坐标,left是左上角横坐标,right是右上角横坐标,bottom是右下角纵坐标。
    • 这些坐标都是相对于View的父容器来说的,因此是一种相对坐标。示例如下:
    • 根据图可以得出View的宽高和坐标之间的关系
      • width = right - left;
      • height = bottom - top;
    • 这四个点的坐标可以通过getLeft() getRight() getBottom() getTop()四个方法来获取到
    • 从Android3.0开始,View增加了几个额外的参数:x y translationX translationY,其中x y分别对应View左上角的坐标,translationX translationY是View左上角相对于父容器的偏移量,这几个参数也是相对于父容器的坐标,并且translationX translationY的默认值为0,和View的四个基本的位置参数一样,View也为他们提供了get/set方法,对应关系如下:
      • x = left + translationX;
      • y = top+ translationY;
    • 需要注意的是,View在平移的过程中,top left表示的原始左上角的位置信息,其值不会改变,此时发生改变的是x y translationX translationY四个值。
  • MotionEvent和TouchSlop
    • MotionEvent
      • 在手指触摸屏幕所产生的一些列事件中,典型的事件类型有以下三种:
        • MotionEvent.ACTION_DOWN---手指刚触摸屏幕,按下操作
        • MotionEvent.ACTION_UP---手指从屏幕上松开的一瞬间
        • MotionEvent.ACTION_MOVE---手指在屏幕上滑动
      • 通过motionEvent对象我们可以得到点击事件发生的x y坐标
        • getX() getY()返回的是相对于当前View左上角的x和y坐标
        • getRawX() getRawY()返回的是相对于手机屏幕左上角的x和y坐标
    • TouchSlop
      • TouchSlop是系统所能识别的被认为是滑动的最小距离,也就是说当手指在屏幕上进行滑动时,如果滑动距离小于这个数,那么系统不会认为这是一次滑动。
      • 这是一个常量,和设备有关,也就是说在不同的设备上,这个值可能是不一样的,获取这个值的方式为:ViewConfiguration.get(context).getScaledTouchSlop()
      • 可以帮助我们有效的处理用户滑动事件,这个值可以在frameworks/base/core/res/res/values/config.xml中找到
  • VelocityTracker GestureDetector和Scroller
    • VelocityTracker
      • 速度追踪,用于追踪手指在滑动过程中的速度,包括水平和垂直速度。
      • 使用比较简单,如下:VelocityTracker velocityTracker = VelocityTracker.obtain();   velocityTracker.addMovement(event);
      • 当我们想要知道当前速度的时候,可以采用如下方式:
        • velocityTracker.computeCurrentVelocity(1000);
        • int xVelocity = (int) velocityTracker.getXVelocity();
        • int yVelocity = (int) velocityTracker.getYVelocity();
      • 需要注意两点
        • 在获取当前速度之前必须先要计算速度
        • 这里的速度指手指一段时间内滑过的像素数,比如将时间设置为1000ms,取到的就是在1S内手指滑过得像素数,加入水平方向滑过100像素,那么这个水平速度就是100.
      • 当手指从左往右滑,速度为正值,从右向左滑为负值,上下同理。计算公式为:速度 = (终点位置 - 起点位置)/时间段
      • 当不需要使用的时候,需要调用clear方法来重置并回收内存。
        • velocityTracker.clear();
        • velocityTracker.recycle();
    • GestureDetector
      • 手势检测,用于辅助检测用户的单击 双击 长按 滑动等行为,使用也挺简单的。
      • 首先创建一个GestureDetector对象,并实现onGestureListener接口,根据需要,还可以实现onDoubleTapListener从而监听双击行为。如下
        • GestureDetector gestureDetector = new GestureDetector(this, new GestureDetector.OnGestureListener() {/*** 手指轻轻触摸屏幕的一瞬间,1个Action_down触发* @param e* @return*/@Overridepublic boolean onDown(MotionEvent e) {return false;}/*** 手指轻轻触摸屏幕,尚未松开或拖动,由1个Action_down触发* 与onDown相比,强调的是没有松开或者拖动的状态* @param e*/@Overridepublic void onShowPress(MotionEvent e) {}/*** 手指松开,伴随1个action_up* @param e* @return*/@Overridepublic boolean onSingleTapUp(MotionEvent e) {return false;}/*** 手指按下屏幕并拖动,1个ACTION_DOWN N个ACTION_MOVE* @param e1* @param e2* @param distanceX* @param distanceY* @return*/@Overridepublic boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {return false;}/*** 长按屏幕* @param e*/@Overridepublic void onLongPress(MotionEvent e) {}/*** 手指按下触摸屏,快速滑动后松开,强调的是快速滑动行为* @param e1* @param e2* @param velocityX* @param velocityY* @return*/@Overridepublic boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {return false;}});GestureDetector.OnDoubleTapListener onDoubleTapListener = new GestureDetector.OnDoubleTapListener() {/*** 严格的单击行为* 和onSingleTapUp的区别为,如果触发了onSingleTapConfirmed,那么后面不可能在紧跟着另外一个单击行为,* 这只可能是单击,而不是双击中的一次单击* @param e* @return*/@Overridepublic boolean onSingleTapConfirmed(MotionEvent e) {return false;}/*** 双击 两次连续的单击构成,不可能和onSingleTapConfirmed并存* @param e* @return*/@Overridepublic boolean onDoubleTap(MotionEvent e) {return false;}/*** 表示发生了双击行为,在双击的期间,ACTION_DOWN ACTION_MOVE ACTION_UP都会触发此回调* @param e* @return*/@Overridepublic boolean onDoubleTapEvent(MotionEvent e) {return false;}};


      • 在实际开发中,可以不使用GestureDetector,完全可以自己在View的onTouchEvent中实现自己的需求。建议,如果只是监听滑动行为,自己在onTouchEvent中实现,如果有双击行为的话,通过gesturedector来实现。
    • Scroller
      • 弹性滑动对象,用于实现View的弹性滑动
      • scrolleTo/scrollBy方法实现滑动,是瞬间完成的,没有过度效果
      • 使用Scroller对象来实现由过渡效果的滑动,需要和View的compuScroll方法配合使用完成,模板代码如下:
        • private void init(Context context){mScroller = new Scroller(context);}private void smoothScrollTo(int destX,int destY){int scrollX = getScrollX();int scrollY = getScrollY();mScroller.startScroll(scrollX,scrollY,destX,destY);invalidate();}@Overridepublic void computeScroll() {if(mScroller.computeScrollOffset()){scrollTo(mScroller.getCurrX(),mScroller.getCurrY());postInvalidate();}}

这篇关于View的事件体系---V3.1 View基础知识的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/982451

相关文章

C#如何动态创建Label,及动态label事件

《C#如何动态创建Label,及动态label事件》:本文主要介绍C#如何动态创建Label,及动态label事件,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C#如何动态创建Label,及动态label事件第一点:switch中的生成我们的label事件接着,

spring @EventListener 事件与监听的示例详解

《spring@EventListener事件与监听的示例详解》本文介绍了自定义Spring事件和监听器的方法,包括如何发布事件、监听事件以及如何处理异步事件,通过示例代码和日志,展示了事件的顺序... 目录1、自定义Application Event2、自定义监听3、测试4、源代码5、其他5.1 顺序执行

Python中的异步:async 和 await以及操作中的事件循环、回调和异常

《Python中的异步:async和await以及操作中的事件循环、回调和异常》在现代编程中,异步操作在处理I/O密集型任务时,可以显著提高程序的性能和响应速度,Python提供了asyn... 目录引言什么是异步操作?python 中的异步编程基础async 和 await 关键字asyncio 模块理论

linux-基础知识3

打包和压缩 zip 安装zip软件包 yum -y install zip unzip 压缩打包命令: zip -q -r -d -u 压缩包文件名 目录和文件名列表 -q:不显示命令执行过程-r:递归处理,打包各级子目录和文件-u:把文件增加/替换到压缩包中-d:从压缩包中删除指定的文件 解压:unzip 压缩包名 打包文件 把压缩包从服务器下载到本地 把压缩包上传到服务器(zip

禁止平板,iPad长按弹出默认菜单事件

通过监控按下抬起时间差来禁止弹出事件,把以下代码写在要禁止的页面的页面加载事件里面即可     var date;document.addEventListener('touchstart', event => {date = new Date().getTime();});document.addEventListener('touchend', event => {if (new

计组基础知识

操作系统的特征 并发共享虚拟异步 操作系统的功能 1、资源分配,资源回收硬件资源 CPU、内存、硬盘、I/O设备。2、为应⽤程序提供服务操作系统将硬件资源的操作封装起来,提供相对统⼀的接⼝(系统调⽤)供开发者调⽤。3、管理应⽤程序即控制进程的⽣命周期:进程开始时的环境配置和资源分配、进程结束后的资源回收、进程调度等。4、操作系统内核的功能(1)进程调度能⼒: 管理进程、线

go基础知识归纳总结

无缓冲的 channel 和有缓冲的 channel 的区别? 在 Go 语言中,channel 是用来在 goroutines 之间传递数据的主要机制。它们有两种类型:无缓冲的 channel 和有缓冲的 channel。 无缓冲的 channel 行为:无缓冲的 channel 是一种同步的通信方式,发送和接收必须同时发生。如果一个 goroutine 试图通过无缓冲 channel

java常用面试题-基础知识分享

什么是Java? Java是一种高级编程语言,旨在提供跨平台的解决方案。它是一种面向对象的语言,具有简单、结构化、可移植、可靠、安全等特点。 Java的主要特点是什么? Java的主要特点包括: 简单性:Java的语法相对简单,易于学习和使用。面向对象:Java是一种完全面向对象的语言,支持封装、继承和多态。跨平台性:Java的程序可以在不同的操作系统上运行,称为"Write once,

FreeRTOS内部机制学习03(事件组内部机制)

文章目录 事件组使用的场景事件组的核心以及Set事件API做的事情事件组的特殊之处事件组为什么不关闭中断xEventGroupSetBitsFromISR内部是怎么做的? 事件组使用的场景 学校组织秋游,组长在等待: 张三:我到了 李四:我到了 王五:我到了 组长说:好,大家都到齐了,出发! 秋游回来第二天就要提交一篇心得报告,组长在焦急等待:张三、李四、王五谁先写好就交谁的

【经验交流】修复系统事件查看器启动不能时出现的4201错误

方法1,取得『%SystemRoot%\LogFiles』文件夹和『%SystemRoot%\System32\wbem』文件夹的权限(包括这两个文件夹的所有子文件夹的权限),简单点说,就是使你当前的帐户拥有这两个文件夹以及它们的子文件夹的绝对控制权限。这是最简单的方法,不少老外说,这样一弄,倒是解决了问题。不过对我的系统,没用; 方法2,以不带网络的安全模式启动,运行命令行,输入“ne