自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

xingfeng_coder的博客

学如逆水行舟,不进则退

  • 博客(121)
  • 资源 (3)
  • 论坛 (1)
  • 收藏
  • 关注

原创 欢迎关注我的微信公众号

2019年定了几个flag,其中一个就是建了公众号,来发发文章。现在公众号已经有了,接下来就是发发文章了,目前主要是自己写的学习的知识、项目中遇到的问题以及解决方案,还有就是源码的阅读使用。说实话,微信公众号发文不太友好,不支持markdown,还要自己转一把;gif又不能超过2m,又得压缩或转成视频,有点蛋疼。幸好找到了两个工具,这样还算方便点。markdown转微信公众号格式图片处理网...

2019-01-12 14:33:17 477

原创 闲话元注解@Retention

元注解@Retention元注解是用来描述注解的。@Retention用来描述注解将会在哪个层次存在,有三个值:RetentionPolicy.SOURCE:只会在java文件中存在,class文件中就不可见了。可以被编译器使用RetentionPolicy.CLASS:会在class中可见,不需要被虚拟机加载。编译时可见RetentionPolicy.RUNTIME:在class中可见...

2020-01-04 11:41:18 322

原创 2019年年终总结

19年的感悟,两个词:分层以及学习。分层这个社会是分层的,只是每一层的界限不那么明了,但它确实就在那。软件开发这个行业也多是分层的,OSI七层模型,TCP/IP五层模型,都是分层的,所以分层的意义是什么呢?Android开发都会提到一个组件化、模块化的概念,其实也是分层,每层做自己的事情,相近的两层有沟通,职责分明,简单明了,这既是软件行业也是这个社会分层的意义吧。学习其实这个词总结...

2020-01-01 12:50:43 160 1

原创 ArrayMap数据结构分析

ArrayMap是Android上特有的一个性能比较高的Map,和HashMap一样,也实现了Map接口。这里只分析其数据结构部分,不分析其高效缓存部分。分析ArrayMap的结构是int[] mHashes,记录每个key的hash值;Object[] mArray记录Key和Value,对于每一组Key和Value,按照Key和Value的顺序排列。put(K,V)时,首先根据K计算出...

2019-12-29 12:01:18 964 1

原创 1.8ConcurrentHashMap源码分析

ConcurrentHashMap是一个线程安全的HashMap,ConcurrentHashMap和HashMap的底层数据结构相同,都是数组+链表+红黑树;但是hash方法、键、值不允许为null和Hashtable一样,并且都是线程安全的,只不过实现同步的细节上有所差别。尽管支持高并发的读写,但是ConcurrentHashMap在读操作时不会加锁。关于HashMap和Hashtable...

2019-12-07 22:38:35 205

原创 SparseArray源码分析

Android有一组自己的集合类,原因是使用java的集合太占内存。这里主要介绍下SparseXXX系列的容器。SparseArray将int映射成object,类似Map<Integer,Object>,但是由于不需要自动装箱,因此会更节约内存。另外,与HashMap的区别是,由于key是int的,因此其查找使用的是二分查询,而不是hashMap的哈希查询,因此SparseArr...

2019-11-13 15:16:49 299

原创 Flutter状态管理(2)——单Stream和广播Stream

在Flutter状态管理(1)——InheritedWidget中介绍了状态管理以及如何使用InheritedWidget来实现全局状态的管理。这篇博客将介绍如何使用Stream来实现状态管理。Stream是一种流,在dart中用于异步产生数据,分为两种类型:单订阅Stream和广播Stream。单订阅Stream只允许在该Stream的整个生命周期内使用单个监听器,即使第一个subscript...

2019-09-20 10:17:58 955

原创 Flutter状态管理(1)——InheritedWidget

状态管理Flutter的状态管理分为两种:局部状态和全局状态。局部状态:根据官方的含义,就是一个StatefulWidget可以搞定的,比如BottomNavigationBar、PageView等等,其他Widget不需要知道你的状态,你也不需要依赖其他Widget的状态;setState可以实现状态的切换;全局状态:整个app很多页面都需要用到的状态,比如是否登录了,用户名、用户id等;...

