From 81333ad0eaab78250114a9c3e9d2a5a8d4611327 Mon Sep 17 00:00:00 2001 From: Omooo <869759698@qq.com> Date: Tue, 7 Jul 2020 20:11:32 +0800 Subject: [PATCH 1/2] Create RecyclerView.md --- blogs/Android/口水话/RecyclerView.md | 32 +++++++++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 blogs/Android/口水话/RecyclerView.md diff --git a/blogs/Android/口水话/RecyclerView.md b/blogs/Android/口水话/RecyclerView.md new file mode 100644 index 0000000..584a230 --- /dev/null +++ b/blogs/Android/口水话/RecyclerView.md @@ -0,0 +1,32 @@ +--- +RecyclerView +--- + +#### 目录 + +1. 缓存机制 +2. 优化措施 + +#### 缓存机制 + +#### 优化措施 + +1.首先考虑数据缓存和分页 + +如果数据量比较大,可以选择分页加载,常见的比如订单列表。在做积分商城时,有多个 Tab,每个 Tab 根据 typeId 来请求数据,为了避免来回切换请求网络数据,我会把数据用 SparseArray 缓存下来,再次获取数据就不需要网络请求了,这种数据缓存的策略一般用在数据来回切换以及一次就能获取完数据的场景。 + +2.一些通用的优化手段 + +比如说避免 ItemView 的过渡绘制、减少布局嵌等,或者在适当情况下不通过 xml 来创建 View,而是直接 new View 来创建。 + +3.升级 RecyclerView 版本 + +一般在版本升级中都会静默享受一些优化措施,比如在 25 版本以上,默认添加了 Prefetch 功能,即数据预取功能。 + +4.如果 Item 高度固定,可以 setHasFixedSize(true) 来避免 requestLayout。如果不需要动画,也可以关闭默认动画。 + +5.通过 setItemViewCacheSize 来加大 RecyclerView 缓存,如果多个 RecyclerView 的 Adapter 是一样的,比如嵌套的 RecyclerView 中存在一样的 Adapter,可以设置 setRecycledViewPool 来共用一个 RecyclerViewPool。 + +6.对 ItemView 设置监听器,不要对每个 Item 都调用 addXxListener,应该共用一个 Listsner,然后根据 id 来进行不同的操作,避免创过多的内部类。 + +7.如果一个 ItemView 就占一屏,可以通过重写 LayoutManager 的 getExtraLayoutSpace 来增加 RecyclerView 预留的额外空间,也就是现实范围之外,应该额外缓存的空间。 \ No newline at end of file From 26da427b0e8ecc0f1578f0475a0f3cf351620bb0 Mon Sep 17 00:00:00 2001 From: Omooo <869759698@qq.com> Date: Wed, 8 Jul 2020 07:49:39 +0800 Subject: [PATCH 2/2] =?UTF-8?q?Create=20=E5=8A=A8=E7=94=BB=E7=9B=B8?= =?UTF-8?q?=E5=85=B3=E5=8F=A3=E6=B0=B4=E8=AF=9D.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../口水话/动画相关口水话.md | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 blogs/Android/口水话/动画相关口水话.md diff --git a/blogs/Android/口水话/动画相关口水话.md b/blogs/Android/口水话/动画相关口水话.md new file mode 100644 index 0000000..076c414 --- /dev/null +++ b/blogs/Android/口水话/动画相关口水话.md @@ -0,0 +1,22 @@ +--- +动画相关口水话 +--- + +#### 目录 + +1. 三种动画 +2. 插值器、估值器 +3. 动画源码 + +#### 三种动画 + +桢动画、补间动画和属性动画。桢动画可以使用 AnimationDrawable 或者定义一个 xml,使用简单,不过需要注意图片是全部加载到内存中,可能导致 OOM。补间动画即位移、旋转、缩放、透明度动画,可以定义 xml 然后用 AnimationUtils 加载,也可以直接 new TranslateAnimation 等等。基本上大部分动画都能实现,常用于 Activity 转场动画、Dialog 弹出动画等,缺点是只改变显示,不改变实际属性。属性动画即 Animator,它是一个抽象类,有两个直接子类,一个是 AnimatorSet 用于组合动画,一个是 ValueAnimator。ValueAnimator 需要手动添加监听器,更加灵活。ValueAnimator 也有两个子类,一个是 ObjectAnimator,每次更新时自动走 setXxx 方法,所以不需要像 ValueAnimator 那样添加监听器,还一个是 TimeAnimator,它只做一件事,提供一个时间流,每 18ms 回调一次。 + +#### 估值器、插值器 + +估值器表示属性的初始值过渡到结束值变化的具体数值,而插值器则表示变化率,比如先加速后减速(默认),匀速等等。 + +自定义估值器都需要实现 TypeEvaluator 接口,系统已经有几个默认实现,比如 ArgbEvaluator、IntEvaluator、FloatEvaluator 等等。比较常用的是 ArgbEvaluator 来实现颜色渐变。 + +自定义插值器更简单,只需要实现 TimeInterpolator 或 Interpolator,系统也内置了几种实现,默认是先加速后减速,即 AccelerateDecelerateInterpolator,看一下源码发现不过是余弦函数在 pi/2 到 pi 直接,也就是先加速后减速。 +