自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 仿头条实现EditText的hint上下滚动轮播效果

简介最近看到头条的首页顶部搜索框有一个切换hint文字的动画效果,比较好奇它是怎么实现的,经过一番探索发现这个顶部的搜索框并不是真正的搜索框,点击之后是直接跳转到搜索界面,本身并不是一个EditText。这样的实现方式让我顿时感觉索然无味,同时不禁思考,难道不能在一个EditText控件上实现这样的效果吗?百度、google了一番发现并没有找到相关的效果实现,于是决定自己撸一个。起初并没有头绪...

2018-10-21 22:30:53 2004 1

原创 为RecyclerView添加load more功能

思路实现LoadMore功能主要是从Adapter入手,通过在onAttachedToRecyclerView方法里给RecyclerView添加滑动监听来实现。一种思路是实现一个LoadMoreAdapter基类让其他的Adapter继承来获得load more的能力,但是这样的实现方式感觉有点侵入原有的Adapter代码,而且不够灵活,所以本文采用代理原有Adapter的方式来实现。实现F...

2018-09-23 20:41:23 4156

原创 自己动手写一个简单的Android下拉刷新

概述一开始的时候尝试通过Android的事件分发机制来实现,但是child一旦消耗事件,那么后续事件是不会传给Parent的,只能重写dispatchTouchEvent来拦截,这样做相当于重写了Android的事件分发机制,我自认水平是不够的。随后阅读了Android官方刷新空间SwipeRefreshLayout,发现是使用的NestedScrolling机制,具体使用可以看鸿洋大神的这篇...

2018-04-12 17:36:04 717

原创 Button点击时滑动的事件传递

背景之前面试的时候遇到一个有关滑动事件的问题,让我十分费解,后来查阅相关资料和源码才得以解决,问的是在一个RecyclerView中,有一个item为Button,如果在按下这个Button的同时进行滑动,Button是否能够保持焦点?相关事件是如何传递的?思考按照以往我对事件传递机制的理解,在按下的时候是一个Down事件ViewGroup->Button,然后滑动的时候就是一系列Move事件,但是

2017-11-02 23:56:07 855

原创 求二叉树满足条件路径

问题给定二叉树,求的某一路径满足所有节点和为某一个值分析采用递归,定义一个方法List getPath(Node root, int target),从root开始,首先判断root.val是否大于target,如果大于说明这个路径不可能成功,返回一个空的List就可以,如果小,那么target -= val,然后递归左右节点,如果返回的List不空,那么说明满足,就可以add自己进path了。其实

2017-08-25 22:26:08 457

原创 NestedScrolling详解

简介假设我们需要一个这样的效果,拖动子View的时候需要parent先滑动,等parent滑倒顶端的时候再让子View滑动。Android事件分发机制在parent处理事件的时候,没法再次把事件传递给子View(除非再来一个Down,开启一个新的事件序列),所以就需要用到NestedScrolling,也就是嵌套滑动机制。今天我们来实现如下效果 蓝色部分是子View,粉色是Parent,在向上

2017-06-18 00:45:45 1471

原创 Toast源码解析

子线程中的Toast在写代码的时候发现一个现象,在子线程中使用Toast会crash,错误如下java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()可以很明显的看出问题出在当前线程企图创建Handler,但是由于本线程没有Looper所以crash了,这时候

2017-05-27 23:37:40 386

原创 消失的数字

题目描述给定一个数组a[],长度为n,保证1<=a[i]<=n,找出1-n中所有未出现的数字,不使用额外空间且时间复杂度为O(n).思路分析如果可以使用额外空间,我们会使用一块额外空间来记录某一个数字是否出现过,遍历一遍a来更新额外空间状态,然后遍历额外空间来获得未出现的数字。现在不允许使用额外空间,我们可以不可以直接在数组上来保存状态?可以这样做,假设数组长度为n,我们发现a[0]=3,那么说明3

2017-04-04 23:16:56 1579

原创 使用位运算实现加法

分析求两个整数之和,要求不使用+、-、*、/四则运算符号,那么只能想到用位运算了,其实二进制和十进制的运算是很相似的,都是每一位相加,多出来的进位。以7和3为例,二进制分别是111和101,假设不考虑进位,那么结果就是010,也就是111^101,同时也可以算得进位就是(111&101)<<1,最后就变成了这两个数相加,重复之前的步骤,直到进位是0,就完成了加法。实现 public stati

2017-03-31 00:06:38 2373

原创 Java匿名内部类使用局部变量

