葡京网上娱乐场Android集结号

描绘为 Android 开发者的歪曲使用手册

点击打开链接
毫无疑问,混淆是包裹过程遭到不过要的流水线有,在未曾异常原因之状态下,所有
app 都应有打开混淆。
首先,这里说之的混淆其实是包括了代码压缩、代码混淆和资源减少等之优化过程。依靠
ProGuard,混淆流程将主项目和借助库中未吃以的类、类成员、方法、属性移除,这有助于规避
64K
方法数之瓶颈;同时,将看似、类成员、方法还命名也无意义之简易名称,增加

Android彻底组件化demo发布


(本文提出的组件化方案都开源,参见Android彻底组件化开源项目)
今年6月份起,我开当对“得到app”的android代码进行组件化拆分,在着手前自己查了众组件化或者模块化的稿子,虽然发一些收获,但是老少来成文能吃来一个整都实用之方案,大部分章还不过待在组件…

Android OpenGL ES 2.0 完全入门(三):2D
纹理的剪裁、翻转、旋转、缩放


自家于上年六月份学习了 OpenGL 的组成部分基本概念,整理了一个 demo
和有限篇稿子,并在当年六月份习修正了同样胡。不久前本人越为铁蕾兄学习了季种常用
2D
纹理变换的兑现思路(以及本文中之旁总结性文字),由于铁蕾兄实在极度忙碌,无暇快速整理成文,因此自哪怕当这里也外代笔了
🙂

最为完美总结 Android WebView与 JS
的交互方式(含实例Demo)


前言 现行众多App里都停放了Web网页(Hyprid
App),比如说多电商平台,淘宝、京东、聚划算等等,如下图 京东首页
上述功能是由于Android的WebView实现之,其中提到到Android客户端和Web网页交互的实现
今天自家用通盘介绍Android通过WebVie…

Android
存储路径而了解多少


Android 存储路径而打探小

高仿微信视频录制, 涂鸦水印添加, 基于 ffmpeg
视频编辑


意义要包含 5 点:

  1. 据悉 ffmpeg 的视频拍摄和合成;
  2. 打定义拍摄按钮, 长按放大并且显示拍摄进度;
  3. 从今定义 view, 实现手绘涂鸦;
  4. 由定义可触摸旋转缩放位移的神气文 view;
  5. 冲 ffmpeg 的图纸以及视频合成处理.
