<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[书虫]]></title><description><![CDATA[个人主页  https://github.com/Logan676]]></description><link>https://blog.youkuaiyun.com/logan676</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; logan676]]></copyright><item><title><![CDATA[安卓11状态栏图标不显示问题调查]]></title><link>https://blog.youkuaiyun.com/logan676/article/details/119144271</link><guid>https://blog.youkuaiyun.com/logan676/article/details/119144271</guid><author>logan676</author><pubDate>Wed, 28 Jul 2021 09:38:08 +0800</pubDate><description><![CDATA[控制状态栏背景色的源码



默认状态栏背景色

StatusBar.java类的源码中，构造方法中就有默认的背景色，源码如下


@SuppressWarnings("UnusedParameters")
    public StatusBar(BridgeContext context, Density density, boolean isRtl, boolean rtlEnabled,
            int simulatedPlatformVersion) {
        // F]]></description><category></category></item><item><title><![CDATA[绘制带二级进度的圆角进度条]]></title><link>https://blog.youkuaiyun.com/logan676/article/details/114631313</link><guid>https://blog.youkuaiyun.com/logan676/article/details/114631313</guid><author>logan676</author><pubDate>Wed, 10 Mar 2021 11:57:41 +0800</pubDate><description><![CDATA[使用canvas.drawRoundRect来绘制

这个方案比较简单，只需要先绘制一个一级进度条，是一个圆角的进度条。然后在绘制一个二级进度条，随着进度更新绘制区域即可。但是二级进度条需要根据绘制的进度来调整使用drawRect还是drawRoundRect。

方案如下





使用PorterDuffXfermode模式来绘制

先在dstBitmap中绘制一个圆角的进度条，然后在srcBitmap中绘制一个矩形的二级进度条，这样两个bitmap的重叠区域使用srcIn模式就可以达到期望的效果。..]]></description><category></category></item><item><title><![CDATA[App性能监控]]></title><link>https://blog.youkuaiyun.com/logan676/article/details/107107068</link><guid>https://blog.youkuaiyun.com/logan676/article/details/107107068</guid><author>logan676</author><pubDate>Fri, 03 Jul 2020 15:41:06 +0800</pubDate><description><![CDATA[方案一


NetworkStatsManager#querySummary


    /**
     * Query network usage statistics summaries. Result filtered to include only uids belonging to
     * calling user. Result is aggregated over time, hence all buckets will have the same start and
     * e]]></description><category></category></item><item><title><![CDATA[记录一次礼物动效的设计与实现过程]]></title><link>https://blog.youkuaiyun.com/logan676/article/details/106971405</link><guid>https://blog.youkuaiyun.com/logan676/article/details/106971405</guid><author>logan676</author><pubDate>Fri, 26 Jun 2020 19:30:22 +0800</pubDate><description><![CDATA[实现礼物动效可以使用ViewGroup的方式也可以使用自定义View的方式。本文使用的是自定义View方式，不会讨论关于ViewGroup的实现方式。



数据模型

数据源列表使用mList

数据源列表使用mList来表示, 代表接口返回的数据列表
	mList只有遍历操作，选择ArrayList实现
绘制数据源列表使用mPendingDanMuList

与数据源列表不同，绘制数据源列表存放的是用于绘制的数据，比如坐标信息，调试信息等，当然它也包含来自数据列表的信息。其实绘制数据源列表就是根据mL.]]></description><category></category></item><item><title><![CDATA[ViewGroup的测量模式]]></title><link>https://blog.youkuaiyun.com/logan676/article/details/104477878</link><guid>https://blog.youkuaiyun.com/logan676/article/details/104477878</guid><author>logan676</author><pubDate>Fri, 06 Mar 2020 12:48:07 +0800</pubDate><description><![CDATA[ViewGroup的测量模式


    /**
     * Does the hard part of measureChildren: figuring out the MeasureSpec to
     * pass to a particular child. This method figures out the right MeasureSpec
     * for one ...]]></description><category></category></item><item><title><![CDATA[Android Seekbar高低版本兼容问题之拖拽按钮位置异常问题排查]]></title><link>https://blog.youkuaiyun.com/logan676/article/details/104623113</link><guid>https://blog.youkuaiyun.com/logan676/article/details/104623113</guid><author>logan676</author><pubDate>Mon, 02 Mar 2020 23:59:07 +0800</pubDate><description><![CDATA[问题描述

工作需要对Seekbar的拖拽按钮设置一个自定义的icon，然后就遇到一个Seekbar拖拽按钮机型适配问题。

在Android 10等高版本系统机型上Seekbar的拖拽按钮展示正常，但是在比如Android5.1系统上展示异常。异常现象是拖拽按钮偏离了轨道中心位置，拖拽按钮顶部紧贴控件的顶部边界。

原因分析

Seekbar拖拽按钮是个Drawable，它的位置由Drawabl...]]></description><category></category></item><item><title><![CDATA[接入友盟厂商push通道遇到的坑]]></title><link>https://blog.youkuaiyun.com/logan676/article/details/104522694</link><guid>https://blog.youkuaiyun.com/logan676/article/details/104522694</guid><author>logan676</author><pubDate>Wed, 26 Feb 2020 19:05:15 +0800</pubDate><description><![CDATA[使用友盟厂商通道并且保留了原友盟通道时遇到的各种问题，以及排查出的问题原因。]]></description><category></category></item><item><title><![CDATA[Android View中getTop，getY，getTranslationY之间的关系]]></title><link>https://blog.youkuaiyun.com/logan676/article/details/104477918</link><guid>https://blog.youkuaiyun.com/logan676/article/details/104477918</guid><author>logan676</author><pubDate>Mon, 24 Feb 2020 15:44:36 +0800</pubDate><description><![CDATA[首先View源码中没有Y这个成员变量。

View源码中的成员变量只有 mTop和mTransformationInfo（和translationY有关）。

Y只是作为一个抽象概念存在，它的计算关系如以下代码所示。


/**
     * The visual y position of this view, in pixels. This is equivalent to the
     ...]]></description><category></category></item><item><title><![CDATA[遇到的那些手机兼容问题]]></title><link>https://blog.youkuaiyun.com/logan676/article/details/104456302</link><guid>https://blog.youkuaiyun.com/logan676/article/details/104456302</guid><author>logan676</author><pubDate>Sun, 23 Feb 2020 10:58:56 +0800</pubDate><description><![CDATA[记录下使用不同厂商的手机时遇到的各种奇怪问题。

VIVO手机

我用的是VIVO X21A，Android 8.1.0系统，遇到的奇怪问题如下：

开发者模式打开之后，无法连接adb命令，导致无法连接Android Studio。反复开关debug开关无效，切换debug充电，传输文件等无效。最后发现重启之后就可以了。
	安装完测试包之后，所有功能无法正常联网，全部显示网络错误。而且部分功能一旦...]]></description><category></category></item><item><title><![CDATA[排查状态栏沉浸式引起的布局间距过大的bug]]></title><link>https://blog.youkuaiyun.com/logan676/article/details/104452010</link><guid>https://blog.youkuaiyun.com/logan676/article/details/104452010</guid><author>logan676</author><pubDate>Sat, 22 Feb 2020 23:13:17 +0800</pubDate><description><![CDATA[记录一次工作中遇到的一次排查由于系统状态栏显示之后顶部布局间距过大的bug的过程。



我要在一个全屏的页面上（FrameLayout）悬浮一个置顶（Gravity.Top）的菜单栏（MenuBar）。

菜单栏初始状态是隐藏的，用一个translateY(-menuHeight)就可以做到这种效果。

当要显示菜单栏时，translateY(0)即可。当然隐藏和显示是通过属性动画来完成的。这...]]></description><category></category></item><item><title><![CDATA[listview滚动状态保存和恢复]]></title><link>https://blog.youkuaiyun.com/logan676/article/details/104363085</link><guid>https://blog.youkuaiyun.com/logan676/article/details/104363085</guid><author>logan676</author><pubDate>Mon, 17 Feb 2020 19:09:31 +0800</pubDate><description><![CDATA[获取listview滚动状态


// save index and top position
int index = listView.getFirstVisiblePosition();
View v = listView.getChildAt(0);
int top = (v == null) ? 0 : (v.getTop() - listView.getPaddingTop());
ou...]]></description><category></category></item><item><title><![CDATA[安卓UI设计、验收规范总结]]></title><link>https://blog.youkuaiyun.com/logan676/article/details/104355203</link><guid>https://blog.youkuaiyun.com/logan676/article/details/104355203</guid><author>logan676</author><pubDate>Mon, 17 Feb 2020 11:41:15 +0800</pubDate><description><![CDATA[UI效果图、标注

如果控件带有阴影效果，则需要在标注文件中，把阴影效果的尺寸包含进控件的尺寸中，并且切图时带上阴影效果。如果不这么做，而是仅仅标注出来不带阴影效果的设计图，那会带来很多麻烦。
	动画效果需要给出具体的动画参数，比如起始位置坐标，位移参数、alpha参数、缩放参数、动画时长，动画关键节点等信息。或者出一个视频demo。如果只是一句话，说做出类似于哪个功能的动画，这样的动效就是有很多...]]></description><category></category></item><item><title><![CDATA[《算法导论》第三版学习资料]]></title><link>https://blog.youkuaiyun.com/logan676/article/details/104242809</link><guid>https://blog.youkuaiyun.com/logan676/article/details/104242809</guid><author>logan676</author><pubDate>Mon, 10 Feb 2020 00:17:18 +0800</pubDate><description><![CDATA[课后答案可以参考在线资料，这个资料里面的答案相对比较完整。一次也就看几个问题的，没必要下载，在线查看即可。

https://max.book118.com/html/2019/0520/6051024051002032.shtm
...]]></description><category></category></item><item><title><![CDATA[注意选择合适的数据精度]]></title><link>https://blog.youkuaiyun.com/logan676/article/details/104221168</link><guid>https://blog.youkuaiyun.com/logan676/article/details/104221168</guid><author>logan676</author><pubDate>Sat, 08 Feb 2020 12:08:53 +0800</pubDate><description><![CDATA[一般情况下不必关心数据精度，但在某些应用场景中精度是至关重要的，比如说涉及到价格和支付相关的对精度的要求就比较高，使用bigDecimal是合适的

...]]></description><category></category></item><item><title><![CDATA[TextView setCompoundDrawables时不生效]]></title><link>https://blog.youkuaiyun.com/logan676/article/details/104194545</link><guid>https://blog.youkuaiyun.com/logan676/article/details/104194545</guid><author>logan676</author><pubDate>Thu, 06 Feb 2020 12:33:35 +0800</pubDate><description><![CDATA[项目中遇到TextView setCompoundDrawables时不生效的情况。

不生效原因涉及到setCompoundDrawables的具体实现。

setCompoundDrawables源码如下：


/**
     * Sets the Drawables (if any) to appear to the left of, above, to the
     * right ...]]></description><category></category></item><item><title><![CDATA[Android开发笔记]]></title><link>https://blog.youkuaiyun.com/logan676/article/details/104042279</link><guid>https://blog.youkuaiyun.com/logan676/article/details/104042279</guid><author>logan676</author><pubDate>Sun, 19 Jan 2020 16:27:21 +0800</pubDate><description><![CDATA[&lt;&lt; :左移运算符，num &lt;&lt;1,相当于num乘以2；num &lt;&lt;n,相当于num乘以2的n次方。

&gt;&gt; :右移运算符，num &gt;&gt;1,相当于num除以2；num &gt;&gt;n,相当于num除以2的n次方。

&gt;&gt;&gt; :无符号右移，忽略符号位，空位都以0...]]></description><category></category></item><item><title><![CDATA[计算分割线的高度]]></title><link>https://blog.youkuaiyun.com/logan676/article/details/104038917</link><guid>https://blog.youkuaiyun.com/logan676/article/details/104038917</guid><author>logan676</author><pubDate>Sun, 19 Jan 2020 12:08:28 +0800</pubDate><description><![CDATA[分割线的高度一般是1px，但是测量出来的值可能是0.33dp。所以，不能直接使用0.33dp，因为装换成int之后会导致分割线的高度为0.

使用X2C框架自动升层的代码中，计算0.33dp的代码如下：


(TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,0.33f,getResources().getDisplayMetrics())...]]></description><category></category></item><item><title><![CDATA[ScrollView嵌套ViewPager，左右翻页时ScrollView向上滚动]]></title><link>https://blog.youkuaiyun.com/logan676/article/details/103987028</link><guid>https://blog.youkuaiyun.com/logan676/article/details/103987028</guid><author>logan676</author><pubDate>Wed, 15 Jan 2020 12:27:33 +0800</pubDate><description><![CDATA[记录一次工作中遇到的异常交互问题。

UI层级结构如下：



ScrollView嵌套ViewPager，而ViewPager中子页面放的是GridView。

ViewPager左右翻页时，导致ScrollView向上滚动的原因是：

1.ViewPager左右翻会触发ScrollView的onLayout方法

2. 而ViewPager.onLayout的方法中会检测是否有子View获取...]]></description><category></category></item><item><title><![CDATA[日历计算不是简单的数学加减关系]]></title><link>https://blog.youkuaiyun.com/logan676/article/details/103970939</link><guid>https://blog.youkuaiyun.com/logan676/article/details/103970939</guid><author>logan676</author><pubDate>Tue, 14 Jan 2020 12:13:09 +0800</pubDate><description><![CDATA[如题：日历计算不是简单的数学加减关系。

下面是典型的错误代码示例。


//首先过滤过期或失效文件
int date = EventUtil.getTime(pathname.lastModified());
int currDate = EventUtil.getTime(-1);
if (date + EventConstants.sReserveDays &lt;= currDate) {...]]></description><category></category></item><item><title><![CDATA[RecyclerView源码]]></title><link>https://blog.youkuaiyun.com/logan676/article/details/102990778</link><guid>https://blog.youkuaiyun.com/logan676/article/details/102990778</guid><author>logan676</author><pubDate>Sat, 09 Nov 2019 19:38:51 +0800</pubDate><description><![CDATA[8.1.0源码


@Override
    public boolean onTouchEvent(MotionEvent e) {
        if (mLayoutFrozen || mIgnoreMotionEventTillDown) {
            return false;
        }
        if (dispatchOnItemTouch(e)) ...]]></description><category></category></item></channel></rss>