<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[ws_lm的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/ws_lm</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; ws_lm]]></copyright><item><title><![CDATA[Android实现骨架屏占位加载效果(二)]]></title><link>https://blog.youkuaiyun.com/ws_lm/article/details/117130285</link><guid>https://blog.youkuaiyun.com/ws_lm/article/details/117130285</guid><author>ws_lm</author><pubDate>Fri, 21 May 2021 17:54:06 +0800</pubDate><description><![CDATA[这篇的内容是介绍Piccolo的思路以及主要实现过程。
实现思路
要实现骨架屏占位加载，要解决以下几个问题：

实现占位效果
标记显示位置
对列表的支持

实现占位效果
为了便于自定义占位效果，以及更低的内存消耗，选择比View更轻量级的Drawable实现占位效果。
Piccolo提供了两种加载效果ImageShiningDrawable和TextShiningDrawable，其主要实现都是基于ShiningDrawable。类图关系如下：

ShiningDrawable实现了Shining接口，Sh]]></description><category></category></item><item><title><![CDATA[Android实现骨架屏占位加载效果(一)]]></title><link>https://blog.youkuaiyun.com/ws_lm/article/details/116932298</link><guid>https://blog.youkuaiyun.com/ws_lm/article/details/116932298</guid><author>ws_lm</author><pubDate>Mon, 17 May 2021 14:26:43 +0800</pubDate><description><![CDATA[<p>Android骨架屏，支持单独View、RecyclerView、ListView、GridView、ViewPager。相比其他框架有更加统一的api，以及内存优化。</p>
<h2 id="]]></description><category></category></item><item><title><![CDATA[深入解析Android的StateListDrawable]]></title><link>https://blog.youkuaiyun.com/ws_lm/article/details/115734624</link><guid>https://blog.youkuaiyun.com/ws_lm/article/details/115734624</guid><author>ws_lm</author><pubDate>Thu, 15 Apr 2021 19:01:27 +0800</pubDate><description><![CDATA[<p>在 Android 中我们经常使用 <strong>StateListDrawable</strong>  ，来实现按钮、列表项等控件在不同状态下的外观，每种状态对应一个drawable资源。<]]></description><category></category></item><item><title><![CDATA[Flutter 100问：http怎样自动获取代理配置]]></title><link>https://blog.youkuaiyun.com/ws_lm/article/details/115374560</link><guid>https://blog.youkuaiyun.com/ws_lm/article/details/115374560</guid><author>ws_lm</author><pubDate>Thu, 01 Apr 2021 15:02:32 +0800</pubDate><description><![CDATA[<h1 id="flutter-100问：http怎样自动获取代理配置">Flutter 100问：http怎样自动获取代理配置</h1>
<h2 id="why">Why</h2>
<p>Flutt]]></description><category></category></item><item><title><![CDATA[Flutter 100问：为什么PageView切换页面State重新创建]]></title><link>https://blog.youkuaiyun.com/ws_lm/article/details/115367456</link><guid>https://blog.youkuaiyun.com/ws_lm/article/details/115367456</guid><author>ws_lm</author><pubDate>Thu, 01 Apr 2021 10:01:07 +0800</pubDate><description><![CDATA[<h1 id="为什么pageview切换页面state重新创建">为什么PageView切换页面State重新创建</h1>
<h2 id="why">Why</h2>
<p>PageView的渲染]]></description><category></category></item><item><title><![CDATA[记一次Android OOM探险之旅]]></title><link>https://blog.youkuaiyun.com/ws_lm/article/details/83745161</link><guid>https://blog.youkuaiyun.com/ws_lm/article/details/83745161</guid><author>ws_lm</author><pubDate>Mon, 05 Nov 2018 10:51:09 +0800</pubDate><description><![CDATA[记一次Android OOM探险之旅
分析利器
查看内存状态
adb shell dumpsys meminfo packageName
MAT使用
MAT(Memory Analyzer Tool)

Dominator Tree:列出存活的对象



