- 博客(32)
- 收藏
- 关注
原创 Android实现骨架屏占位加载效果(二)
这篇的内容是介绍Piccolo的思路以及主要实现过程。实现思路要实现骨架屏占位加载,要解决以下几个问题:实现占位效果标记显示位置对列表的支持实现占位效果为了便于自定义占位效果,以及更低的内存消耗,选择比View更轻量级的Drawable实现占位效果。Piccolo提供了两种加载效果ImageShiningDrawable和TextShiningDrawable,其主要实现都是基于ShiningDrawable。类图关系如下:ShiningDrawable实现了Shining接口,Sh
2021-05-21 17:54:06
1116
原创 Android实现骨架屏占位加载效果(一)
<p>Android骨架屏,支持单独View、RecyclerView、ListView、GridView、ViewPager。相比其他框架有更加统一的api,以及内存优化。</p><h2 id="
2021-05-17 14:26:43
1552
原创 深入解析Android的StateListDrawable
<p>在 Android 中我们经常使用 <strong>StateListDrawable</strong> ,来实现按钮、列表项等控件在不同状态下的外观,每种状态对应一个drawable资源。<
2021-04-15 19:01:27
1197
原创 Flutter 100问:http怎样自动获取代理配置
<h1 id="flutter-100问:http怎样自动获取代理配置">Flutter 100问:http怎样自动获取代理配置</h1><h2 id="why">Why</h2><p>Flutt
2021-04-01 15:02:32
1519
原创 Flutter 100问:为什么PageView切换页面State重新创建
<h1 id="为什么pageview切换页面state重新创建">为什么PageView切换页面State重新创建</h1><h2 id="why">Why</h2><p>PageView的渲染
2021-04-01 10:01:07
1181
原创 记一次Android OOM探险之旅
记一次Android OOM探险之旅分析利器查看内存状态adb shell dumpsys meminfo packageNameMAT使用MAT(Memory Analyzer Tool)Dominator Tree:列出存活的对象右键对象 -> Path To GC Roots -> exclude all phantom/weak/soft etc.refe...
2018-11-05 10:51:09
604
原创 Android KeyEvent分发机制
Android KeyEvent分发机制简介KeyEvent的分发机制和TouchEvent的分发机制略有不同,KeyEvent向下分发的事件没有被消费,并且KeyCode为KEYCODE_DPAD_LEFT,KEYCODE_DPAD_RIGHT,KEYCODE_DPAD_UP,KEYCODE_DPAD_DOWN,那么会按方向查找下一个控件并获取焦点。触摸事件分发机制传送门: Android触摸事件
2018-02-01 23:11:33
2405
原创 通过KeyEvent选中控件
通过KeyEvent选中控件知识准备要准确的理解这篇文章,首先需要理解Android KeyEvent分发机制需求说明通过上、下、左、右四个方向KeyEvent选中区块。自定义KeyCode为300、301两个KeyEvent。300时在区块内顺时针寻找下一个可获取焦点控件,301时在区块内逆时针寻找上一个可获取焦点控件。支持ListView,GridView等集合类控件。KeyCode为30
2018-02-01 23:06:55
561
原创 水波纹进度条实现
水波纹进度条实现参考文章 Android自定义View——实现水波纹效果类似剩余流量球我的思路水波示意图: 如何绘制水波水波形状,使用贝塞尔曲线。如上图所示,y轴为控件左边界,在左边界多绘制一个周期。这个周期是水波X方向上的移动范围。如何让水波动起来每次进度增加的时候,绘制起始点在X右方向上移动一小段距离,随着进度不断增加,水波不断向前移动。绘制起始点X坐标计算公式:当前绘制起始点X坐标=初始绘制
2017-11-16 16:03:06
1508
原创 仿QQ未读消息拖拽效果
仿QQ未读消息拖拽效果技术参考文章贝塞尔曲线介绍Android自定义控件:类QQ未读消息拖拽效果补充说明Android自定义控件:类QQ未读消息拖拽效果,这篇文章在求解A,B,C,D四个点上不尽详述,所以下面进行补充说明。图示:计算过程:技术总结计算A,B,C,D四点坐标了解拖拽过程连接固定圆和拖拽圆之间的曲线实现,即贝塞尔曲线如何让QQDotView拖拽区域为整个屏幕?使用WindowMan
2017-11-08 16:28:06
367
原创 ImageView支持Exif
ImageView支持Exif什么是Exif可交换图像文件格式,简称为Exif(Exchangeable image file format)。是专门为数码相机的照片设定的,可以记录数码照片的属性信息和拍摄数据。exif中包含图片的方向信息,这个是本文讨论的重点。exif orientation详细介绍链接中的orientation value,0th row,0th column的关系换成下图更好
2017-10-16 15:03:41
376
原创 Android SQLite数据类型
SQLite数据类型概述我们熟知的数据库引擎大部分采用静态数据类型,即列定义的类型定义了值的存储,并且值要严格满足列的定义,同一列所有值的存储方式都相同,比如定义了一个列类型为整型 int,不能在该列上输入’abc’。SQLite的数据类型则采用了动态类型,列定义不能决定值的存储,值的存储由值本身决定,因此在SQLite中,同一列会有多种存储方式。数据类型与存储类 在SQLite中,存储分类和数
2017-09-07 18:14:59
687
转载 Intent.FLAG_ACTIVITY_FORWARD_RESULT作用
Intent.FLAG_ACTIVITY_FORWARD_RESULT作用适用情况多个Activity的值传递。ActivityA到达ActivityB再到达ActivityC,但ActivityB为过渡页可以finish了,此时ActivityC将值透传至ActivityA。代码实现第一个页面:A跳到Bpublic class AActivity extends Activity{ @Ov
2017-08-30 15:40:50
2938
原创 Mac配置Android环境变量
Mac配置Android环境变量背景Mac上在Android Studio控制台输入adb会发现adb:command not found的问题。原因是没有配置Android环境变量。配置环境变量打开mac的terminal终端,输入 cd ~/ 【进入当前用户的home目录】输入 touch .bash_profile 【如果没有.bash_profile这个文件,则创建一个文件】输入 open
2017-08-30 15:40:18
574
原创 WebView的一些坑
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
2017-08-30 15:38:59
857
原创 android-clipChildren属性
android:clipChildren属性属性介绍android:clipChildren用来设置是否剪切children。使用场景通常会看到中间的tab会更大,甚至超出parent的限制,如图: 属性使用方法android:clipChildren=”false”表示不剪切children,但是children大小不能超过parent的大小,所以如果children的直接parent大小不够容
2017-08-09 15:25:49
912
原创 解密Android Resource
Android xml里引用资源语法@[package:]type/name@表示引用资源,声明这是一个资源引用,name是资源名。 引用id一般我们应该用”@+id/”来定义一个id,然后用@id来引用一个id,但是现在我发现apps/settings/res/layout/preferenc_progress.xml中有个”@+android:id/title”,怎么理解它?怎么用? 加上and
2017-08-04 15:29:09
576
原创 FragmentTabHost的正确使用姿势
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
2017-07-13 17:32:29
679
原创 highestOneBit()算法解析
highestOneBit()算法解析Integer类有个highestOneBit()方法,作用是返回具有单个 1 位的 int 值, 在指定值中最高位的 1 位的位置,比如5(00000101)返回4(00000100)。highestOneBit()的算法如下:public static int highestOneBit(int i) { // HD, Figure 3-1
2017-06-15 16:47:42
520
原创 Java泛型介绍
Java泛型介绍泛型定义:参数化类型,数据类型被指定为一个参数定义泛型1.定义在类声明上,作用域为整个类 public class ArrayList 2.定义在方法上(静态方法也类似) public void init(T t) 实例化泛型ArrayList list=new ArrayList<>();init(“abc”);在实例化类或调用方法时要指定具体类。通配符在实例化类时,不确定
2017-06-08 11:57:28
223
原创 关于Span的flags说明
关于Span的flags说明背景很多时候希望,文本的不同部分有不同的表示方式,比如某些字符串为红色、某些字符串加粗、添加背景色等等。如图所示: 要实现这种效果,通常使用SpannableString类或SpannableStringBuilder类。两者都要用到setSpan(Object what,int start,int end,int flags)方法,关于最后一个参数的含义就是本文章
2017-04-10 18:16:37
602
原创 Android 的坐标系及矩阵变换
Android 的坐标系及矩阵变换Android的坐标系2D坐标系android的2d坐标系如图所示,水平向右为X轴正方向,竖直向下为Y轴正方向,原点为屏幕左上角。 注意:以屏幕左上角为原点的坐标系,称作绝对坐标系,将原点平移到View的左上角,称作相对坐标系。对View进行操作时,更多使用的是相对坐标系。3D坐标系左手坐标系在计算机科学中,大多3D坐标系使用的是左手坐标系(包括Android
2017-04-10 10:11:16
3692
原创 Android View的工作流程
View的工作流程View的measure过程View的measure过程由measure方法来完成,其中会调用onMeasure方法来确定View的大小。一般来说,继承View的子类都会重写onMeasure方法来确定大小。首先,看看View的onMeasure方法。protected void onMeasure(int widthMeasureSpec, int heightMeasureSp
2017-03-14 18:23:44
349
翻译 Sharing Simple Data笔记
Sharing Simple Data通过Intent来传递数据。Sending Simple Data to Other Apps向多媒体添加文件:MediaScannerConnection.scanFile(this, new String[]{Environment.getExternalStorageDirectory() + "/" + "Download/20150525_091043
2017-02-04 18:17:54
320
原创 Android 权限(Permission)控制
Working with System Permissions笔记Declaring Permissions在Manifest里声明的权限,不涉及用户隐私的权限,系统自动授权,设计隐私的权限,系统会询问用户,让用户授权。Android5.1和更低版本,用户在安装时给app授权,包括涉及用户隐私的权限;Android6.0和更高版本涉及用户隐私的权限在运行时授权。App只需要直接执行相关动作的权限。比
2017-02-04 18:14:05
398
原创 Taking Photos Simply
Taking Photos Simply笔记以下内容均是使用已经存在的carmera app进行拍照。Request Camera Permission如果拍照是你的app一个非常重要的功能,在manifest文件使用<uses-feature>标签,Google Play只会对有相机的设备可见。<manifest ... > <uses-feature android:name="andr
2017-02-04 18:13:50
471
原创 Sharing Files
Sharing Files笔记Setting Up File Sharing为了安全地向别的app提供文件,使用URI是个很好的方法。FielProvider可以为文件生成URI。指定FileProvider:<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.my
2017-02-04 18:12:26
603
翻译 Saving Data笔记
Saving Data笔记SharedPreferences APIs是用来读/写键值对的,Preference APIs是用来构建app设置页面的UI(其使用SharedPreference来保存app设置)。SharedPreferences获取SharedPreferences引用通过Context的getSharedPreference()方法。Context context = get
2016-12-22 14:32:46
411
原创 ListView设置选中状态
ListView设置选中状态使用方法通常在ListView的子View被选中时,希望给顶一个被选中的状态,比如,更改背景色。为了使子View在选中时改变背景,可以用<selector/>标签实现。 activated.xml<selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:
2016-12-20 15:50:51
10020
原创 使用AccountManager和AbstractAccountAuthenticator建立账户系统
使用AccountManager和AbstractAccountAuthenticator建立账户系统使用AccountManager和AbstractAccountAuthenticator建立账户系统为什么要使用AccountManager和AccountAuthenticatrAccountManager和Authenticator之间的关系使用AccountManager管理账号创建
2016-11-16 16:57:45
6397
1
原创 Android本地化
支持不同语言支持不同屏幕支持不同语言Android平台能够在运行时根据本地区域设置来选择不同语言。如果所有string都来源strings.xml,那么定义可选的string.xml文件,android系统在运行时会进行正确选择。实现方法: 默认创建的string.xml在res/values/目录下。为支持不同语言,在res/目录下创建包含”-“和ISO语言码的values目录,形如”valu
2016-10-25 17:01:50
418
原创 Android事件分发机制源码分析
那么当前Activity不会回调onStop。onStart和onResume,onPause和onStop的区别:onStart和onStop是从Activity是否可见这个角度来回调的,而onResume和onPause是从Activity是否位于前台这个角度来回调的。我们知道onPause和onStop都不能执行耗时的操作,尤其是onPause,这也意味着,我们应当尽量在onStop
2016-09-17 12:50:36
1032
空空如也
关于AVL Tree(平衡二叉树)的一点疑问
2023-08-14
TA创建的收藏夹 TA关注的收藏夹
TA关注的人