[初探Android中Window与DecorView](https://link.jianshu.com?t=https%3A%2F%2Fjuejin.im%2Fentry%2F59bf4716f265da06560452ef)

Android中View可以说凡是无比重要之几独地方有,包括事件分发,测量,绘制等等,都是挺广的状态。那么我们只要想要得掌握这些文化,就得深刻了解Andorid整个View从初始交形成所经历之同一多级工作。本文分析的源代码均来自Android
API 24。

【Android】状态栏颜色的适配


除了 Mi UI 其他厂商也起定制,Flyme,EMUI,Color OS 以及同加的氢
OS,Smartisan OS 等等,每款定制 ROM 都发夫异常之处在,不过个人都习以为常了
Mi UI。
MI UI 一个挺好的体会就是状态的字能够变色,黑色变白色,白色变黑色。

自一行代码都非写实现Toolbar!你倒是还于封装BaseActivity?


初稿地址:
https://juejin.im/post/590f09ec128fe100584ee6b0
前言 距离 上篇稿子
的上时已经仙逝少单多月份了,这点儿个月时里自己无写篇可一直在更新着自己之
MVPArms 框架,让他逐渐向 可配置化集成框架 发展 就以前段时间我…

Android 热修复 – 微信
Tinker


概括便捷集成微信热修复 Tinker

立即不是沉浸式状态栏


前言 首先请大家看几乎摆设图:
以上之机能,一般我们统称为沉浸式状态栏。其实,这种叫法不是那个准确,而且为尚无沉浸式状态栏及时同一说,只有沉浸模式。以上几乎种植情况,可以叫透明状态栏或者状态栏着色。
一、两栽状态
进行Android开发时,有些许栽方法都见面对状态栏进行安装:Translucen…

高级UI特效仿直播点赞效果—一个优美炫酷的点赞动画


Android下载文件(一)下充斥进度&断点续传


起接触Android开发至今也赶紧半年了,一路动过来好说凡是立于巨人的肩上前进,真的挺感激吗初步源世界作出贡献的丁。话说回来,搞了如此久之支付可直接于于是他人的劳动成果也未是扭曲事,所以我说了算写几篇稿子分享自己本着Android下载文件的知情,并在结尾整合并开源一个框架,也是针对自己于And…

Android匿名共享内存(Ashmem)原理


读书之前,不妨先琢磨一个问题,在Android系统受到,APP端View视图的多寡是怎传递SurfaceFlinger服务的吗?View绘制的数目最终是按一帧一帧显示到屏幕的,而诸一样轴都见面占有一定之积存空间,在APP端执行draw的下,数据好明朗是如绘制到APP的经过空间,…

动 RecyclerView 实现 Gallery 画廊效果,并控制 Item
停留位置


RecyclerView
作为一个列表滑动控件,我们都晓得它们既是可以横向滑动,也足以竖直滑动,可以兑现线性布局管理,瀑布流布局管理,还有
GridView 布局管理。其实我们得以决定该 Item
的待位置,并使其落实画廊效果。如果大家耳熟能详 SnapHelper
的语,估计大家便…

Android Studio 3.0
新职能解析及老路适配


上周四,Google 终于在经验多年的打磨锤炼之后正式宣布 Android Studio 3.0
版本,给大安卓开发人员一卖满意的答卷。如往昔一致,每次新版开发工具的颁布,很多竞点的情人以担心稳定性、是否是坑等题材,选择隔岸观火,等一段时间再创新提升。
经过查阅官网对新…

unity3d与android交互


简述 实现unity3d导出到android
studio工程并封装为library,供其他工程导入module直接利用。最终效果:
点击ZoomIn、ZoomOut的按钮,通过android端调用unity中艺术,进行放大放小;
触摸unity中之3D立方体,调用androi…

玩转APK:实现Android
APK瘦身99.99%


摘要: 如何瘦身是 APK 的重要性优化技术。APK
在装置以及换代时还急需经过网络下充斥到设备,APK
越聊,用户体验更加好。本文作者通过对 APK 内在机制的事无巨细剖析,给起了针对性 APK
各做成分的优化措施与技术,并落实了一个着力 APK 的极度小化过程。

开源整理:有趣之Android动画交互设计


诸君同学,早上好,今天让大家推荐几独口碑不错且在Github上开源之代码库,如果想为祥和的App在竞相动画方面变得还有趣,学习一下这些开源项目的代码用见面针对您拥有裨益。
https://github.com/googlesamples/android-topeka
Topeka是…

MIUI 系统 BUG,Android
调用相机崩溃?将拍适配方案展开到底!


提起 Android 调用系统相机拍摄上污染图片或是展示图片,想必任何一样个开
Android
的冤家还未会见生,基本是效果已经包含各个应用了,今天,我哪怕来叫大家聊网上并无多见也又每每坏操蛋的
Android 7.0 相机适配…

看望购买区三级联动选择器


经过几个 APP 的开支,发现多每个 APP
都来这么一个需,那就是看看购买区三级地址之选,一般还要求近乎于 iOS
的滚轮实现,在 github
上面找了部分开源控件实现了瞬间,发现会产出部分题材,所以便打算自己包装一个,直接坐数据源,不欲自己还手动设置数据了,一行代码搞定一个都市选择功能。

有矣这些 Chrome
插件,效率提升10倍


Chrome
浏览器被广大程序员的钟爱,把它叫一庙浏览器革命毫不为过。而它的插件能够极大地提高生产效率,笔者把好时常应用的觉得没错的插件分享给大家,同时欢迎大家推荐更多更好玩的插件。
0、Proxy SwitchyOmega Proxy SwitchyOmega 是科…

一对有关加速 Gradle
构建的私经历


脚下大部分的 Android 项目都是依据 Grale 了,因为 Gradle
确实于咱带来了过多有利,然而,在采取了 Gradle
后,最特别的缺憾就是编译起来最为慢了。解决慢的题目无非有些许种植方法

升级硬件配备,选择 CPU 和内存和硬盘等更不错的硬件
于软件方面,减少非必要的耗时,充分利用现有机器的属性。
正文的机要经验围绕着怎样减少非必要之耗时操作以及哪些充分利用机器性能进行。

RecyclerView
使用攻略(刷新篇)


进而《RecyclerView
使用攻略(助力篇)》之后,一直没创新上下拉刷新的效益实现,主要要受限于民用现有的技术实力,总看没有经实际打磨的,就无敢发出演的自信。虽说本曾经引用到祥和之类型及了,但要得继续跟进优化的。

列要求讨论 – RecycleView
分页加载实现分析


坐品种要,需要贯彻 RecycleView
分页加载功能,看博文章要还是一直封装好,拿来被别人用,而尚未证实是切实可行怎么落实,就自己写了平等篇分析的。

Android布局优化技术


一.整规格:减少布局层次,加快渲染速度
尽量避免RelativeLayout嵌套RelativeLayout 二.重用
标签可以在一个搭架子中引入另外一个搭架子,重用共同的布局文件。
比如说共同的标题栏common_title.xml <…

Android彻底组件化方案实施


种类提高至一定程度,随着人口之增多,代码越来越臃肿,这时候就非得开展模块化的拆分。在我看来,模块化是相同栽点意见,其核心思想就是分而治之、降低耦合。而以Android工程被哪尽,目前发少数种植途径,也是少不胜山头,一个凡组件化,一个是插件化。
组件化是一个一体化为?去矣头与手臂还会…

Android中View的绘图流程


View的绘图流程是从ViewRootImpl的performTraversals方法开始,它通过measure、layout和draw三独经过才会最终将一个View绘制出来。
1、measure,即测量的意思,measure方法是当View中,它是final类型,意味着and…

android强大的SpannableStringBuilder


SpannableStringBuilder和SpannableString的分类似与StringBuilder、String,就是SpannableStringBuilder可以凑合,而SpannableString不可拼接。
SpannableStringBuilder和…

Android优化方案的–Fragment的懒加载实现


每当Android应用中,ViewPager是咱不可避免用的一个控件,因为它们好使我们于挤占比较少空间的以,增强内容的丰富性,同时为其中间流淌在Google的血流,所以她几乎成为了各一个App的标配控件。但是,假如ViewPager的各国一个Fragment都要通过网拉取数据加载,而ViewPager是默认加载前片桩的,所以当怪爱导致网络丢包或者网络堵塞等题材,所以Fragment使用懒加载是十分有必不可少之。

Android
中直播视频技术探讨


不久前各种视频直播 app
到处都是,各种霸屏,当然我们吧是得经验的,关于视频直播的软件这里就非介绍了,在未是技巧的人数来拘禁,直播是同等栽潮流,是平种娱乐方式,但是当一个行技术之,我们除了看望,更要紧之凡上学技能,其实
Android
中的视频技术没什么说的,因为网上的素材很多,但是之前的视频技术大部分还出现于了视频播放,就是主流的视频播放器,那个最根本之一个技就是是视频的编解码,这个啊会以继续文章被详尽介绍视频的拍卖技术。但是本直播的技巧是当事先的视频技术达到而发矣一个求就是视频录制,现在录制很多凡是据牛逼的硬件摄像头。但是除了这个技能,还发生任何的我们使用移动装备也足以错过化解是题目。这个累也会见协商如何下设备去录制视频。

Android 开发被哪些动态加载 so
库文件


自身怀念对静态加载 so 库文件,大家都已经非常熟稔了,这里虽非多说了。在
Android 开发被调用动态库文件(*.so)都是经 jni
的不二法门,而静态加载往往是于 apk 或 jar 包中调用so文件时,都要用对承诺 so
文件包进 apk 或 jar 包。 动态加载的优点 …

RecycleView开源项目BRVAH分析


开卷源码对重复好之亮和运开源软件产生惊人之鼎力相助

谈谈 WebView
的使用


座谈 WebView 的下 -(从零开始搭建 android 框架系列(5))

MVP架构开发,一首被您自扣懂到会使用


现在网上有关mvp架构的篇章有许多,但是对于部分休是特地明白这个架构的开发者,不是可怜和睦,所以,我若写一篇博客,通过自的不竭,让大家能又好的接头外,并采取他。下面是自己立片文章使上课的情节。

于咱们于第一管辖初步,一步步倒上前mvp。

5 单 Android
开发被较广泛的内存泄漏问题跟解决办法


以Android程序支付被,当一个靶已经不待还使用了,本该受回收时,而除此以外一个正在利用的目标具备它的援从而致使它不可知给回收,这就是造成该受回收的对象不克于回收而栖于积内存中,内存泄漏就生出了。

由定义粘性下拉刷新


本创 2017年08月09日 19:51:35 编辑 删除
在android中打定义的下拉刷新很常用,尤其是以刷新页面更新数据的时光,b比较炫酷的下拉刷新可以给一个页面比较好之互动体验;
下面先来看…

android中带索引的列表—–索引的高档应用


每当Android中索引无处不在 比如通讯录 方便寻找信息之展示页等
脚介绍一个实用的索引demo

RecyclerView
优雅封装


本着 Android 中 RecyclerView
的幽雅封装,能够落实小耦合的下拉刷新,上拉加载重多,支持类似 ListView
的多 HeaderView、FooterView。扩展性强,能够由定义下拉、上拉个性化
View。

玩转仿探探卡片式滑动效果


玩转仿探探卡片式滑动效果

一个故事讲完
Https


因故事的花样为你介绍网络安全遭受之泛问题

Android
中因物理特性的动画片简介


依据物理特点的动画片依赖让物理学定律,这会在动画中见出冲天的现实感。

好像支付宝首页——RecyclerView
多布局结构实现


大家还知,RecycleView 默认只能够透过 setLayoutManager()
方法指定同栽布局结构,那么像支付宝首页这样复杂的大都布局情况如何处理呢?在
ListView 中,我们啊遇过这种状态,是通过 getItemViewType
结合其他措施,通过判断项目来加载不同的布局。在 RecycleView
中为一样采用,今天咱们要介绍 RecycleView 多布局实现,其中布局嵌套了
GridView,有些坑需要留意,避免陷入。

Android
开发时,那些亲近之工具要网站!


当其实 Android
开发进程真的会来成千上万亲之工具要网站出现,本文是我好的有的分享。

干货 |
Android高级动画(2)


Android高级动画进阶,矢量动画。

2017 Android 最好完美试行总结 –
这些面试题你一定要


涉到了 Android 的成套,引用了诸多资源,也足以当做学习纲要。

Google
官方推出使用开发架构指南


虽说 Android 的架构选择直接还格外轻易,MVP、MVC、MVVM 各发生拥趸。但
Google
最近还是出了一样卖有关使用架构的推行指南,并吃来了一定详尽的手续及部分指建议。希望大家还能看一样押,学习一下,打造更加美好易用的
APP,也为 Android 生态之改良做一点奉献。: )

