首页 文章 精选 留言 我的

精选列表

搜索[android studio],共10000篇文章
优秀的个人博客,低调大师

Android自定义View探索(三)—事件分发机制与滑动冲突处理

View的事件分发机制,其实就是对MotionEvent事件的分发机制,即当一个MotionEvent产生了以后,系统需要把这个事件传递给一个具体的View,这个传递的过程就是分发过程。 一.View的事件分发机制 整体流程: dispatchTouchEvent()—>onTouch()—>onTouchEvent()—>onClick() dispatchTouchEvent():View事件分发的入口,返回值表示MotionEvent是否被消费。 onTouch():View需要处理事件时,如果它设置了onTouchListener,那么onTouchListener中的onTouch方法会被调用。如果onTouch方法返回false,那么View的onTouchEvent()方法会被调用;如果onTouch方法返回true,那么View的onTouchEvent()方法将不会被调用。onTouch()的优先级比onTouchEvent()的优先级更高。 onTouchEvent():View自身对于Touch处理的实现 ,返回结果表示是否消耗当前事件。 onClick() : View的onTouchEvent()的优先级比onClick()高,用于处理clickListener设置的点击事件。 二.ViewGroup的事件分发机制 整体流程: 图片来自 谷歌的小弟 当一个点击事件产生以后,它的传递过程遵循如下顺序:Activity—>Window—>外层ViewGroup。 外层ViewGroup接收到事件以后,就会按照事件分发机制去分发事件。如果这个ViewGroup的onInterceptTouchEvent()方法返回true,就表示它要拦截当前事件,接着事件就会交给这个ViewGroup来处理;如果这个ViewGroup的onInterceptTouchEvent()方法返回false,就表示它不拦截当前事件,接着事件就会交给它的子元素来处理。如果一个View的onTouchEvent()返回false,那么它的父容器的onTouchEvent()就会被调用。以此类推,如果所有的元素都不处理这个事件,那么这个事件最终会传递给Activity处理,即Activity的onTouchEvent()方法会调用。 三.相关知识点 1.同一个事件序列是指从手指接触屏幕的那一刻起,到手指离开屏幕的那一刻结束,在这个过程中所产生的一系列事件,这个事件序列以down事件开始,中间含有不定量的move事件,最终以up事件结束。 2.某个View一旦决定拦截,那么这一事件序列都只能由它来处理(如果事件序列能够传递给它的话),并且它的onInterceptTouchEvent()不会再被调用,这是因为系统会将同一事件序列内的其他方法都交给他处理。 3.某个View一旦开始处理事件,如果它不消耗ACTION_DOWN事件(onTouchEvent方法返回了false),那么同一事件序列中的其他事件都不会交给它来处理,并且事件将重新交给它的父元素处理,即父元素的onTouchEvent会被调用。 4.ViewGroup默认不拦截任何事件,即默认onInterceptTouchEvent返回false。View没有onInterceptTouchEvent方法,一旦有事件传递给它,它的 onTouchEvent方法就会调用。 5.事件传递过程是由外向内的,即事件总是先传递给父元素,然后再由父元素分发给子View,通过requestDisallowInterceptTouchEvent方法可以在子元素中干预父元素的分发过程,但是ACTION_DOWN事件除外。 四.滑动冲突的处理 内部拦截法:子View禁止父View拦截Touch事件 内部拦截法是指父容器不拦截任何事件,所有的事件都传递给子元素,如果子元素需要此事件就直接消耗掉,否则就交给父容器处理。让子View调用requestDisallowInterceptTouchEvent( )禁止父View对Touch的拦截即可,这样就可以解决滑动冲突的问题。 外部拦截法:父View中准确地进行事件分发和拦截 外部拦截法是指点击事件都先经过父容器拦截处理,如果父容器需要此事件就拦截,如果不需要就不拦截。我们可以重写父View中与Touch事件分发相关的方法—–onInterceptTouchEvent( )来进行处理,这样就可以解决滑动冲突的问题。

优秀的个人博客,低调大师

Mac系统下利用ADB命令连接android手机并进行文件操作

1 获取序列号:adb get-serialno 2 查看连接计算机的设备:adb devices 3 重启机器:adb reboot 4 重启到bootloader,即刷机模式:adb reboot bootloader 5 重启到recovery,即恢复模式:adb reboot recovery 6 查看log:adb logcat 7 终止adb服务进程:adb kill-server 8 重启adb服务进程:adb start-server 9 获取机器MAC地址:adb shell cat /sys/class/net/wlan0/address 10 获取CPU序列号:adb shell cat /proc/cpuinfo 11 安装APK:adb install <apkfile> //比如:adb install baidu.apk 12 保留数据和缓存文件,重新安装apk:adb install -r <apkfile> //比如:adb install -r baidu.apk 13 安装apk到sd卡:adb install -s <apkfile> // 比如:adb install -s baidu.apk 14 卸载APK:adb uninstall <package> //比如:adb uninstall com.baidu.search 15 卸载app但保留数据和缓存文件:adb uninstall -k <package> //比如:adb uninstall -k com.baidu.search 16 启动应用:adb shell am start -n <package_name>/.<activity_class_name> 17 查看设备cpu和内存占用情况:adb shell top 18 查看占用内存前6的app:adb shell top -m 6 19 刷新一次内存信息,然后返回:adb shell top -n 1 20 查询各进程内存使用情况:adb shell procrank 21 杀死一个进程:adb shell kill [pid] 22 查看进程列表:adb shell ps 23 查看指定进程状态:adb shell ps -x [PID] 24 查看后台services信息:adb shell service list 25 查看当前内存占用:adb shell cat /proc/meminfo 26 查看IO内存分区:adb shell cat /proc/iomem 27 将system分区重新挂载为可读写分区:adb remount 28 从本地复制文件到设备:adb push <local> <remote> 29 从设备复制文件到本地:adb pull <remote> <local> 30 列出目录下的文件和文件夹,等同于dos中的dir命令:adb shell ls 31 进入文件夹,等同于dos中的cd 命令:adb shell cd <folder> 32 重命名文件:adb shell rename path/oldfilename path/newfilename 33 删除system/avi.apk:adb shell rm /system/avi.apk 34 删除文件夹及其下面所有文件:adb shell rm -r <folder> 35 移动文件:adb shell mv path/file newpath/file 36 设置文件权限:adb shell chmod 777 /system/fonts/DroidSansFallback.ttf 37 新建文件夹:adb shell mkdir path/foldelname 38 查看文件内容:adb shell cat <file> 39 查看wifi密码:adb shell cat /data/misc/wifi/*.conf 40 清除log缓存:adb logcat -c 41 查看bug报告:adb bugreport 42 获取设备名称:adb shell cat /system/build.prop 43 查看ADB帮助:adb help 44 跑monkey:adb shell monkey -v -p your.package.name 500

优秀的个人博客,低调大师

Android ANR 排查实战:从线上告警到主线程卡点定位

线上 ANR 率突然从 0.03% 涨到 0.4%,监控平台一堆 "Input dispatching timed out",但堆栈五花八门,主线程有时停在 nativePollOnce,有时停在一个看似无害的 getSharedPreferences。这类问题的难点在于:ANR 的堆栈往往是"受害者现场",不是"凶手现场"。本文以一次真实的线上 ANR 治理为主线,梳理从告警、trace 分析、卡点归因到修复验证的完整排查路径。

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

用户登录
用户注册