- 博客(70)
- 收藏
- 关注
原创 自定义控件之柱状图
在某些应用场景中,比如运动类或者金融类App需要绘制图表展示数据,为了理解图表绘制原理,我们自己来实现以下,先看效果: 开始分析:1.准备数据:private static final String[] HORIZONTAL_AXIS = {"...
2019-01-05 12:01:29 651 1
原创 自定义控件之58同城加载
分析:这是一个组合控件加上属性动画来实现,布局是一个线性布局,一个变化的控件ShapeView,圆形,正方形,三角形不断变换,底部还有一个阴影,先下落动画和缩放,接着上抛和缩放动画并旋转,通过动画监听来控制旋转动画。效果如下图所示 <?xml version="1.0" encod...
2018-12-17 15:16:31 298
原创 二叉树的镜像
操作给定的二叉树,将其变换为源二叉树的镜像。分析:其实就是交换左右子节点 public void Mirror(TreeNode root) { if(root==null||(root.left==null&&root.right==null)){ return ; } TreeNode temp=r...
2019-02-17 17:01:11 150
原创 二维数组查找
在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数分析:找出二维数组右上角的数result,把输入的数和他进行比较,如果比他小则往下查找,如果比他小则往前查找,找到就返回true,没有就返回false; public boolean Find(int ...
2019-02-14 21:14:16 184
原创 二叉树第K大节点
给定一棵二叉搜索树,请找出其中的第k小的结点。例如, (5,3,7,2,4,6,8) 中,按结点数值大小顺序第三小结点的值为4。public class Solution { int index=0; TreeNode KthNode(TreeNode pRoot, int k) { if(pRoot==null||k<=0){ ...
2019-02-13 20:54:36 1282
原创 二叉树之字形分层打印
请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。分析:按之字形打印需要两个栈,我们打印某一层的节点时,拔下一层的子节点保存到相应的栈中。如果当前打印的是奇数层,那么则先保存左子节点再右子节点,如果当前打印的是偶数层那么,则先保存右子节点再左子节点。public class Solution {...
2019-02-12 09:38:42 252 1
原创 二叉树中和为某一值得路径
输入一颗二叉树的跟节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。(注意: 在返回值的list中,数组长度大的数组靠前)分析:使用前序遍历访问到某一节点时,我们把该节点添加到路径上,并且累加该节点的值。如果该节点为叶子结点,并且路径中的值正好等于输入的整数,则当前路径满足要求。如果不是叶子结点,则继续访问它的子节...
2019-02-11 14:31:55 205
原创 二叉搜索树的后序遍历
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。分析:后序遍历的序列中,最后一个数字是树的根节点的值,数组中的前面数字可以分为两部分:第一部分是左子树的节点值,他们都比根节点的值要小;第二部分是右子树的节点值,他们都比根节点的值要大,我们可以先找出第一个比根节点大的值,即为右子树的第一个节点,往后遍历如果...
2019-02-11 12:04:32 164
原创 分层打印二叉树
从上往下打印出二叉树的每个节点,同层节点从左至右打印。分析:我们使用一个队列把每个节点放入,用last来记录正在打印的最右节点,nLast表示下一行的最右节点,temp集合表示每行的节点值,result表示最后所有按层遍历的值。nLast一直记录最新加入队列的节点,如果last和出队列的值相等说明需要换行继续,然后nLast赋值last,result添加temp的所有值,temp清空,队列不为...
2019-02-11 10:55:39 412
原创 树的子结构
输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)分析:第一步:在树A中找到和树B的根节点的值一样的节点R第二步:判断树A中以R为根节点的子树是不是包含和树B一样的结构 public boolean HasSubtree(TreeNode root1,TreeNode root2) { boolean result=fals...
2019-02-10 16:44:38 117
原创 二叉树的下一个节点
给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。如下图所示{d,b,h,e,i,a,f,c,g} 分析:如果一个节点有右子树,那么它的下一个节点就是它的右子树中的最左子节点。例如节点b的下一个...
2019-02-10 15:52:41 156
原创 重建二叉树
输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。public TreeNode reConstructBinaryTree(int [] pre,int [] in) { if(pre==nu...
2019-02-10 14:29:55 111
原创 数据结构之合并链表
题目:输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则分析:链表1的头结点小于链表2的头结点,那么链表1的头结点将是合并后链表的头结点,如果链表2的头结点小于链表1的头结点那么链表2的头结点将是合并后剩余节点的头结点,当我们把两个链表中值较小的头结点链接到合并的链表之后,两个链表剩余的节点依然是排序的,合并过程和以前一样这样就是递归。当第一个链表是空链...
2019-02-09 13:41:36 571
原创 数据结构之反转链表
题目:输入一个链表,反转链表后,输出新链表的表头。 public ListNode ReverseList(ListNode head) { if(head==null){ return null; } ListNode preNode=null; ListNode nextNode=null; ...
2019-02-09 11:20:14 148
原创 数据结构之链表中倒数第K个节点
题目:输入一个链表,输出该链表中倒数第k个结点。分析:可以定义两个变量,ahead和behind,先让ahead走k步这时behind在头结点,最后一起往后走直到ahead到达尾部,这时behind的位置就是倒数第k个节点。public class Solution { public ListNode FindKthToTail(ListNode head,int k) { ...
2019-02-09 10:03:35 252
原创 数据结构之从尾到头打印链表
题目:输入一个链表,按链表值从尾到头的顺序返回一个ArrayList。分析:相当于把链表反转过来,栈正好满足先进后出,所以把链表压人栈中,最后弹栈后加入集合。public class Solution { public ArrayList<Integer> printListFromTailToHead(ListNode listNode) { Arra...
2019-02-09 09:15:56 193
原创 AIDL简单实例
Binder是Android中的一个类,它实现了一个IBinder接口,是Android中跨进程的通信方式,是ServiceManager链接各种Manager(ActivityManager,WindowManager),从Android应用层来说,Binder是客户端和服务端进行通信的桥梁。我们从AIDL来分析Binder工作机制。创建步骤如下:一.创建AIDL工程创建IMyAi...
2019-01-24 16:47:14 462
原创 Activity插件化之Hook Instrumentation
Hook Instrumentation实现要比Hook IActivityManager实现要简洁一些,示例代码会和Hook IActivityManager实现有重复,重复的部分这里不再赘述。 Hook Instrumentation实现同样也需要用到占坑Activity,与Hook IActivityManager实现不同的是,用占坑Activity替换插件Activity以及还原插件A...
2019-01-23 17:22:44 514
原创 算法之顺时针打印矩阵
题目: 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵,则依次打印出数字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10. 分析:我们可以把打印圈分为四步:第一步从左往右打印一行,第二步从上到下打印一列,第三步从右到左打印一行,第四部从下到上打印一列。第二步的前提是终止列号大于起始列号,第三步的前提是终止行号大于起始行号且终止列...
2019-01-22 14:04:59 155
原创 两个栈组成队列
题目:编写一个类,用两个栈实现队列,支持队列的基本操作(add,poll,peek).栈的特点是先进后出,而队列的特点是先进先出,我们可以用两个栈正好顺序反过来实现类似队列操作。分析:具体实现上是一个栈作为压入栈,在压入数据时指望这个栈中压入,即为stackPush,另一个只作为弹出栈,在弹出数据时只从这个栈弹出,即为stackPop。虽然简单,但是要注意两点:1.如果stackP...
2019-01-22 09:45:36 278 1
原创 Glide源码流程分析
1.Glide.with() public static RequestManager with(FragmentActivity activity) { RequestManagerRetriever retriever = RequestManagerRetriever.get(); return retriever.get(activity); ...
2019-01-21 15:12:53 149 1
原创 Rxjava之flatMap操作符
flatMap是将Observable发射的数据集合变换为Observables集合,然后将这些发射的数据平坦化地放进一个单独的Observable中。案例一:先定义一个用户对象,包含用户名和地址,由于地址可能会包含生活,工作等地方,所以使用一个List对象来表示用户的地址。 public class User { public String userName; ...
2019-01-18 10:06:17 385
原创 Volley简单分析
我们先来Volley请求网络的代码,StringRequest为例:RequestQueue requestQueue = Volley.newRequestQueue(this);requestQueue.add(getStringRequest());public StringRequest getStringRequest() { return new StringRequ...
2019-01-16 11:45:03 121
原创 AsyncTask8.0源码分析
public abstract class AsyncTask<Params, Progress, Result> { private static final String LOG_TAG = "AsyncTask"; private static final int CPU_COUNT = Runtime.getRuntime().availableProc...
2019-01-15 10:36:06 115
原创 基于Rxjava实现Eventbus功能
我们传统事件消息发布是使用EventBus来实现,它的工作机制类似于观察者模式,通过通知者去注册观察者,最后由通知者向观察者发布消息,在Android开发中,使用EventBus可以解耦AsyncTask,Handler,Thread,Broadcast等各个组件,还可以用于Fragment之间的通信。但是EventBus内部是基于反射来获取订阅方法,订阅事件,订阅者,因此性能上有所影响,我们可以...
2019-01-14 14:56:50 962
原创 自定义控件之曲线图
分析:使用的是三阶贝赛尔曲线, mCurvePath.cubicTo(mControlDots[0][0], mControlDots[0][1], mControlDots[1][0], mControlDots[1][1] , mDots.get(i + 1).x, mDots.get(i + 1).y),这个API来绘制连线,具体贝塞尔曲线可以参考百度:public cl...
2019-01-13 16:03:32 234
原创 RxJava简单分析
我们使用create()创建Observable进行分析:Observable<Object> objectObservable = Observable.create(new ObservableOnSubscribe<Object>() { @Override public void subscribe(ObservableEmitter<Ob...
2019-01-12 20:08:44 82
原创 LeakCanary简单分析
一.基本使用if (LeakCanary.isInAnalyzerProcess(this)) { return; } LeakCanary.install(this);二.源码分析1.public static RefWatcher install(Application application) { r...
2019-01-11 15:59:38 234
原创 Picasso图片加载源码分析
一.我们先来看看哪些重要的实现类:Picasso: 图片加载、转换、缓存的管理类。单列模式 ,通过with方法获取实例,也是加载图片的入口。RequestCreator: Request构建类,Builder 模式,采用链式设置该Request的属性(如占位图、缓存策略、裁剪规则、显示大小、优先级等等)。最后调用build()方法生成一个请求(Request)。DeferredReques...
2019-01-11 09:55:20 220
原创 Fragment的懒加载
public abstract class LazyFragment extends BaseFragment { private static final String TAG = "LazyFragment"; /** Fragment当前状态是否可见 */ protected boolean isVisible; @Override public...
2019-01-09 17:36:26 73
原创 EventBus源码分析
1.定义注解@Documented@Retention(RetentionPolicy.RUNTIME)@Target({ElementType.METHOD})public @interface Subscribe { ThreadMode threadMode() default ThreadMode.POSTING; /** * If true, del...
2019-01-08 16:53:55 79
原创 Retrofit源码分析
1.创建Retrofit实例Retrofit retrofit = new Retrofit.Builder() .baseUrl("http://www.baidu.com/") .addConverterFactory(GsonConverterFactory...
2019-01-08 10:43:29 187 1
原创 ButterKnife源码分析
正文开始之前先说说Element,在注解处理器中,我们扫描 java 源文件,源代码中的每一部分都是Element的一个特定类型。换句话说:Element代表程序中的元素,比如说 包,类,方法。每一个元素代表一个静态的,语言级别的结构. 比如: public class ClassA { // TypeElement private int var_0; // Variable...
2019-01-07 14:08:01 126
原创 Java基础之注解简单使用
1.首先定义一个注解类,@Retention和@Target修饰注解类,@Retention注解表示注解保留时长,@Target指定修饰类型public enum RetentionPolicy { /** * Annotations are to be discarded by the compiler. */ SOURCE, /** //编译...
2019-01-05 16:57:22 99
原创 自定义控件之折线图
分析:折线的实现可以用canvas对象调用drawLine方法绘制点与点之间的直线,或使用Path对象,调用canvas的drawPath方法来一次绘制所有的直线。在折线下面实现了颜色渐变,我们可以使用线性LinearGradient类来实现,最后处理触摸事件,重新绘绘制界面,效果如下图所示: ...
2019-01-05 15:45:14 236
原创 属性动画简单理解
逐帧动画 & 补间动画存在一定的缺点:1.即补间动画 只能够作用在视图View上,即只可以对一个Button、TextView、甚至是LinearLayout、或者其它继承自View的组件进行动画操作,但无法对非View的对象进行动画操作2.补间动画只是改变了View的视觉效果,而不会真正去改变View的属性。如,将屏幕左上角的按钮 通过补间动画 移动到屏幕的右下角点击当前按钮位置...
2019-01-04 14:12:11 225
原创 设计模式之装饰设计-RecyclyerView添加头布局和脚步局
装饰模式是一种用来替代继承的思想,它使用对象之间的关联关系来取代类之间的继承关系。继承是一种常用的一种拓展原有类的功能的方法,通过创建一个继承父类的子类来拓展原有的功能,在“合成复用原则”中曾提到,在处理类的功能拓展这个问题上应尽量使用类之间的关联关系而少使用继承关系。RecyclerView 本身是不支持添加底部和头部的,那么采用装饰设计模式可以对其进行功能扩展,使其能够支持底部和头部的添...
2019-01-03 11:27:16 174
原创 Handler源码分析
1.ThreadLocal工作原理ThreadLocal是一个线程内部的数据存储类,通过他可以在指定的的线程中存储数据,数据存储以后,只有在指定的线程中可以获取到存储的数据,对于其他线程来说则无法获取到。对于Handler来说,他需要获取当前线程的Looper,很显然Looper的作用域是线程且不同的线程就有不同的Looper,如果不用ThreadLocal,那么系统就必须提供一个全局的哈...
2019-01-02 13:30:34 141
原创 面向对象的六大原则
1优化代码的第一步-单一职责单一职责英文名称是Single Responsibility Principle,简称SRP,就是一个类应该是一组相关性很高的函数,数据的封装,也就是说一个类不要去实现过多的功能,这样会造成耦合性太高。2.让程序更稳定,更灵活-开闭原则开闭原则的英文全称是Open Close Principle,简称OCP,它是Java世界里最基础的设计原则,它指导我们如何...
2019-01-01 17:14:24 87
原创 自定义控件之字体变色
@SuppressLint("AppCompatCustomView")public class ColorTrackTextView extends TextView { //绘制不变字体的颜色 private Paint originPaint; //改变后字体颜色 private Paint changePaint; //当前进度 pri...
2018-12-31 13:00:40 329
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人