Android 自定义——点赞效果 (仿
Twitter)


透过自定义控件,意欲效仿 Twitter 的点赞效果。

Android Gradle
常用使用状况实现方式的总


Gradle 作为同样舒缓灵活多变的构建插件,与 Android Studio
的整合,能够化解过去以 Eclipse 开发 App 时所碰到的无数题材。同时,基于
Groove 这样平等缓 DSL
语言的本子特性,记住各种语法显然以是一致桩比较不方便的作业。 事实上,Gradle
插…

从零开始的 Android 新类型 2 – Gradle


相信大家的门类用上 gradle
都已经挺长远了,但因故得争为?本篇文章介绍了因管理,版本号管理,签名保护,Java8
支持,Apk Splits、module aar 等顶尖实践

事件分发机制是Android中杀关键的一个知识点,同时也是难点,相信到目前为止很多Android开发者对事件分发机制并没有一个挺系统的认,当然为包罗博主个人在内。可能在平常底开销工作面临我们并没察觉及事件分发机制起及之来意,其实她是随时是的只是我们不掌握而已,就比如有滑动冲突、点击事件期间的撞等等大多是盖事件分发处理不当导致的。想起了博主大学时举行了一个有些品种,里面就起了滑动冲突之问题,虽然最终在网上一步步拘禁在人家的课程也糊里糊涂的缓解了,但究竟不知其所以然,那么今天就算为我们共同来深切的探讨一下风波分发机制吧。

