自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(26)
  • 资源 (2)
  • 收藏
  • 关注

原创 反编译实现夜间模式平滑换肤

日间模式和夜间模式的换皮肤在很早期的一些APP中就已经有实践了。用过的众多APP中,知乎的夜间模式换肤算是体验感非常好的。两年前反编译知乎的app学习了人家的实现思路,效果不错。当然最新版的知乎应用上线后也大面积进行了混淆,捋源码会困难一些。本篇基于未混淆的旧版知乎。早期简单的一种实现方法换肤的主要工作就是切换颜色,之前我经手的一个项目中也有该功能,做法无非是资源文件中定义了两套the...

2018-08-23 23:38:20 461

原创 LruCache——解决OOM的利器

简介LruCache是Android 3.1的时候出现的,一般我们为了兼容低版本会使用v4包下的。LruCache是一种缓存策略,持有的是强引用,但是会控制在一个峰值下。它内部维护了一个队列,每当从中取出一个值时,该值就移动到队列的头部。当缓存已满而继续添加时,会将队列尾部的值移除,方便GC。LruCache用于内存缓存,在避免程序发生OOM和提高执行效率有着良好表现。LRU算法和...

2018-08-16 17:30:10 7784

原创 AsyncTask的原理解析及使用缺陷

AsyncTask是Android从1.5引入的类,它内部做了比较完整的封装。借助它,我们可以很easy的在子线程进行耗时操作,在主线程处理结果,而不用操作Thread或者Handler。即使到目前,用AsyncTask做类似文件的上传或下载也是很方便的。使用就不多介绍了,就是按照AsyncTask的泛型定义,自己构造子类继承AsyncTask。初始化继承AsyncTask的子类在...

2018-08-15 01:01:07 417

原创 EventBus源码解析

前言EventBus是安卓(Java中也可以用)开发中非常流行的一个第三方库,是一种发布/订阅事件的总线.拥有以下特性: * 简化了组件间的通信,可应用与Activity,Fragment和后台线程 * 将事件的发送方和接收方解耦 * 体积小现在的EventBus早已经从2.0进入3.0版本,而且最新版3.1.1也已经稳定了挺长的时间,从17年底再没有更新过GitHub.因为之前的项...

2018-08-05 18:46:33 1817

原创 利用DDMS中的TraceView检测应用中的黑屏无响应问题

测试提的一个Bug:在app首次安装后,从欢迎页点击跳过,接着出现了黑屏并且一直没有响应.只能杀掉了进程,重新启动后正常.也就是说应用出现了假死的现象,这是个很严重的问题,赶紧打开IDE调试:排查原因应用第一次启动,欢迎页加载是没有问题.在跳过进入首页时出现了黑屏现象.那来看首页,首页在第一次启动时做了开启Service、第三方SDK初始化、请求权限处理授权以及三个网络请求.到底是哪个环节...

2018-07-31 17:53:43 530

原创 安卓加载PDF文件的几种方式

前端时间产品提了一个需求,在app内部加载PDF.ios平台有WKWebView可以直接以html的方式加载,但是安卓没有.查阅了相关资料,有以下几种方式.1.连接Google服务器解析安卓的WebView不支持PDF解析,因此通过连接Google的一个服务器转换成功后返回给WebView显示.但是Google的服务,总不能都让用户手机上装VPN吧.String pdfUrl=...

2018-06-05 14:28:29 11169 1

原创 使用Java字符流读写文件遇到的问题

Java中的字符流可以很方便的读写文本文件.但是在使用中发现两个问题,编译环境JDK8:1.执行到最后记得flush()或close()这里用FileReader和FileWriter示例:private static final String sourceName = "D:/MonkeyTestLog.txt";private static final String o...

2018-06-04 16:36:41 3832

原创 Android Studio开发JNI示例

JNI和NDK介绍JNI(Java Native Interface),是方便Java调用C、C++等Native代码所封装的一层接口,相当于一座桥梁。通过JNI可以操作一些Java无法完成的与系统相关的特性,尤其在图像和视频处理中大量用到。NDK(Native Development Kit)是Google提供的一套工具,其中一个特性是提供了交叉编译,即C或者C++不是跨平台的,但通过N...

2018-03-24 23:46:45 31048 6

原创 App应用字体大小保持固定以及关于Configuration的变化

前言安卓4.0之后系统设置->显示里面新增了字体大小设置的选项.看下你自己的安卓机,如果你将字体大小从小号一直增大到特大号,有没有发现某些安装的app里面的字体大小也随着变化了?这样可能是便于了阅读,但是app里面本来能显示完全的内容可能因此就只显示了部分.实际上,我们可以看一下QQ、淘宝等大厂的应用,里面的字体大小并不会随着系统设置的大小而变化.初始解决方法网上早已给出了解决办法,在Applica