右键对象 -&amp;gt; Path To GC Roots -&amp;gt; exclude all phantom/weak/soft etc.refe...]]></description><category></category></item><item><title><![CDATA[Android KeyEvent分发机制]]></title><link>https://blog.youkuaiyun.com/ws_lm/article/details/79234396</link><guid>https://blog.youkuaiyun.com/ws_lm/article/details/79234396</guid><author>ws_lm</author><pubDate>Thu, 01 Feb 2018 23:11:33 +0800</pubDate><description><![CDATA[Android KeyEvent分发机制简介KeyEvent的分发机制和TouchEvent的分发机制略有不同，KeyEvent向下分发的事件没有被消费，并且KeyCode为KEYCODE_DPAD_LEFT,KEYCODE_DPAD_RIGHT,KEYCODE_DPAD_UP,KEYCODE_DPAD_DOWN,那么会按方向查找下一个控件并获取焦点。触摸事件分发机制传送门： Android触摸事件]]></description><category></category></item><item><title><![CDATA[通过KeyEvent选中控件]]></title><link>https://blog.youkuaiyun.com/ws_lm/article/details/79234368</link><guid>https://blog.youkuaiyun.com/ws_lm/article/details/79234368</guid><author>ws_lm</author><pubDate>Thu, 01 Feb 2018 23:06:55 +0800</pubDate><description><![CDATA[通过KeyEvent选中控件知识准备要准确的理解这篇文章，首先需要理解Android KeyEvent分发机制需求说明
通过上、下、左、右四个方向KeyEvent选中区块。
自定义KeyCode为300、301两个KeyEvent。300时在区块内顺时针寻找下一个可获取焦点控件，301时在区块内逆时针寻找上一个可获取焦点控件。
支持ListView,GridView等集合类控件。KeyCode为30]]></description><category></category></item><item><title><![CDATA[水波纹进度条实现]]></title><link>https://blog.youkuaiyun.com/ws_lm/article/details/78552334</link><guid>https://blog.youkuaiyun.com/ws_lm/article/details/78552334</guid><author>ws_lm</author><pubDate>Thu, 16 Nov 2017 16:03:06 +0800</pubDate><description><![CDATA[水波纹进度条实现参考文章 Android自定义View——实现水波纹效果类似剩余流量球我的思路水波示意图： 
如何绘制水波水波形状，使用贝塞尔曲线。如上图所示，y轴为控件左边界，在左边界多绘制一个周期。这个周期是水波X方向上的移动范围。如何让水波动起来每次进度增加的时候，绘制起始点在X右方向上移动一小段距离，随着进度不断增加，水波不断向前移动。绘制起始点X坐标计算公式:当前绘制起始点X坐标=初始绘制]]></description><category></category></item><item><title><![CDATA[仿QQ未读消息拖拽效果]]></title><link>https://blog.youkuaiyun.com/ws_lm/article/details/78480244</link><guid>https://blog.youkuaiyun.com/ws_lm/article/details/78480244</guid><author>ws_lm</author><pubDate>Wed, 08 Nov 2017 16:28:06 +0800</pubDate><description><![CDATA[仿QQ未读消息拖拽效果技术参考文章贝塞尔曲线介绍Android自定义控件：类QQ未读消息拖拽效果补充说明Android自定义控件：类QQ未读消息拖拽效果，这篇文章在求解A,B,C,D四个点上不尽详述，所以下面进行补充说明。图示：计算过程：技术总结
计算A,B,C,D四点坐标
了解拖拽过程连接固定圆和拖拽圆之间的曲线实现，即贝塞尔曲线
如何让QQDotView拖拽区域为整个屏幕？使用WindowMan]]></description><category></category></item><item><title><![CDATA[ImageView支持Exif]]></title><link>https://blog.youkuaiyun.com/ws_lm/article/details/78249899</link><guid>https://blog.youkuaiyun.com/ws_lm/article/details/78249899</guid><author>ws_lm</author><pubDate>Mon, 16 Oct 2017 15:03:41 +0800</pubDate><description><![CDATA[ImageView支持Exif什么是Exif可交换图像文件格式,简称为Exif（Exchangeable image file format）。是专门为数码相机的照片设定的，可以记录数码照片的属性信息和拍摄数据。exif中包含图片的方向信息，这个是本文讨论的重点。exif orientation详细介绍链接中的orientation value,0th row,0th column的关系换成下图更好]]></description><category></category></item><item><title><![CDATA[Android SQLite数据类型]]></title><link>https://blog.youkuaiyun.com/ws_lm/article/details/77885056</link><guid>https://blog.youkuaiyun.com/ws_lm/article/details/77885056</guid><author>ws_lm</author><pubDate>Thu, 07 Sep 2017 18:14:59 +0800</pubDate><description><![CDATA[SQLite数据类型概述我们熟知的数据库引擎大部分采用静态数据类型，即列定义的类型定义了值的存储，并且值要严格满足列的定义，同一列所有值的存储方式都相同，比如定义了一个列类型为整型 int，不能在该列上输入’abc’。SQLite的数据类型则采用了动态类型，列定义不能决定值的存储，值的存储由值本身决定，因此在SQLite中，同一列会有多种存储方式。数据类型与存储类 
在SQLite中，存储分类和数]]></description><category></category></item><item><title><![CDATA[Intent.FLAG_ACTIVITY_FORWARD_RESULT作用]]></title><link>https://blog.youkuaiyun.com/ws_lm/article/details/77717309</link><guid>https://blog.youkuaiyun.com/ws_lm/article/details/77717309</guid><author>ws_lm</author><pubDate>Wed, 30 Aug 2017 15:40:50 +0800</pubDate><description><![CDATA[Intent.FLAG_ACTIVITY_FORWARD_RESULT作用适用情况多个Activity的值传递。ActivityA到达ActivityB再到达ActivityC，但ActivityB为过渡页可以finish了，此时ActivityC将值透传至ActivityA。代码实现第一个页面：A跳到Bpublic class AActivity extends Activity{
    @Ov]]></description><category></category></item><item><title><![CDATA[Mac配置Android环境变量]]></title><link>https://blog.youkuaiyun.com/ws_lm/article/details/77717300</link><guid>https://blog.youkuaiyun.com/ws_lm/article/details/77717300</guid><author>ws_lm</author><pubDate>Wed, 30 Aug 2017 15:40:18 +0800</pubDate><description><![CDATA[Mac配置Android环境变量背景Mac上在Android Studio控制台输入adb会发现adb:command not found的问题。原因是没有配置Android环境变量。配置环境变量打开mac的terminal终端，输入 cd ~/ 【进入当前用户的home目录】输入 touch .bash_profile 【如果没有.bash_profile这个文件，则创建一个文件】输入 open]]></description><category></category></item><item><title><![CDATA[WebView的一些坑]]></title><link>https://blog.youkuaiyun.com/ws_lm/article/details/77717274</link><guid>https://blog.youkuaiyun.com/ws_lm/article/details/77717274</guid><author>ws_lm</author><pubDate>Wed, 30 Aug 2017 15:38:59 +0800</pubDate><description><![CDATA[WebView的一些坑WebViewClient和WebChromeClient区别WebViewClient： It will be called when things happen that impact the rendering of the content 