示例二、在示例一的根基及,让View的onTouchEvent不吃事件频仍之传递流程

搭下去让方的EventDispatchTestView的onTouchEvent返回false:

@Override
public boolean onTouchEvent(MotionEvent event) {
    Log.i(TAG, "onTouchEvent: " + event.getAction() + " | 是否消耗事件:" + false);
    return false;//super.onTouchEvent(event);
}

测试log如下:

01-05 18:18:52.545 10771-10771/cn.codingblock.view I/Activity: dispatchTouchEvent: 0 | 分发事件
01-05 18:18:52.545 10771-10771/cn.codingblock.view I/——Layout: dispatchTouchEvent: 0 | 分发事件
01-05 18:18:52.546 10771-10771/cn.codingblock.view I/——Layout: onInterceptTouchEvent: 0 | 是否拦截:false
01-05 18:18:52.546 10771-10771/cn.codingblock.view I/————View: dispatchTouchEvent: 0 | 分发事件
01-05 18:18:52.546 10771-10771/cn.codingblock.view I/————View: onTouchEvent: 0 | 是否消耗事件:false
01-05 18:18:52.546 10771-10771/cn.codingblock.view I/——Layout: onTouchEvent: 0 | 是否消耗事件:false
01-05 18:18:52.547 10771-10771/cn.codingblock.view I/Activity: onTouchEvent: 0 | 是否消耗事件:true

01-05 18:18:52.629 10771-10771/cn.codingblock.view I/Activity: dispatchTouchEvent: 2 | 分发事件
01-05 18:18:52.629 10771-10771/cn.codingblock.view I/Activity: onTouchEvent: 2 | 是否消耗事件:true

01-05 18:18:52.630 10771-10771/cn.codingblock.view I/Activity: dispatchTouchEvent: 1 | 分发事件
01-05 18:18:52.630 10771-10771/cn.codingblock.view I/Activity: onTouchEvent: 1 | 是否消耗事件:true

当View的onTouchEvent不吃事件时,事件会交ViewGroup的onTouchEvent方法处理,而自log可以见到ViewGroup的onTouchEvent默认为无吃事件,所以事件由提交Activity的onTouchEvent方法处理,最终事件流的连续有不再传递让ViewGroup和View,而是径直传送让Activity的onTouchEvent处理。

哎呀是事件分发机制?

说了半天的风波分发机制那到底是单底东西也?我们不用拿它们想象的那大深莫测,不要在思维及受自己如果上阻碍,其实十分轻掌握,博主的明亮是:简单的话,事件分发机制就算是Android系统对事件传递过程规定之一样栽事件传递规则,事件还见面按部就班这个规则进行分发传递。

于研讨事件分发机制之前,我们先行来规定一下分析的步子,化整为零,各个击破:

  • 弄明白分析目标:MotionEvent。
  • 打探三独方法:dispatchTouchEvent(MotionEvent
    event)、onInterceptTouchEvent(Motion
    event)、onTouchEvent(MotionEvent event)。
  • MotionEvent事件之传递过程
  • 小结

示例一,默认情况下之轩然大波传递流程

创立3只类似,一个Activity、一个继往开来自LinearLayout的View,一个后续自Button的View,并再次写他们的dispatchTouchEvent()、onIntercepteTouchEvent()、onTouchEvent(),三独像样以及布局文件之代码如下:

  • EventDispatchActivity

/**
 * 事件分发机制测试Activity
 * Created by liuwei on 18/1/5.
 */
public class EventDispatchActivity extends AppCompatActivity {

    private final static String TAG = "Activity";//EventDispatchActivity.class.getSimpleName();

    private EventDispatchTestView edtv_test;
    private EventDispatchLinearLayout edll_test;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_event_dispatch);
        edtv_test = ViewUtils.find(this, R.id.edtv_test);
        edll_test = ViewUtils.find(this, R.id.edll_test);
    }

    @Override
    public boolean dispatchTouchEvent(MotionEvent event) {

        // 被调用时输出log,event.getAction表示事件的类型,0:ACTION_DOWN,1:ACTION_UP,2:ACTION_MOVE。

        Log.i(TAG, "dispatchTouchEvent: " + event.getAction() + " | 分发事件");
        return super.dispatchTouchEvent(event);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        Log.i(TAG, "onTouchEvent: " + event.getAction() + " | 是否消耗事件:" + true);
        return super.onTouchEvent(event);
    }
}
  • EventDispatchLinearLayout