2019-09-16 10:12:58 943

原创 Flutter数据传输

从上往下数据从根往下传数据,常规做法是一层层往下,当深度变大,数据的传输变的困难,flutter提供InheritedWidget用于子节点向祖先节点获取数据的机制,如下例子:class FrogColor extends InheritedWidget { const FrogColor({Key key, @required this.color, @required Widget c...

2019-09-12 09:40:23 512

原创 Flutter版本玩Android客户端(7)——状态管理

在上一篇文章Flutter版本玩Android客户端(6)——登录注册模块以及文章收藏与取消中完成了登录模块,但遗留的问题是未进行状态同步,导致left drawer的状态没有变化。本文继续完善该部分,效果如下:状态管理对于登录状态这个值,很多widget需要用到,属于全局状态,这里使用provider进行管理。关于状态管理的更多知识,可以参考后面的文章。提供初始化状态在main入口处...

2019-09-11 19:34:57 138

原创 Flutter版本玩Android客户端(6)——登录注册模块以及文章收藏与取消

本篇继上篇Flutter版本玩Android客户端(5)——微信公众号tab点击跳转后,完成了登录注册模块,以及文章收藏与取消。但仍有部分没有完成,比如登录状态的同步,drawer的header中没有因登录状态而改变。先看效果:登录注册玩Android登录后,会返回一个cookie,需要将该cookie保存,然后在一些post接口上带上该cookie表示用户信息,比如收藏、取消收藏都隐含...

2019-08-14 20:21:56 523

原创 Flutter版本玩Android客户端(5)——微信公众号tab点击跳转

在Flutter版本玩Android客户端(4)——知识体系tab点击跳转中,完成了主页面知识体系tab的点击跳转,本文主要完成微信公众号tab的跳转。效果如下:微信tab的跳转微信tab的跳转后也是一个文章列表,复用ArticleList这个Widget。代码如下:class _WeChatArticleListWidgetState extends State<WeChatAr...

2019-08-12 14:51:37 203

原创 Flutter版本玩Android客户端(4)——知识体系tab点击跳转

在Flutter版本玩Android(3)——文章详情页中完成了用webview加载文章详情页,本文趁热打铁,完成知识体系tab的跳转逻辑。和以往一样,先看效果:体系小item的跳转文章列表Widget的封装小item的跳转到一个文章列表,由于发现文章列表和首页可以公用,因此将其抽离出来,完成封装,如下:class ArticleListWidget extends Stateless...

2019-08-09 10:39:26 189

原创 Flutter版本玩Android(3)——文章详情页

本文主要包含路由的跳转以及WebView显示文章详情页。效果如下:路由跳转Flutter通过Navigator类来进行页面路由的管理。push:指定跳转的widgetpushNamed:命名路由,string—>widgetpushXXX表示跳转到下一页面,pop表示跳出当前页面,可以携带参数跳转。具体可以参考路由管理。携带参数跳转Navigator.of(contex...

2019-08-07 10:27:15 329

原创 跨平台开发的那些事

跨平台架构oc中,直接引用c、c++代码的需要命名为mm格式自己开发的framework是静态库;Android的.so是共享库os x中,.a表示静态库,.dylib表示动态库linux中,.a表示静态库,.so表示动态库windows中,.lib表示静态库,.dll表示动态库绿色表示库,黄色表示接口层,红色表示调用层CMakeCMake是一个开源的跨平台自动化构建系...

2019-08-05 17:02:57 801

原创 Flutter版本玩Android(2)——主页面数据获取

上一部分构造了主页面,这一部分主要完成主页面三个tab的数据获取,下一步的点击事件目前都未处理。先看下效果:使用的库这部分接入了几个三方库,分别是:网络库:Dio,这部分封装了一个单例出来,负责网络请求首页轮播图:BannerViewjson序列化:json-serializable,这部分需要注意如何生成辅助代码,可以参考后面的example首页下拉刷新、上拉加载:pull_t...

2019-08-04 16:14:14 130

原创 Flutter版本玩Android客户端(1)——搭建主页面

最近在学Flutter,想着画点时间做个app,就做玩Android,可以利用现有的APi进行操作。第一步:搭建主页面,如下:主要包括几部分:AppBar,包含Drawaer,可以打开BottomNavigationBar:底部导航栏,切换时body内容变换图标第三个使用了三方图标,后面重点说下如何使用第三方Icon;如果使用Image作为Icon,那么点击的变色不会存在,而使用Ic...

2019-08-02 09:58:52 240

原创 你应该了解的JNI知识(三)——注意点

native层打印logcat日志native层打印logcat日志,有两种方式:调用Java层的Log.i/v()之类的方法,可以参考你应该了解的JNI知识(二)——Java与JNI互相调用,里面介绍了如何在native层调用Java代码。使用liblog.so进行打印,和Log.i/v()底层使用同样的原理这里主要介绍如何使用第二种方法打印日志。主要包含三个步骤:cmake文...

2019-07-02 10:11:24 140

原创 你应该了解的JNI知识(二)——Java与JNI互相调用

在你应该了解的JNI知识(一)——静态注册与动态注册中,了解了JNI是如何使用的,以及两种注册方式的使用以及区别。本篇博客将介绍Java和JNI的互相调用,因此主要包括两部分:JNI层调用Java层Java层调用JNI、Native层JNI层调用Java层JNI层调用Java层有点类似Java的反射机制,需要首先找到类、再找到某个方法或字段,再进行调用。这里涉及JNIEnv的几个方法...

2019-06-17 11:26:51 306

原创 你应该了解的JNI知识(一)——静态注册与动态注册

最近一直在做native这边的跨平台开发,整个结构基本就是下图:大体说来就是,底层C/C++代码。那么对于两端分别有不同的处理:对于Android端而言,由于需要给Java端使用,因此需要提供JNI接口,然后将整个的代码打包编译成.so给Android端使用对于iOS端,由于oc是可以直接调用c的,但是需要将代码打包编译成iOS需要的Framework,然后由于需要给iOS端使用,...

2019-06-10 14:59:14 244

原创 从0到1实现一个Android路由(6)——拦截请求再跳转

在从0到1实现一个Android路由(2)——URL解析器中,提到过请求拦截,其中有个常见的场景是某个页面是需要登录状态的,那么首先要调到登录页,完成了登录之后再跳转到路由页面,但通常登录页都是跳转到主页面的,这该怎么实现呢?上篇文章中没有解决这个问题,本文主要来解决这个问题。解决这个问题的核心是Hook,接管startActivity(),进行偷梁换柱。因为所有的跳转最终都是通过startAc...

2019-04-21 12:33:39 795

原创 从0到1实现一个Android路由(5)——对Kotlin模块的支持

在从0到1实现一个Android路由(3)——APT收集路由中,提到过Processor处理Kotlin类时,无法得到注解从而路由表不正确,本章将介绍如何解决这个问题。参考自阿里的ARouter。解决方案其实解决方案很简单,修改在有用注解标注的Kotlin写的Activity的module的build.gradle。修改点有几点:添加apply plugin:‘kapt’将annota...

2019-04-21 12:32:04 219

原创 从0到1实现一个Android路由(4)——多模块的APT收集路由

在从0到1实现一个Android路由(3)——APT收集路由中,已经实现了在同一个module中收集路由,当引入了一个other_module时,发现并没有收集到这个信息,这是咋回事呢?以前需要怎么解决呢?这就是本篇文章的由来。other_module模块other_module其实很简单,就一个Activity,用@Path("/otherMoudleActivity")注解,其和app模块...

2019-04-21 12:30:45 545

原创 从0到1实现一个Android路由(3)——APT收集路由

之前的例子中,关于url和Activity之间的关系,是写死在一个Map中的,可以看做是一个静态路由。随着项目规模的扩大,这样一个个的手写那张表是个工作量比较大的工作,那么有什么简单的方式可以实现自动化呢?答案是APT(Annotation Processing Tool)。原理是在编译时收集注解信息,然后生成源代码或进行某些操作。对于路由,做法可以是给要跳转的Activity声明注解,指定其跳...

2019-04-21 12:29:22 500

原创 从0到1实现一个Android路由(2)——URL解析器

在从0到1实现一个路由(1)——初探路由中,介绍了一个五脏俱全的路由例子,路由是通过URL到达页面,那么URL解析器是个很重要的步骤,负责解析、跳转、拦截、传参等等。所谓URL解析器,可以看成是URL和Intent的映射,因为Android启动页面只能通过Intent来跳转,不论是显试调用还是隐式调用,归根结底是一个Intent。URL解析器改造在上个例子的基础上,进行改造,将URL解析器作...

2019-04-21 12:27:45 531

原创 从0到1实现一个Android路由(1)——初探路由

Android路由什么是路由?最初接触路由是在大学计算机网络中,网络层IP报文传输会涉及一个路由表的概念,路由表由源IP、目的IP组成,起始就是一个映射表。Android路由也是一个映射表,映射什么呢?这里先类比一下,如果把手机类比于浏览器,那么每个app就可以类比于一个个的网站,比如百度、头条等等,那么每个app的一个页面就可以类比于一个个网站里面的页面,浏览器的每个页面由url定义,给不同...

2019-04-15 13:54:51 1657

原创 让转场更加酷炫——自定义Transition

Android动画和Transition系列文章初识属性动画——使用Animator创建动画 再谈属性动画——介绍以及自定义Interpolator插值器 三谈属性动画——Keyframe以及ViewPropertyAnimator 让View具有减速效果的动画——FlingAnimation 让View具有弹性效果的动画——SpringAnimation 让View跟随状态动起来—...

2019-04-08 19:32:08 1340

原创 仿抖音发布按住拍呼吸效果

抖音——时下最火的app之一,发布过程中有个按住拍的呼吸效果,效果如下所示:上面两个按钮,都是采用属性动画进行控制的,但实现细节稍有不同,左上采用的是StateListAnimator,只需要考虑跟随手指动就可以了;右下是在onTouch里面控制动画开启or关闭。demo采用了自定义View的方式,重点有几点:属性动画,定义View不具备的属性——内部半径参数onTouch(),跟随手...

2019-04-08 12:10:20 602

原创 让View跟随状态动起来——StateListAnimator

StateListAnimator定义了一组动画,可以根据View drawable的状态进行不同的切换。所谓状态指的是state_pressed、state_enabled等这些状态。Android提供的drawable中,其中有一种就是selector,只不过那种是指定的图片,而StateListAnimator指定的动画。不说废话,先看下效果:使用StateListAnimator...

2019-04-01 10:01:14 689

原创 让View具有弹性效果的动画——SpringAnimation

SpringAnimation和FlingAnimation一样,是DynamicAnimation的两种类型。Spring模拟的是物理世界的弹力,弹弹弹,弹走鱼尾纹,,,先看下效果:在某些参数下,可以看到图片有来回震荡的效果。SpringAnimation的基本使用添加支持库 dependencies { implementation 'com.android.sup...

2019-03-25 10:15:00 824 3

原创 使用动画缩放图片

我们的app经常遇到这样一种场景,就是小图到大图的转换,这时候如果有个缩放动画就会很自然。本节将介绍如何使用动画进行缩放图片,在点击头像看大图这种场景可以使用。本文的例子...

2019-03-22 11:27:59 139

原创 让View具有减速效果的动画——FlingAnimation

Google除了提供了属性动画之外,还提供了一种基于物理的动画,叫做DynamicAnimation,与物理世界更贴近,关于这块可以参考https://www.jianshu.com/p/46b1cdc253e9。目前主要有两种DynamicAnimation,分别是:Spring Animation 类比弹力Fling Animation 类比速度、动量本文主要介绍Fling...

2019-03-18 19:16:44 930 5

原创 三谈属性动画——Keyframe以及ViewPropertyAnimator

经过初识属性动画——使用Animator创建动画和再谈属性动画——介绍以及自定义Interpolator插值器,对属性动画已经介绍的差不多了,还剩下最后两个概念,Keyframe和ViewPropertyAnimator。Keyframe动画归根结底是一些帧的组合,一旦设定了一个动画后,中间的每帧,Android系统会帮我们计算好,而Keyframe允许我们定义动画中的一些关键帧,该对象主要有...

2019-03-11 11:48:30 451

原创 再谈属性动画——介绍以及自定义Interpolator插值器

属性动画中有一个重要的概念就是插值器——Interpolator,根据流失的时间因子计算得到属性因子。Android中默认的插值器是AccelerateDecelerateInterpolator,内置了很多插值器,本文将以一个例子介绍各种插值器的效果,以及如何自定义Interpolator。话不多说,先看demo,如下图:官方Interpolator介绍除了最后一个是自定义Interpo...

2019-02-25 09:53:28 406

原创 初识属性动画——使用Animator创建动画

属性动画不仅仅能作用于View,而能作用于任何对象。与ViewAnimation的区别ViewAnimation只支持几种动画:scale、transition、rotate、alpha四种类型。并且缺陷是只是改变了显示位置,实际位置并没有改变。一个demo解释一切,如下图:Hello按钮使用ViewAnimation进行移动,点击事件在移动后,但是响应还在最初的位置;而属性动画移动的W...

2019-02-19 10:05:33 477

原创 在Activity切换之间实现Transition动画

在Android 5.0执行,如果需要在Activity切换之间实现动画,需要实现 overridePendingTransition()方法,并实现入场动画和退场动画。而在5.0之后,出现了一些Material Design的转场动画,先看下demo样子。上面的例子中,Slide效果还是比较明显的,Explode和Fade不是很容易看清,后面两个是Share Element的动...

2019-02-13 10:37:52 1139

原创 在布局切换之间实现Transition动画

由于明后两天周末时间部门团建加年会,所以这篇博客就提前发了。继续Jetpack框架中的动画部分。同一个Activity之间,布局切换是可以有动画效果的,下面是仿照API Demo中的一个例子,如下图:在同一个Activity中,通过选中不同的Scene,切换不同的布局。实现在两个Layout之间进行动画的基本步骤如下:为起始和结束Layout创建Scene对象,一般来说,当前布局...

2019-01-25 15:08:21 1259

原创 ViewGroup内容改变时的动画效果—LayoutTransition

向一个ViewGroup中添加View或移除View时,针对当前所有的View,是可以有一个动画效果的,这个动画效果主要靠LayoutTransition实现。话不多说,先上图看下效果(仿照Android API Demos里面的例子)。可以看到,当添加或删除View时,下面View中的Button都是有动画效果的,这种实现就是通过LayoutTransition实现的。LayoutTra...

2019-01-19 11:06:41 992

原创 Jetpack学习之——使用动画缩放图片

我们的app经常遇到这样一种场景,就是小图到大图的转换,这时候如果有个缩放动画就会很自然。本节将介绍如何使用动画进行缩放图片,在点击头像看大图这种场景可以使用。本文的例子的示意图如下所示:创建View布局主要包含两个View,一个ImageButton用于加载缩略图,一个ImageView用于显示大图。&amp;amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;qu

2019-01-13 16:49:49 568

原创 2018年年终总结

2018年,对于我而言,主要有两件大事。第一件事是国庆期间家庭新加一位成员——我可爱的女儿;第二件事是7月份研究生毕业,结束了来达20多年的校园生活,走向了工作岗位。选择很重要2018年,我的感悟是选择很重要。校招时,拿了还算可以的几个offer,最后因为考虑地方因素,放弃了一些目前行业里最火的两家公司,选择了目前的公司。现有公司有部分业务是做p2p的,结果行业暴雷,8月份吧,迎来了第一波裁...

2019-01-05 17:19:46 732 14

编译原理第二版

编译原理第二版,很好的一本书!值得学习

2014-08-15

Head First Java(中文版)pdf

2016-12-13

清华邓俊辉数据结构

清华邓俊辉教授所编写的数据结构的书,用C++实现的。

2015-01-02

andrid获取缓存目录返回null

发表于 2016-10-18 最后回复 2016-10-18

空空如也

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

TA关注的人 TA的粉丝

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