自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(32)
  • 收藏
  • 关注

原创 Android实现骨架屏占位加载效果(二)

这篇的内容是介绍Piccolo的思路以及主要实现过程。实现思路要实现骨架屏占位加载,要解决以下几个问题:实现占位效果标记显示位置对列表的支持实现占位效果为了便于自定义占位效果,以及更低的内存消耗,选择比View更轻量级的Drawable实现占位效果。Piccolo提供了两种加载效果ImageShiningDrawable和TextShiningDrawable,其主要实现都是基于ShiningDrawable。类图关系如下:ShiningDrawable实现了Shining接口,Sh

2021-05-21 17:54:06 963

原创 Android实现骨架屏占位加载效果(一)

<p>Android骨架屏,支持单独View、RecyclerView、ListView、GridView、ViewPager。相比其他框架有更加统一的api,以及内存优化。</p><h2 id="

2021-05-17 14:26:43 1373

原创 深入解析Android的StateListDrawable

<p>在 Android 中我们经常使用 <strong>StateListDrawable</strong> ,来实现按钮、列表项等控件在不同状态下的外观,每种状态对应一个drawable资源。<

2021-04-15 19:01:27 966

原创 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 1264

原创 Flutter 100问:为什么PageView切换页面State重新创建

<h1 id="为什么pageview切换页面state重新创建">为什么PageView切换页面State重新创建</h1><h2 id="why">Why</h2><p>PageView的渲染

2021-04-01 10:01:07 984

原创 记一次Android OOM探险之旅

记一次Android OOM探险之旅分析利器查看内存状态adb shell dumpsys meminfo packageNameMAT使用MAT(Memory Analyzer Tool)Dominator Tree:列出存活的对象右键对象 -&gt; Path To GC Roots -&gt; exclude all phantom/weak/soft etc.refe...

2018-11-05 10:51:09 574

原创 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 2219

原创 通过KeyEvent选中控件

通过KeyEvent选中控件知识准备要准确的理解这篇文章,首先需要理解Android KeyEvent分发机制需求说明通过上、下、左、右四个方向KeyEvent选中区块。自定义KeyCode为300、301两个KeyEvent。300时在区块内顺时针寻找下一个可获取焦点控件,301时在区块内逆时针寻找上一个可获取焦点控件。支持ListView,GridView等集合类控件。KeyCode为30

2018-02-01 23:06:55 524

原创 水波纹进度条实现

水波纹进度条实现参考文章 Android自定义View——实现水波纹效果类似剩余流量球我的思路水波示意图: 如何绘制水波水波形状,使用贝塞尔曲线。如上图所示,y轴为控件左边界,在左边界多绘制一个周期。这个周期是水波X方向上的移动范围。如何让水波动起来每次进度增加的时候,绘制起始点在X右方向上移动一小段距离,随着进度不断增加,水波不断向前移动。绘制起始点X坐标计算公式:当前绘制起始点X坐标=初始绘制

2017-11-16 16:03:06 1428

原创 仿QQ未读消息拖拽效果

仿QQ未读消息拖拽效果技术参考文章贝塞尔曲线介绍Android自定义控件:类QQ未读消息拖拽效果补充说明Android自定义控件:类QQ未读消息拖拽效果,这篇文章在求解A,B,C,D四个点上不尽详述,所以下面进行补充说明。图示:计算过程:技术总结计算A,B,C,D四点坐标了解拖拽过程连接固定圆和拖拽圆之间的曲线实现,即贝塞尔曲线如何让QQDotView拖拽区域为整个屏幕?使用WindowMan

2017-11-08 16:28:06 330

原创 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 339

原创 Android SQLite数据类型

SQLite数据类型概述我们熟知的数据库引擎大部分采用静态数据类型,即列定义的类型定义了值的存储,并且值要严格满足列的定义,同一列所有值的存储方式都相同,比如定义了一个列类型为整型 int,不能在该列上输入’abc’。SQLite的数据类型则采用了动态类型,列定义不能决定值的存储,值的存储由值本身决定,因此在SQLite中,同一列会有多种存储方式。数据类型与存储类 在SQLite中,存储分类和数