/**
 * 事件分发机制测试 ViewGroup
 * Created by liuwei on 18/1/5.
 */
public class EventDispatchLinearLayout extends LinearLayout {

    private final static String TAG = "——Layout";//EventDispatchLinearLayout.class.getSimpleName();


    public EventDispatchLinearLayout(Context context) {
        super(context);
    }

    public EventDispatchLinearLayout(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    public boolean dispatchTouchEvent(MotionEvent event) {
        Log.i(TAG, "dispatchTouchEvent: " + event.getAction() + " | 分发事件");
        return super.dispatchTouchEvent(event);
    }

    @Override
    public boolean onInterceptTouchEvent(MotionEvent event) {
        Log.i(TAG, "onInterceptTouchEvent: " + event.getAction() + " | 是否拦截:" + false);
        return super.onInterceptTouchEvent(event);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        Log.i(TAG, "onTouchEvent: " + event.getAction() + " | 是否消耗事件:" + false);
        return super.onTouchEvent(event);
    }
}
  • EventDispatchTestView

/**
 * 事件分发机制测试 View
 * Created by liuwei on 18/1/5.
 */
public class EventDispatchTestView extends Button {

    private final static String TAG = "————View";//EventDistpatchTestView.class.getSimpleName();

    public EventDispatchTestView(Context context) {
        super(context);
    }

    public EventDispatchTestView(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    public boolean dispatchTouchEvent(MotionEvent event) {
        Log.i(TAG, "dispatchTouchEvent: " + event.getAction() + " | 分发事件");
        return super.dispatchTouchEvent(event);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        Log.i(TAG, "onTouchEvent: " + event.getAction() + " | 是否消耗事件:" + true);
        return super.onTouchEvent(event);
    }
}
  • 布局文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="cn.codingblock.view.event_dispatch.EventDispatchActivity">

    <cn.codingblock.view.event_dispatch.EventDispatchLinearLayout
        android:id="@+id/edll_test"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="#cccccc">

        <cn.codingblock.view.event_dispatch.EventDispatchTestView
            android:id="@+id/edtv_test"
            android:layout_width="300dp"
            android:layout_height="300dp"
            android:layout_margin="10dp"
            android:background="#000000"/>