在Java8之前,我们在匿名内部类或者局部内部类中使用局部变量都需要将局部变量声明为final,这是因为java底层给我们做了一些小动作,匿名内部类表面上没有构造函数,其实是有的,底层直接将局部变量通过构造函数传给内部类,局部变量在生命周期结束后就会被销毁,而匿名内部类的生命周期一般来说都比局部变量长,那么假如我们可以修改这个变量,就会出现内外不一致的现象(这里的修改指的是改变引用,而不是改变变量的

2017-03-04 17:29:01 3580

原创 二叉树的创建与遍历

二叉树创建创建根据数组,值为0代表空节点 private static Node createTree(int[] data, int index) { if (index >= data.length || data[index] == 0) { return null; } Node node = new Node()

2017-02-26 00:25:41 391

原创 android自定义SearchView

编写布局文件本质就是LinearLayout包含着一个EditTextView和ImageView,ImageView显示的是一个清楚按钮,用来清除文本,然后把EditTextView的背景设置为null,再设置左边的搜索图片,给LinearLayout设置圆角背景,看起来就像EditTextView和ImageView是一个整体search_layout.xml<?xml version="1.0

2017-02-19 22:38:45 888

原创 使用ItemDecoration打造列表顶部悬浮效果

ItemDecoration基本用法ItemDecoration是用来给RecyclerView添加分隔线的,我们可以通过自定义ItemDecoration来实现各种效果,我们先来看一下基本用法。 首先我们继承ItemDecoration,要实现三个方法 @Override public void onDraw(Canvas c, RecyclerView paren

2017-01-13 19:55:33 3428 2

原创 Android Handler详解--实战篇

概述之前写了一篇文章讲解Handler机制,但是我觉得理论总是不比实践来的深刻,所以今天我们来自己实现一个Handler。如果没看过之前的文章,建议先看一下Android Handler详解–理论篇。MyMessageQueue首先实现MyMessageQueue,当然在这之前我们要实现MyMeessage类public class MyMessage { public MyHandler t

2016-11-15 21:28:02 420

原创 Android Handler详解--理论篇

概述在平时的开发中,我们一般会在子线程请求数据,因为Android的UI操作不是线程安全的,所以我们会有切换到UI线程(主线程)更新UI的需求。有以下两种方法:使用Activity的runOnUiThread方法。使用Handler。其实查看源码就能发现runOnUIThread方法还是基于Handler的,接下来就详细解析Handler机制。相关类Handler机制其实是Handler、Me

2016-11-15 17:18:09 415

原创 回文字符串问题

问题描述给定一个字符串,问是否能通过添加一个字母将其变为回文串。思路有两个思路。如果加一个可以形成回文,那么减去一个也必定可以。可以通过遍历字符串减去一个字符判断是否回文,如果有存在那就输出YES,反之输出NO。如果字符串首位不一样,那么加上的字符要么是在末尾加上第一个字符,要么是在头部加上末位的字符,判断两种情况是否存在回文串就可以;如果首尾一样,那么就可以略去首尾,继续用这种方法判断。

2016-11-09 00:03:23 470

原创 设计模式--单例

简介当希望一个类在程序中只会有一个实例存在的时候,单例模式便会派上用场。为了限制该类对象被随意的创建,我们将构造方法声明为private,但是这样就无法创建对象了,我们该怎么办呢?接下来就从最简单的单例模式讲起。最简单的单例public class Singleton { private static Singleton instance = new Singleton(); priv

2016-11-08 22:46:49 313

原创 使用Loader加载本地图片

概述如果我们需要得到本机的所有图片,该怎么做?第一反应就是ContentProvider,android提供了本地资源的URI,其中图片的URI是 MediaStore.Images.Media.EXTERNAL_CONTENT_URI。 但是直接使用ContentProvider有两点不方便,第一是我们需要开一个线程执行,因为如果本地图片很多就会很耗时,容易发生ANR,第二就是每次需要图片都要

2016-10-23 20:37:50 929

原创 Android保存图片到本地

保存图片到本地分三步:保存图片到本地指定文件夹将图片加入图库通知图库扫描更新保存图片到本地指定文件夹 File bitmapCacheDir = new File(SDCardUtil.getSDCardPath() + "bitmapCache"); if (!bitmapCacheDir.exists()) { bitmapCache

2016-10-20 14:26:20 888

原创 使用SpannableString实现微博内容

概述一条微博中有五种类型的数据,分别是普通文本@用户#话题#链接[表情]我们首先需要使用正则表达式找出这些元素,然后使用SpannableString设置不同的样式(Span)。SpannableString的基本使用首先创建一个SpannableString,将文本内容传进去SpannableString spannableString = new SpannableString(co

2016-10-15 17:52:49 484

原创 为RecyclerView添加header和footer

目标RecyclerView渐渐的取代了ListView,但是有一点它没有ListView方便,那就是不能添加header,所以我们只能自己实现,功能如下:手动添加删除Header和Footer提供加载更多接口思路实现该功能的核心在Adapter类,我们声明三种类型来区分header、footer、normal。 private static final int TYPE_NORMAL

2016-10-08 18:53:43 277

原创 变态跳台阶

题目描述一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。分析令dp[i]表示跳i级台阶不同跳法的数量,假设最后一跳是k阶,那么就有dp[i -k]种跳法,和跳i-k是一样的跳法,k可以取1-i,所以所有方法就是 dp[i] = dp[1] + dp[2]+…+dp[i-1] + 1 最后的1就是直接跳到i的情况代码 public

2016-09-21 00:27:37 238

原创 年终奖问题

题目描述小东所在公司要发年终奖,而小东恰好获得了最高福利,他要在公司年会上参与一个抽奖游戏,游戏在一个6*6的棋盘上进行,上面放着36个价值不等的礼物,每个小的棋盘上面放置着一个礼物,他需要从左上角开始游戏,每次只能向下或者向右移动一步,到达右下角停止,一路上的格子里的礼物小东都能拿到,请设计一个算法使小东拿到价值最高的礼物。 给定一个6*6的矩阵board,其中每个元素为对应格子的礼物价值,左上

2016-09-20 22:53:04 746

原创 左右最值最大差

题目描述给定一个长度为N(N>1)的整型数组A,可以将A划分成左右两个部分,左部分A[0..K],右部分A[K+1..N-1],K可以取值的范围是[0,N-2]。求这么多划分方案中,左部分中的最大值减去右部分最大值的绝对值,最大是多少? 给定整数数组A和数组的大小n,请返回题目所求的答案。分析首先可以确定的就是两个数中肯定有一个是A中的最大值。 假设是A[i],这时候我们有两种选择:左边和右边。

2016-09-19 22:47:58 360

原创 快速求二进制中1个数

先放代码 public static int countNum(int n) { int count = 0; while (n != 0) { n &= (n - 1); count++; } return count; }n & (n - 1)能够置位最右边的1为0,这样

2016-09-19 22:23:47 1437

原创 最大差值问题

题目描述有一个长度为n的数组A,求满足0<=a<=b

2016-09-19 21:53:25 515

原创 打开EventBus3.0的正确姿势

什么是EventBus先来一段官方介绍和配图 EventBus is a publish/subscribe event bus optimized for Android.就是说EventBus是一个针对Android优化的发布/订阅事件总线。它可以做到:简化组件之间的通信简化代码结构……试想这样一个场景,一个Activity有两个fragment分别是f1, f2。有一个需求就是f

2016-09-16 15:12:24 411

原创 Java线程池简析

线程池简介我们在实现并发功能时会频繁的创建和销毁线程,这样会加大系统的开销,而线程池会缓存一定数量的线程,可以避免这样的情况,并且线程池可以对现场进行简单的管理,简化了并发编程。ThreadPoolExecutorJava中的线程池定义为Executor接口,实现这个接口的类为ThreadPoolExecutor,是线程池的真正实现。常用的构造方法为 public ThreadPoolExec

2016-08-30 21:16:03 317

原创 Android事件分发机制详解

概述之前在学习android事件方法机制的时候,看过不少文章,但是大部分都讲的不是很清楚,我自己理解的也是云里雾里,也尝试过阅读源码,看得我更是不知所措。最近阅读了《Android开发艺术探索》一书中相关的章节,茅塞顿开,写下本文作为阅读笔记,以便以后查阅。三个重要的方法 public boolean dispatchTouchEvent(MotionEvent ev)事件传递过来的时候这个方

2016-07-21 20:42:24 2389 16

原创 自定义动画实现splash页面3d旋转切换主页面

自定义动画在Animation类中重写方法applyTransformation方法,该方法有两个参数float interpolatedTime:取值范围为0-1,具体我也不清楚,和时间有关的参数,应该是表示时间过去了多久。Transformation t:从该参数中可以的到Matrix,通过修改这个Matrix配合interpolatedTime实现动画接下来实现一个以自身中心缩小到0的d

2016-07-11 22:55:48 873

原创 Service简析

简介Service作为Android的四大组件之一,它的重要性不言而喻,之前虽说看过一些介绍但是一直没有用过,最近需要用到的时候发现无从下手,便阅读了官方的有关Service的Guide,这里总结一下。Service作用官方介绍如下 A Service is an application component representing either an application’s desire

2016-07-11 19:47:06 552

原创 使用DrawerLayout实现简单的侧滑效果

简介DrawerLayout是官方的一个实现侧滑菜单的控件,可以使用它实现大部分的侧滑效果。基本步骤首先在布局中使用DrawerLayout,它继承自VIewGroup,第一个childView就是我们的内容布局,第二个就是我们的菜单,当然也可以有第三个作为第二个菜单 <android.support.v4.widget.DrawerLayout android:id="@+i

2016-07-06 19:02:30 6034

原创 PagerSlidingTabStrip源码解析

项目简介项目地址https://github.com/astuetz/PagerSlidingTabStrip 该项目是一个配合ViewPager使用的指示器控件,这里的ViewPager的adapter必须是继承FragmentPagerAdapter,且需要重写getPageIconResId(int position)或者getPageTitle(int position)以便指示器显示内容

2016-07-05 16:38:09 727

原创 使用layer-list实现阴影效果

在drawable下新建background.xml,内容如下<?xml version="1.0" encoding="utf-8"?><layer-list xmlns:android="http://schemas.android.com/apk/res/android"> <item> <shape android:shape="rectan

2016-05-27 22:31:30 4394

原创 Android Matrix的使用与自定义动画

变形矩阵的原理Android对图形的处理通过矩阵,每个像素点都有其X,Y坐标信息,图形变换矩阵是一个3X3的矩阵,通过变换矩阵与位置矩阵相乘得到新的位置矩阵,从而可以通过不同的变换矩阵实现不同的变换效果。 图形变换主要有以下四个基本的变换:Translate,平移Rotate,旋转Scale,缩放Skew,错切可以知道基本的变换矩阵是对角a e i为1,其余为0,这样变换后不会改变坐

2016-04-28 23:17:58 3951

原创 0-1背包问题

1.问题描述有n个物品,第i个物品的体积和价值分别为w[i]、v[i](12.问题分析定义函数f[i][w]表示从前i件物品中选择放入容量为w的背包能装下的物品最大价值,我们所要求的就是f[n][c]。以n为例,有两种情况:a. 如果w[n]>c,那么n就不能选中,即f[n][c] = f[n-1][c]b. 如果w[n] 3.编码在解决该问题时因为每一个f都依赖上一个

2016-04-17 15:49:03 525

原创 使用HorizontalScrollView实现侧滑效果(3)

本文介绍在前面的基础上增加更多的效果,主要是通过onScrollChanged()方法进行的。1.滑出菜单时content缩小首先定义一个scale,其含义为菜单隐藏的部分占菜单的比例float scale = l * 1.0f / (mMenuWidth;然后定义一个content的缩放比例float rightScale = 0.7f + 0.3f * scale;因为在没滑动

2016-03-23 19:10:05 397

原创 使用HorizontalScrollView实现侧滑效果(2)

之前实现的侧滑效果是menu一点一点的出来,先出来的是右侧,今天实现一个类似抽屉的侧滑效果,就是在划出菜单时首先出现的是menu的左侧,好像menu是被content遮住了一样。其实代码很简单,就是在上一篇的基础上在SlidingMenu中复写onScrollChanged()方法。@Override protected void onScrollChanged(int l, in

2016-03-23 17:26:48 617

原创 使用HorizontalScrollView实现侧滑效果(1)

本文通过自定义HorizontalScrollView实现侧滑效果1.实现布局在layout下新建left_menu.xml<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout

2016-03-23 16:30:37 473

原创 交换排序之快速排序

快速排序的基本思路是选取一个基准数,然后将小于基准数的移到基准数左边,反之在右边,称为一趟快速排序。然后以基准数分为左右两组,分别快速排序,如此递归,完成最终排序。一般基准数选取第一个数据,接下来重点在于一趟排序中如何移动数据。如数据data[] = {4 3 6 2 1},data[0] = 4为基准,将4搬出,则data[0]一个空位,设置标志位i = 0, j = 4。先递减j,因为右边

2016-03-17 11:46:21 312

空空如也

空空如也

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

TA关注的人

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