2017-09-07 18:14:59 554

转载 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 2697

原创 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 505

原创 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 639

原创 android-clipChildren属性

android:clipChildren属性属性介绍android:clipChildren用来设置是否剪切children。使用场景通常会看到中间的tab会更大,甚至超出parent的限制,如图: 属性使用方法android:clipChildren=”false”表示不剪切children,但是children大小不能超过parent的大小,所以如果children的直接parent大小不够容

2017-08-09 15:25:49 612

原创 解密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 517

原创 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 639

原创 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 470

原创 Java泛型介绍

Java泛型介绍泛型定义:参数化类型,数据类型被指定为一个参数定义泛型1.定义在类声明上,作用域为整个类 public class ArrayList 2.定义在方法上(静态方法也类似) public void init(T t) 实例化泛型ArrayList list=new ArrayList<>();init(“abc”);在实例化类或调用方法时要指定具体类。通配符在实例化类时,不确定

2017-06-08 11:57:28 202

原创 关于Span的flags说明

关于Span的flags说明背景很多时候希望,文本的不同部分有不同的表示方式,比如某些字符串为红色、某些字符串加粗、添加背景色等等。如图所示: 要实现这种效果,通常使用SpannableString类或SpannableStringBuilder类。两者都要用到setSpan(Object what,int start,int end,int flags)方法,关于最后一个参数的含义就是本文章

2017-04-10 18:16:37 536

原创 Android 的坐标系及矩阵变换

Android 的坐标系及矩阵变换Android的坐标系2D坐标系android的2d坐标系如图所示,水平向右为X轴正方向,竖直向下为Y轴正方向,原点为屏幕左上角。 注意:以屏幕左上角为原点的坐标系,称作绝对坐标系,将原点平移到View的左上角,称作相对坐标系。对View进行操作时,更多使用的是相对坐标系。3D坐标系左手坐标系在计算机科学中,大多3D坐标系使用的是左手坐标系(包括Android

2017-04-10 10:11:16 3513

原创 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 329

翻译 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 288

原创 Android 权限(Permission)控制

Working with System Permissions笔记Declaring Permissions在Manifest里声明的权限,不涉及用户隐私的权限,系统自动授权,设计隐私的权限,系统会询问用户,让用户授权。Android5.1和更低版本,用户在安装时给app授权,包括涉及用户隐私的权限;Android6.0和更高版本涉及用户隐私的权限在运行时授权。App只需要直接执行相关动作的权限。比

2017-02-04 18:14:05 352

原创 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 430

原创 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 549

翻译 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 379

原创 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 9672

原创 使用AccountManager和AbstractAccountAuthenticator建立账户系统

使用AccountManager和AbstractAccountAuthenticator建立账户系统使用AccountManager和AbstractAccountAuthenticator建立账户系统为什么要使用AccountManager和AccountAuthenticatrAccountManager和Authenticator之间的关系使用AccountManager管理账号创建

2016-11-16 16:57:45 6023 1

原创 Android本地化

支持不同语言支持不同屏幕支持不同语言Android平台能够在运行时根据本地区域设置来选择不同语言。如果所有string都来源strings.xml,那么定义可选的string.xml文件,android系统在运行时会进行正确选择。实现方法: 默认创建的string.xml在res/values/目录下。为支持不同语言,在res/目录下创建包含”-“和ISO语言码的values目录,形如”valu

2016-10-25 17:01:50 383

原创 Android事件分发机制源码分析

那么当前Activity不会回调onStop。onStart和onResume,onPause和onStop的区别:onStart和onStop是从Activity是否可见这个角度来回调的,而onResume和onPause是从Activity是否位于前台这个角度来回调的。我们知道onPause和onStop都不能执行耗时的操作,尤其是onPause,这也意味着,我们应当尽量在onStop

2016-09-17 12:50:36 677

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除