RecyclerView高级用法——吸顶效果
引言我们对RecyclerView的使用不能仅仅停留在表面,可以探索一些高级的用法——自定义,不过要实现这些的前提是必须对RecycleView的源码流程有所了解。今天小编就略讲一下,主要是和今天的主体有关的内容。我们今天就来实现如下的吸顶效果。 通过绘制实现RecyclerView的吸顶效果ItemDecoration ItemDecoration允许应用给具体的View添加具体的图画或者layout的偏移,对于绘制View之间的分割线,视觉分组边界等等是非常有用的。 当我们调用addItemDecoration()方法添加decoration的时候,RecyclerView就会调用该类的onDraw方法区绘制分割线,也就是说:分割线是绘制出来的。 RecyclerView.ItemDecoration,该类为抽象类,官方目前只提供了一个实现类DividerItemDecoration。 并且只有LinearLayoutManager能够使用 要实现这样的吸顶效果,首先,就需要了解一下RecyclerView.ItemDecoration的绘制流程。 1.onDraw ...
adb命令
引言本文为小编学习总结的一些adb的常用命令,可能一些命令有待验证,更多内容可以参考adb用法大全 基本用法语法命令adb 命令的基本语法如下:adb [ -d| -e| -s ] 如果只有一个设备/模拟器连接时,可以省略掉[ -d| -e| -s] ] 这一部分,直接使用adb 。 为命令指定目标设备如果有多个设备/模拟器,则需要为命令指定目标设备 参数 含义 -d 指定当前唯一通过 USB 连接的 Android 设备为命令目标 -e 指定当前唯一运行的模拟器为目标命令 -s 指定相应 serialNumber 号的设备/模拟器为命令目标 常用adb命令查看adb版本号adb version 查看已连接设备adb devices 查看手机序列号adb get-serialno如返回127.0.0.1:7555 查看日志adb logcat adb logcat -c 清除日志adb logcat | grep “tag” 过滤日志 这里的tag就是你打印日志的时候需要设置的第一个参数TAG,通过TAG我们可以很轻松的过滤...
CoordinatorLayout原理解析与Behavior
CoordinatorLayout的功能事先警示:CoordinatorLayout只继承了NestedScrollParent,也就是说它只能做顶层父View,别踩坑!!! 处理子控件之间依赖下的交互 处理子控件之间的嵌套滑动 处理子控件的测量与布局 处理子控件的事件拦截与响应 以上四个功能,都建立与CoordinatorLayout中提供的一个叫做Behavior的“插件”之上。Behavior内部也提供了相应方法来对应这四个不同的功能。Behavior内部集成了上述四种功能对应的方法,实现解耦。 什么是Behavior?可以把Behavior理解成插件,当我们的组件想实现什么样的功能的时候就使用对应的Behavior,也就是说很多种不同功能的Behavior,当然也可以自定义Behavior。 CoordinatorLayout下依赖交互原理 当CoordinatorLayout中子控件dependency的位置、大小发生变化的时候,那么在CoordinatorLayout内部会通知所有依赖depandency的控件,并调用对应声明的Behavior,告知其...
NestedScrollView嵌套滑动原理
事件分发机制简介其实小编应该在前面准备一章关于Android的事件分发和处理机制的专题,因为时间原因和内容源码比较多吧(小编有强迫症,不想不贴源码),不过还是因为小编懒,哈哈。这里就对事件分发机制做一个简单的回忆,大家感兴趣的可以去看看相关资料和源码,小编后面有空也会出一期。 这里介绍一位优秀博主的博客,大家可以看这篇文章对事件分发机制与滑动冲突、以及解决方案有个全面的了解: 事件分发机制以及滑动冲突的处理 下面对事件分发与处理做一个简单总结 关键的一点大家需要记住:事件的分发是由上层到底层,而事件的处理是由底层到上层。 也就是说父View可以拦截触摸事件直接消费,而不传递给子View。 子View可以处理事件,也可以选择给父类消费。 ViewGroup既可以消费事件,也可以分发事件 View只能处理事件,也就是消费。 View滑动冲突 外部滑动方向与内部滑动方向不一致 解决方案:外部拦截法,当事件传递到父View时,父View需要处理此事件,就拦截,不处理此事件就不拦截 外部滑动方向与内部滑动方向一致; 内部拦截法,当事件传递到父View时,父View都传递给...
自定义PhotoView手势处理
前言 前面介绍了前面介绍了嵌套滑动、自定义Behavior等高级UI实现原理,今天介绍一种比较简单的高级UI用法——手势处理。 你可以点开自己的手机相册,点开任意一张图片,双击图片会有放大效果,再次双击会缩小为原来大小。并且双指操作可以放大缩小图片。今天,小编就来实现一下这样的PhotoView效果。但是我的效果处理肯定不是很完美,毕竟追求代码简洁。 效果展示图: 手势处理API首先,先介绍一个Android处理单指手势的API GestureDetector,在创建一个GestureDetector对象时需要传入一个监听者OnGestureListener,所以我们需要实现OnGestureListener,通常实现SimpleOnGestureListener这个接口里面的功能就足够我们使用了,所以实现它即可。 SimpleOnGestureListener的方法介绍 class PhotoScaleGestureDetector extends GestureDetector.SimpleOnGestureListener{ //在ACTIO...
阻塞队列与线程池机制
创建线程的方式 1.Thread 2.Runnable(实例化接口,重新run方法,放入Thread中执行) 为什么Callable方式不算? 首先,我们都知道创建线程都需要通过Thread,那么我们来看一下Thread的构造函数 可以看到,Thread构造函数中压根就没有Callable类型的参数 接着,我们再来看看Callable,Callable是继承自FutureTask 通过上面的源码截图,我们可以看出来Callable本质上还是Runnable的一种实现 CASCompare And Swap 提及CAS之前,我们先来提一下原子操作,原子操作就是一气呵成,中间不能被打断,学过操作系统的朋友应该和熟悉,没错,就类似于操作系统中的中断原语。 CAS原理利用了现代处理器都支持的CAS的指令,循环这个指令,直到成功为止。 会有两个重要的属性变量,旧值与新值(需要更改的值),每次进入前都会用旧值与内存中的变量值进行比较,如果相同,就会用新值替换内存中的变量值,否则将再次循环上述过程。 CAS的问题ABA问题什么是ABA问题呢? 就是旧值为A,被替换为新...
adb获取应用包入口的方案
引言小编最近在入手adb调试,刚开始还是挺顺利的,不过后面就遇到了一些小插曲,其中一个就是获取应用包的入口,开启一个应用。这个问题在网上可以找到很多解决方案,但不都是有用,并且有些方法有一点麻烦。这里,小编介绍一下意外摸索到的解决方案。 解决方案1、点开需要打开的应用,使用获取前台Activity命令 adb shell dumpsys activity activities | findstr mResumedActivity 这样便能获得应用包的启动入口比如,获取有道词典的启动入口 2、使用adb启动应用包 adb shell am start -n [应用包名] /[入口]
adb小结
adb常用命令 与应用交互主要是使用am命令,常用的如下 command 用途 start [options] 启动 指定的 Activity startservice [options] 启动 指定的 Service broadcast [options] 发送 指定的广播 force-stop 停止 相关的进程 参数很灵活,和写 Android 程序时代码里的 Intent 相对应。 用于决定intent对象的选项如下: 参数 含义 —- :—- -a 指定 action,比如 android.intent.action.VIEW -c 指定 category,比如 android.intent.category.APP_CONTACTS -n 指定完整 component 名,用于明确指定启动哪个 Activity,如 com.example.app/.ExampleActivity 里还能带数据,就像写代码时的 Bundle 一样: 参数 含义 –esn null...
adb shell input text不能输入中文的解决方案
原因adb默认是不支持Unicode编码的,无法通过adb shell input text 命令输入中文到手机或者模拟器。 解决步骤 1、安装ADBKeyBoard.apk文件(直接搜索就能找到)打开手机或模拟器,adb install ADBKeyBoard.apk安装该输入法在手机上直接安装也可 2、设置默认输入法打开手机设置 -> 点击语法与输入法 -> 点击输入法管理 -> 启用ADBKeyboard重启手机后即可使用该输入法 3、输入adb命令测试中文输入adb shell am broadcast -a ADB_INPUT_TEXT –es msg ‘这是一段adb中文测试’
RecyclerView的回收复用机制
前言上一章,小编介绍了RecyclerView的高级用法——自定义LayoutManager。今天,我们来从源码的角度深度剖析RecyclerView,主要是对RecyclerView的回收复用机制熟悉掌握。 RecyclerView介绍 RecyclerView可以说是项目必备的系统高级控件,相比于传统的ListVIew,RecyclerView最大的优势就是四级缓存机制,ListView是两级缓存机制(屏幕内可见、屏幕外)。 四级缓存机制 mChangeScrap(主要与动画相关)与mAttachedScrap(一般这两算一级) 用来缓存还在屏幕内的ViewHolder mCachedViews 用来缓存移除屏幕之外的ViewHolder mViewCacheExtension 用户的自定义扩展缓存,需要用户自己管理View的创建和缓存 RecyclerViewPool ViewHolder缓存池 回收复用的入口上一章中自定义LayoutManager中有 detachAndScrapAttachedViews(recycler!!)这样一个方法,用于回收View...