2017-12-21 18:18:41 2958

原创 安卓中短信验证码倒计时的几种方式

发送短信验证码后,一般在界面上都会有一个倒计时的显示.在安卓中,实现类似的倒计时有多种方式,当然背后的基本原理都是设定一个初始值,然后每过一定的间隔时间执行操作.用安卓自带的CountDownTimer实现这是最简洁的实现方式.安卓提供了一个CountDownTimer类用于倒计时功能.其使用方法在注释里面写的已经比较清楚了.记时开启后禁掉控件的点击事件,倒计时结束后再开启.防止重复点击导致多个任务

2017-12-21 15:17:22 1112

原创 自己撸一个基于运行时注解的简单IOC框架

概述日常开发中的各种注解还是比较常见的,比如代码里面的各种@Override,@Nullable,后端的话Spring里面的各种注入以及依赖注入框架Dagger.对于更关注于界面的客户端,大名鼎鼎的ButterKnife以及XUtils中的ViewInject也是基于注解实现和使用的。先不去纠结运行效率,自己来写一段简单的注解代码,了解背后的原理。基本原理基于注解的开发,有一个基本概念IOC(Inv

2017-12-14 10:37:55 265

原创 用layer-list自定义drawable图形

在日常开发中会碰到有些情况,背景图不算很复杂,但是用单纯的shape无法满足需求,特别是层叠的样式,其实不需要自定义控件,或者让UI切图.用layer-list创建一个drawable图形就可以了1.layer-list的概念其实就和新建drawable资源中的shape一样,都是root-element.其原理类似RelativeLayout,也就是一层层的叠加.这也就是图层的概念,每一个图层用i

2017-12-12 16:22:21 10559

原创 AndroidStudio升级到3.0的新特性和注意事项

概述谷歌发布Android Studio3.0正式版已经有一段时间了,最近抽空升级了一下,也踩了一些坑.特地记录一下.作为开发者第一时间体验谷歌带来的新特性是很有必要的.当然为了项目稳定性,也要根据实际情况决定是否升级相关插件升级从已有的IDE升级,无非就是File->Settings->Appearance&Behavior->Updates,这里可以选...

2017-11-15 14:05:26 1654 1

原创 使用Jekyll搭建自己的博客

介绍Github Pages是可以托管在Github上的静态网页。用户可以使用它提供的模板,经过Jekyll的再加工后上传到服务器。Jekyll是一款Blog生成器,是Github官方使用的静态站点生成器,不需要数据库的支持。简单的说,利用这两者搭建自己的小型的博客网站(不包含较复杂的功能,数据量不大)是非常方便的,你可以将其看作是一个普通的仓库,你在本地所作的修改提交上去以后,github将会根据

2017-06-05 11:23:14 4776 1

原创 Fork别人的项目以及利用Gradle发布项目到Jcenter

准备工作首先当然是有Github帐号,并且下载了Git For Windows(或其他Git相关工具)并已经正确配制了SSH Key.如果你要借鉴前人已有的思想和工作成果,并且为了满足自己项目的需求对该库做出较大的改动,可以fork别人的项目.往往该库可能相关的代码或者资源文件比较多,想到用Gradle依赖,这样我们就需要建立自己的仓库了Fork别人的项目并Clone到本地在本地所作的修改有的时候可

2017-05-15 19:13:30 823

原创 使用Python在Markdown插入图片并自动获取链接

前言以前写博客都是使用网站的在线编辑器,这种开着网页写东西的感觉,真是。。反正我更喜欢在自己的PC上写好Markdown,然后直接在网站上导入。现在基本大一些的技术网站都可以支持从本地导入Markdown。但是Markdown的插入图片有点麻烦,有些网站比如简书的在线Markdown编辑器支持良好,而如CSDN,如果我使用类似,虽然本地可以插入图片,但是在线导入后显然不能直接获取我的本地资源,因此贴

2017-03-02 14:16:38 5805 1

原创 界面适配华为手机的虚拟按键的解决方案

一、概述在项目中,测试发现在一些华为手机的屏幕适配上出现了问题,主要是因为华为Mate等一些系列的手机有一个虚拟按键的设计.当这些虚拟按键由用户手势滑出,或默认显示的话,就会遮挡我们本身的应用布局.比如欢迎界面过后是四个Fragment,那么底部的四个tab就会被虚拟的导航栏遮住,非常难看.当然,欢迎页的图片适配也同样会出现问题. Google后得出第一个问题的解决方案.第二个图片的问题则用自己摸

2017-02-27 15:50:29 29840 18

原创 SwipeRefreshLayout+RecyclerView 完成下拉刷新,上拉加载更多的自定义控件,简单好用

下拉刷新,上拉加载更多在许多应用中都频频用到,特别是需要分页加载数据时.之前在项目中经常用到的是网上非常普遍的PullToRefreshLayout.该框架比较好用,不过是比较旧了.就想着重新找一个控件.因为现在android 5.0应用的已经比较多了,所以就想做一个和知乎效果差不多的效果.      谷歌官方为我们提供一个SwipeRefreshLayout的刷新控件,效果不错,不过仅仅有下

2016-12-06 14:18:31 922

原创 "Variables debug info not available" Debug出现问题的解决

前几日在Android Studio上导入了一个Eclipse项目,运行成功,并且可以正常Debug.谁知今天在Debug的过程中不知道进行了什么操作,导致每次Debug后无法定位到所标记的断点部分,而是跳出异常:        在网上也搜索不到类似的问题,StackOverFlow上倒是有相似的问题,那哥们直接重装了AS和SDK,瞬间觉得不是个事.于是又打开以前写的一些项目和Demo

2016-11-23 20:58:37 12921 1

原创 Genymotion创建模拟器的正确姿势

Genymotion模拟器大家应该都很熟悉了,启动速度快,流畅,资源占用低.但是由于众所周知的”墙”的原因,有的时候在下载和添加模拟器的时候有些坑,需要我们去注意一下. 进入Genymotion官网,注册,登录,下载,安装,这些都不细说.开始的时候我们的模拟器列表是空的,需要我们自己去添加,也就是界面上方的”+”号,如果网络连接正常的话点击后会出现一串模拟器列表: 从中选择你想要添加的模拟器

2016-10-07 16:37:01 3435

原创 USB驱动异常的解决办法

前几天,因为我的U盘出了些问题,用U盘量产工具修复,中间的过程比较坑爹,在使用完量产工具后悲催的发现:鼠标动不了了,U盘插入后也无响应,只能借助触摸板对电脑进行操作。        网上查阅相关资料后,发现原来是由于量产工具会更新USB驱动和修改其注册表,这会造成原先的USB驱动异常,并且由于注册表被修改,仅仅通过卸载原驱动重新安装,或者更新驱动是无法解决问题的.最后还是得从注册表入手。

2016-10-05 22:29:43 39559 3

原创 Material Design入门(下)

    除了Google官方提供的组件,Material Design另一个非常重要的特性是它的视图效果,这些效果和官方的组件一起,为安卓app的交互提供了更好的素材1.Elevation:高度      先介绍从Android L(5.0)以后谷歌引入的一个非常重要的概念:高度和阴影,就是将z轴引入视图的展现,让界面不再是呆板的二维视图,更真实和立体,具有视觉上的高度层次和阴影投射。      ...

2016-09-24 21:03:49 500

原创 Material Design入门(上)

Material Design是Google I/O 2014发布推行的,旨在统一Android Mobile、Android Table、Desktop Chrome 等全平台设计语言规范。具有比较浓重的程序感的设计风格,也在不断的完善。当然作为开发的我最直观的感受就是它提供的一系列组件及交互动画。0.引入项目中使用    因为MD是在Android 5.0后全面推出的,因此为了兼容

2016-09-24 20:58:17 557

原创 对事件分发的探讨

在开发中,我们经常要完成一些稍复杂的功能和交互。而这些交互往往不是触发型的,仅仅用各种动画是无法完成的,这时候就需要掌握View的一个核心知识:事件分发机制。这个比较重要也比较难,但实际上我们基本上每天都在直接或间接的跟它打交道。        1.点击事件的传递      事件的产生来源于我们的手指在屏幕上的动作。典型的事件类型:按下、移动、松开,以及实时产生的坐标值

2016-09-24 20:08:57 540

原创 对于流式布局的研究和一点心得

流式布局1,可以看作会自动换行的线性布局分情况换行细节问题:子View的排列2,具体实现(重写onMeasure())   1,获取当前流式布局的测量模式和测量尺寸(需要计算子View的,要减去padding)   2.拿到当前流式布局的每一个子View(遍历),如果不可见,就进行下一次循环      利用合成规范其大小,不能超过父View的大小

2016-09-24 20:07:44 3531

原创 View的绘制过程

1 测量1.1 View的测量 通过查看源码得知,在View中有一个measure方法,注释写的很清楚:系统在测量一个控件的大小的时候会调用该方法。而实际上measure方法内部调用的onMeasure方法才是真正完成了View的测量工作。

2016-09-24 20:05:57 445

SwipeRefreshLayout+RecyclerView 下拉刷新,上拉加载更多的自定义控件

SwipeRefreshLayout+RecyclerView 下拉刷新,上拉加载更多的自定义控件

2016-12-06

SwipeRefreshLayout+RecyclerView 完成下拉刷新,上拉加载更多的自定义控件

SwipeRefreshLayout+RecyclerView 完成下拉刷新,上拉加载更多的自定义控件

2016-12-06

空空如也

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

TA关注的人

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