    </cn.codingblock.view.event_dispatch.EventDispatchLinearLayout>

</LinearLayout>

运作代码,点击EventDispatchTestView(黑色区域),log输出如下(log中的数字代表事件的色,0:ACTION_DOWN,1:ACTION_UP,2:ACTION_MOVE):

01-05 16:58:05.574 23295-23295/cn.codingblock.view I/Activity: dispatchTouchEvent: 0 | 分发事件
01-05 16:58:05.574 23295-23295/cn.codingblock.view I/——Layout: dispatchTouchEvent: 0 | 分发事件
01-05 16:58:05.574 23295-23295/cn.codingblock.view I/——Layout: onInterceptTouchEvent: 0 | 是否拦截:false
01-05 16:58:05.574 23295-23295/cn.codingblock.view I/————View: dispatchTouchEvent: 0 | 分发事件
01-05 16:58:05.574 23295-23295/cn.codingblock.view I/————View: onTouchEvent: 0 | 是否消耗事件:true

01-05 16:58:05.611 23295-23295/cn.codingblock.view I/Activity: dispatchTouchEvent: 2 | 分发事件
01-05 16:58:05.611 23295-23295/cn.codingblock.view I/——Layout: dispatchTouchEvent: 2 | 分发事件
01-05 16:58:05.611 23295-23295/cn.codingblock.view I/——Layout: onInterceptTouchEvent: 2 | 是否拦截:false
01-05 16:58:05.611 23295-23295/cn.codingblock.view I/————View: dispatchTouchEvent: 2 | 分发事件
01-05 16:58:05.611 23295-23295/cn.codingblock.view I/————View: onTouchEvent: 2 | 是否消耗事件:true

01-05 16:58:05.619 23295-23295/cn.codingblock.view I/Activity: dispatchTouchEvent: 1 | 分发事件
01-05 16:58:05.619 23295-23295/cn.codingblock.view I/——Layout: dispatchTouchEvent: 1 | 分发事件
01-05 16:58:05.619 23295-23295/cn.codingblock.view I/——Layout: onInterceptTouchEvent: 1 | 是否拦截:false
01-05 16:58:05.620 23295-23295/cn.codingblock.view I/————View: dispatchTouchEvent: 1 | 分发事件
01-05 16:58:05.620 23295-23295/cn.codingblock.view I/————View: onTouchEvent: 1 | 是否消耗事件:true

由log可以望ViewGroup的onInterceptTouchEvent方法默认是匪阻拦事件的,View的onTouchEvent方法默认消耗事件。事件流的ACTION_DOWN类型Motion
Event率先到达View的onTouchEvent方法被,此时onTouchEvent方法返回true,表示一旦处理事件,所以事件流的连续有还是通过log中之流程到达了View的onTouchEvent方法吃。

示例四、如果在ViewGroup的onInterceptTouchEvent中回到了true拦截了事件,整个事件将不再传递让View而是直接到由ViewGroup的onTouchEvent处理。

修改EventDispatchLinearLayout的onInterceptTouchEvent(),让其回来true。

@Override
public boolean onInterceptTouchEvent(MotionEvent event) {
    Log.i(TAG, "onInterceptTouchEvent: " + event.getAction() + " | 是否拦截:" + true);
    return true;//super.onInterceptTouchEvent(event);
}

测试log如下:

01-05 19:03:21.788 9733-9733/cn.codingblock.view I/Activity: dispatchTouchEvent: 0 | 分发事件
01-05 19:03:21.789 9733-9733/cn.codingblock.view I/——Layout: dispatchTouchEvent: 0 | 分发事件
01-05 19:03:21.789 9733-9733/cn.codingblock.view I/——Layout: onInterceptTouchEvent: 0 | 是否拦截:true
01-05 19:03:21.789 9733-9733/cn.codingblock.view I/——Layout: onTouchEvent: 0 | 是否消耗事件:true
01-05 19:03:21.819 9733-9733/cn.codingblock.view I/Activity: dispatchTouchEvent: 2 | 分发事件
01-05 19:03:21.819 9733-9733/cn.codingblock.view I/——Layout: dispatchTouchEvent: 2 | 分发事件
01-05 19:03:21.819 9733-9733/cn.codingblock.view I/——Layout: onTouchEvent: 2 | 是否消耗事件:true
01-05 19:03:21.877 9733-9733/cn.codingblock.view I/Activity: dispatchTouchEvent: 1 | 分发事件
01-05 19:03:21.877 9733-9733/cn.codingblock.view I/——Layout: dispatchTouchEvent: 1 | 分发事件
01-05 19:03:21.877 9733-9733/cn.codingblock.view I/——Layout: onTouchEvent: 1 | 是否消耗事件:true

示例三、在示例二的基本功及给ViewGroup消耗事件

修改EventDispatchLinearLayout的onTouchEvent(),让该回到true。

@Override
public boolean onTouchEvent(MotionEvent event) {
    Log.i(TAG, "onTouchEvent: " + event.getAction() + " | 是否消耗事件:" + true);
    return true;//super.onTouchEvent(event);
}

测试log如下:

01-05 18:34:53.409 21169-21169/cn.codingblock.view I/Activity: dispatchTouchEvent: 0 | 分发事件
01-05 18:34:53.409 21169-21169/cn.codingblock.view I/——Layout: dispatchTouchEvent: 0 | 分发事件
01-05 18:34:53.409 21169-21169/cn.codingblock.view I/——Layout: onInterceptTouchEvent: 0 | 是否拦截:false
01-05 18:34:53.409 21169-21169/cn.codingblock.view I/————View: dispatchTouchEvent: 0 | 分发事件
01-05 18:34:53.410 21169-21169/cn.codingblock.view I/————View: onTouchEvent: 0 | 是否消耗事件:false
01-05 18:34:53.410 21169-21169/cn.codingblock.view I/——Layout: onTouchEvent: 0 | 是否消耗事件:true

01-05 18:34:53.420 21169-21169/cn.codingblock.view I/Activity: dispatchTouchEvent: 2 | 分发事件
01-05 18:34:53.420 21169-21169/cn.codingblock.view I/——Layout: dispatchTouchEvent: 2 | 分发事件
01-05 18:34:53.420 21169-21169/cn.codingblock.view I/——Layout: onTouchEvent: 2 | 是否消耗事件:true

01-05 18:34:53.470 21169-21169/cn.codingblock.view I/Activity: dispatchTouchEvent: 1 | 分发事件
01-05 18:34:53.470 21169-21169/cn.codingblock.view I/——Layout: dispatchTouchEvent: 1 | 分发事件
01-05 18:34:53.470 21169-21169/cn.codingblock.view I/——Layout: onTouchEvent: 1 | 是否消耗事件:true

这种状况下,事件流的ACTION_DOWN先到达View的onTouchEvent,发现它不吃事件,继而返回上级的ViewGroup的onTouchEvent中,发现她一旦耗事件,事件流的继续有就是非在传递给View,也不以调用ViewGroup的onInterceptTouchEvent方法,因为曾清楚View不处理事件,所以没有必要再通过onInterceptTouchEvent方法来判断了。

MotionEvent事件传递过程

当手指点击屏幕有一个Touch事件后,事件仍Activity->Window->View的各个依次传递。

先是会见传递给Activity的dispatchTouchEvent(),在这道中会用出于Window处理,接着事件会传送让根View,根View接收到事件后便会以事件分发机制去处理事件。

根View在此处就是一个ViewGroup,它在接受到事件后会调用dispatchTouchEvent(),在此方式中会透过onInterceptTouchEvent()方法判断是否拦截事件,如果onInterceptTouchEvent()返回true就意味着它如果阻止事件,事件将传递给当下ViewGroup的onTouchEvent()。如果onInterceptTouchEvent()放回false就意味着她不阻碍事件,事件将污染于该麾下的View,调用下级View的dispatchTouchEvent()。

根View的下属View可能又是一个ViewGroup,如果这样的话其传递流程以及根View一样。无论根View的下属View是无是ViewGroup,如果不阻碍事件,最终事件会传递至一个纯View的控件上。

当一个View(纯View控件)接收至事件后,也会调用其dispatchTouchEvent(),然后以这方法中会调用当前View的onTouchEvent(),如果onTouchEvent()返回true则象征如果拍卖是事件。如果回去false表示未吃事件,其上面View的onTouchEvent()将让调用,则事件流的后续有不再传递至手上View,在一个事件流中也未见面重新调用当前View的dispatchTouchEvent()。

对接下去通过切实示例来查事件传递的流水线:

小结

为更好之懂得,可以将事件流看成是同样批人,把ACTION_DOWN类型看做探路人,探路人按规定之路线先走相同全勤,直到走及View的onTouchEvent这里,如果onTouchEvent返回true,可分晓成者路通,后续部队可以还原。如果回去false,可以领略成这个路不通,然后探路人再到Layout(ViewGroup)的onTouchEvent中问路连通不接,如果属的讲话后续部队就绝不再行夺View那里了,直接到ViewGroup这来就算得了。而若ViewGroup这里路呢打断,那么探路人就不得不去Activity的onTouchEvent那里了,后续部队也直去Activity的onTouchEvent这里就得了。


最终想说的凡,本系列文章吧博主对Android知识进行重新梳理,查缺补漏之求学过程,一方面是针对协调忘记的东西加以复习重新掌握,另一方面相信于重新学习的过程被自然会发英雄的初抱,如果您也发出与自身同一的想法,不妨关注我并读书,互相探讨,共同进步!

参考文献:

  • 《Android开发方探索》

示例五、给View绑定OnTouchListener和OnClickListener监听器。

以EventDispatchActivity的onCreate()方法中长如下代码,并拿EventDispatchLinearLayout和EventDispatchTestView的各级艺术的回来值都还原成示例一挨的状态。

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_event_dispatch);
    edtv_test = ViewUtils.find(this, R.id.edtv_test);
    edll_test = ViewUtils.find(this, R.id.edll_test);

    edtv_test.setOnTouchListener(new View.OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            // 为了log显示的层次更加清晰,这里的TAG使用View的TAG
            Log.i("————View", "onTouch: 返回 " + false);
            return false;
        }
    });

    edtv_test.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            // 为了log显示的层次更加清晰,这里的TAG使用View的TAG
            Log.i("————View", "onClick: ");
        }
    });
}

测试log如下:

01-06 19:35:07.563 6737-6737/cn.codingblock.view I/Activity: dispatchTouchEvent: 0 | 分发事件
01-06 19:35:07.563 6737-6737/cn.codingblock.view I/——Layout: dispatchTouchEvent: 0 | 分发事件
01-06 19:35:07.563 6737-6737/cn.codingblock.view I/——Layout: onInterceptTouchEvent: 0 | 是否拦截:false
01-06 19:35:07.563 6737-6737/cn.codingblock.view I/————View: dispatchTouchEvent: 0 | 分发事件
01-06 19:35:07.563 6737-6737/cn.codingblock.view I/————View: onTouch: 返回 false
01-06 19:35:07.563 6737-6737/cn.codingblock.view I/————View: onTouchEvent: 0 | 是否消耗事件:true

01-06 19:35:07.573 6737-6737/cn.codingblock.view I/Activity: dispatchTouchEvent: 2 | 分发事件
01-06 19:35:07.573 6737-6737/cn.codingblock.view I/——Layout: dispatchTouchEvent: 2 | 分发事件
01-06 19:35:07.573 6737-6737/cn.codingblock.view I/——Layout: onInterceptTouchEvent: 2 | 是否拦截:false
01-06 19:35:07.573 6737-6737/cn.codingblock.view I/————View: dispatchTouchEvent: 2 | 分发事件
01-06 19:35:07.574 6737-6737/cn.codingblock.view I/————View: onTouch: 返回 false
01-06 19:35:07.574 6737-6737/cn.codingblock.view I/————View: onTouchEvent: 2 | 是否消耗事件:true

01-06 19:35:07.673 6737-6737/cn.codingblock.view I/Activity: dispatchTouchEvent: 1 | 分发事件
01-06 19:35:07.674 6737-6737/cn.codingblock.view I/——Layout: dispatchTouchEvent: 1 | 分发事件
01-06 19:35:07.674 6737-6737/cn.codingblock.view I/——Layout: onInterceptTouchEvent: 1 | 是否拦截:false
01-06 19:35:07.674 6737-6737/cn.codingblock.view I/————View: dispatchTouchEvent: 1 | 分发事件
01-06 19:35:07.674 6737-6737/cn.codingblock.view I/————View: onTouch: 返回 false
01-06 19:35:07.674 6737-6737/cn.codingblock.view I/————View: onTouchEvent: 1 | 是否消耗事件:true
01-06 19:35:07.704 6737-6737/cn.codingblock.view I/————View: onClick: 

接下来还点修改代码,让onTouch()方法吃事件,也就算是回来true,再观log:

edtv_test.setOnTouchListener(new View.OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        // 为了log显示的层次更加清晰,这里的TAG使用View的TAG
        Log.i("————View", "onTouch: 返回 " + false);
        return false;
    }
});

log如下:

01-07 11:03:55.411 2757-2757/cn.codingblock.view I/Activity: dispatchTouchEvent: 0 | 分发事件
01-07 11:03:55.412 2757-2757/cn.codingblock.view I/——Layout: dispatchTouchEvent: 0 | 分发事件
01-07 11:03:55.412 2757-2757/cn.codingblock.view I/——Layout: onInterceptTouchEvent: 0 | 是否拦截:false
01-07 11:03:55.412 2757-2757/cn.codingblock.view I/————View: dispatchTouchEvent: 0 | 分发事件
01-07 11:03:55.412 2757-2757/cn.codingblock.view I/————View: onTouch: 返回 true

01-07 11:03:55.542 2757-2757/cn.codingblock.view I/Activity: dispatchTouchEvent: 2 | 分发事件
01-07 11:03:55.542 2757-2757/cn.codingblock.view I/——Layout: dispatchTouchEvent: 2 | 分发事件
01-07 11:03:55.542 2757-2757/cn.codingblock.view I/——Layout: onInterceptTouchEvent: 2 | 是否拦截:false
01-07 11:03:55.542 2757-2757/cn.codingblock.view I/————View: dispatchTouchEvent: 2 | 分发事件
01-07 11:03:55.542 2757-2757/cn.codingblock.view I/————View: onTouch: 返回 true

01-07 11:03:55.560 2757-2757/cn.codingblock.view I/Activity: dispatchTouchEvent: 1 | 分发事件
01-07 11:03:55.560 2757-2757/cn.codingblock.view I/——Layout: dispatchTouchEvent: 1 | 分发事件
01-07 11:03:55.560 2757-2757/cn.codingblock.view I/——Layout: onInterceptTouchEvent: 1 | 是否拦截:false
01-07 11:03:55.560 2757-2757/cn.codingblock.view I/————View: dispatchTouchEvent: 1 | 分发事件
01-07 11:03:55.560 2757-2757/cn.codingblock.view I/————View: onTouch: 返回 true

自log中我们得以望:

  • 否View绑定的OnTouchListener中之onTouch()方法是先行受View的onTouchEvent()方法执行之。如果当onTouch()消耗了轩然大波(返回true),那么事件将未在传递给onTouchEvent()方法,最终也未会见调用onClick()方法。
  • 也View绑定的OnClickListener中之onClick()方法优先级最低,是于全方位事件流了后才会叫调用,也就算是待经手指的照下–抬起是历程才见面触发onClick()方法。

MotionEvent

骨子里点击事件之分发过程就是是本着MotionEvent事件的散发过程,当用户点击操作以下后,MotionEvent事件就有并通过一定之规则传递至指定的View上,这个传递的进程以及规则就是是事件分发机制。

一旦点击操作触发MotionEvent事件是一个事件流或说是一个风波序列,其至高无上的波类有如下三栽:

  • MotionEvent.ACTION_DOWN:手指刚点下屏幕时接触此类型。
  • MotionEvent.ACTION_MOVE:手指在屏幕及走时会见一再碰此类型葡京网上娱乐场。
  • MotionEvent.ACTION_UP:手指在屏幕及抬起时点此类型。

万一特别注意的是,通常情况下一个MotionEvent事件序列包含一个 ACTION_DOWN
若干个 ACTION_MOVE 和 ACTION_UP
是一个整的波序列。(点下来这抬起指头时,会独自生 ACTION_DOWN 和
ACTION_UP,这吗是一个整机的轩然大波序列)

dispatchTouchEvent、onInterceptTouchEvent、onTouchEvent

  • boolean dispatchTouchEvent (MotionEvent event):

分发事件,只要事件会传递到目前View就必会调用此办法,其回来回值是一个布尔类型表示是否消耗事件。返回true代表吃事件,事件流的继续有还见面随之传递过来;返回false代表不吃事件,事件流的接续有即不再传递让这个。

  • boolean onInterceptTouchEvent (MotionEvent ev):

此方表示是否拦截MotionEvent事件,只有ViewGroup类型的控件才有其一方式。如果此方法返回true表示拦截事件,事件将传递让当下View的onTouchEvent()方法,而不再向其属下的View传递。如果是方式返回false表示不遮事件,事件将传递让下级View的dispatchTouchEvent()。

  • boolean onTouchEvent (MotionEvent event):

此方用来处理MotionEvent,返回值表示是否消耗事件。返回true表示耗事件,那么事件流的连续有还会传递过来;返回false表示未吃事件,事件将交由上级View的onTouchEvent()处理,如果上级View的onTouchEvent()仍然返回false,那么事件将再次交由上级的上司处理,以此类推,如果各国View的onTouchEvent()都不吃事件,那么事件最终用交给Activity的onTouchEvent()处理。

上文说了如此多还是无敷具体,先用流程图大体说明一个以上三独办法的干,及调用流程,下文还见面结合实际示例详细说明当事变分发传递着各个艺术的调用规则。

三者关系约如下图:

葡京网上娱乐场 1