WebChromeClient：This class is called when something that might im]]></description><category></category></item><item><title><![CDATA[android-clipChildren属性]]></title><link>https://blog.youkuaiyun.com/ws_lm/article/details/76996601</link><guid>https://blog.youkuaiyun.com/ws_lm/article/details/76996601</guid><author>ws_lm</author><pubDate>Wed, 09 Aug 2017 15:25:49 +0800</pubDate><description><![CDATA[android:clipChildren属性属性介绍android:clipChildren用来设置是否剪切children。使用场景通常会看到中间的tab会更大，甚至超出parent的限制，如图： 
属性使用方法android:clipChildren=”false”表示不剪切children，但是children大小不能超过parent的大小，所以如果children的直接parent大小不够容]]></description><category></category></item><item><title><![CDATA[解密Android Resource]]></title><link>https://blog.youkuaiyun.com/ws_lm/article/details/76686080</link><guid>https://blog.youkuaiyun.com/ws_lm/article/details/76686080</guid><author>ws_lm</author><pubDate>Fri, 04 Aug 2017 15:29:09 +0800</pubDate><description><![CDATA[Android xml里引用资源语法@[package:]type/name@表示引用资源,声明这是一个资源引用,name是资源名。 引用id一般我们应该用”@+id/”来定义一个id，然后用@id来引用一个id，但是现在我发现apps/settings/res/layout/preferenc_progress.xml中有个”@+android:id/title”，怎么理解它？怎么用？ 加上and]]></description><category></category></item><item><title><![CDATA[FragmentTabHost的正确使用姿势]]></title><link>https://blog.youkuaiyun.com/ws_lm/article/details/75087759</link><guid>https://blog.youkuaiyun.com/ws_lm/article/details/75087759</guid><author>ws_lm</author><pubDate>Thu, 13 Jul 2017 17:32:29 +0800</pubDate><description><![CDATA[FragmentTabHost的正确使用姿势使用方法1.定义布局文件<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://sc]]></description><category></category></item><item><title><![CDATA[highestOneBit()算法解析]]></title><link>https://blog.youkuaiyun.com/ws_lm/article/details/73293597</link><guid>https://blog.youkuaiyun.com/ws_lm/article/details/73293597</guid><author>ws_lm</author><pubDate>Thu, 15 Jun 2017 16:47:42 +0800</pubDate><description><![CDATA[highestOneBit()算法解析Integer类有个highestOneBit()方法，作用是返回具有单个 1 位的 int 值, 在指定值中最高位的 1 位的位置，比如5(00000101)返回4(00000100)。highestOneBit()的算法如下:public static int highestOneBit(int i) {
    // HD, Figure 3-1]]></description><category></category></item><item><title><![CDATA[Java泛型介绍]]></title><link>https://blog.youkuaiyun.com/ws_lm/article/details/72912057</link><guid>https://blog.youkuaiyun.com/ws_lm/article/details/72912057</guid><author>ws_lm</author><pubDate>Thu, 08 Jun 2017 11:57:28 +0800</pubDate><description><![CDATA[Java泛型介绍泛型定义：参数化类型，数据类型被指定为一个参数定义泛型1.定义在类声明上，作用域为整个类 
public class ArrayList 
2.定义在方法上(静态方法也类似) 
public  void init(T t) 实例化泛型ArrayList list=new ArrayList<>();init(“abc”);在实例化类或调用方法时要指定具体类。通配符在实例化类时，不确定]]></description><category></category></item></channel></rss>