自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

海象先生

更深的思考,多问为什么。 GitHub:http://github.com/maokai1229

原创 Java 编程思想笔记(二)

前言 阅读《Java 编程思想》,《Android 源码设计模式》这两本书后,发现了以往编码过程中有很多代码可以优化的点,以及当时的优化方案,所以记录下来。 从事 Android 开发快一年时间了,对编码的开始有了感悟,项目需求变更时,我们最好不要直接修改原有代码,最好使用添加的方式来实现,避免破...

2019-03-09 15:56:57

阅读数 25

评论数 0

原创 自定义控件-58同城加载动画

前言 加载动画主要用于网络请求时提示用户等待,用来提升体验,各家 App 的效果千差万别,大多数应用使用 Progressbar ,也有蛮多设计感十足的加载动画,其中 58同城 的自由落体动画就算一个,先来展示最终效果 文末附上<深入理解Java虚拟机>电子书,包括 E...

2018-12-27 10:02:00

阅读数 40

评论数 0

原创 自定义控件-5分钟手写计步器

前言 自定义控件是每个 Android 应用开发者的必备技能,所以一起来试着手写自定义控件,挑战自定义 View 中最好玩的 onDraw. 我们仿照 QQ 计步器的样式来做,主要熟悉画笔(Paint)的使用技巧 在这里感谢红橙Darren老师的指导 绘制步骤 自定义属性 继承 View 绘制...

2018-12-06 18:11:31

阅读数 67

评论数 0

原创 手写 BufferKnife -- Android Ioc 框架(ViewJet)

前言 黄油刀(BufferKnife)使用注解声明控件,不再反复 findViewById,使得代码简洁高效。 下面我们手撸一套ioc框架实现黄油刀的效果。 Github 地址 ViewJet 2.0 (View飞行器)特性 BindView 注解声明控件对象 自动绑定监听器 Gradle 集...

2018-11-06 23:28:35

阅读数 79

评论数 0

原创 游戏 sdk 开发总结

前言 历时 2 个月的时间,终于完成了第一个作品,开发过程中产品的逻辑界面经历了多次改动,而代码保持了简洁清晰,真的学到蛮多东西. 目录 sdk 开发的不同点 屏幕适配 混淆 自定义控件 Gradle 设置 sdk 开发的不同点 sdk 和普通 app 有什么区别呢? sdk 是作为一个 ...

2018-09-20 09:36:52

阅读数 1177

评论数 0

原创 5分钟搞定PopUpWindow

前言 最近在项目中用到了 PopUpWindow,并且在机型适配时发现华为等具有虚拟按键的手机在横屏状态时会造成 PopUpWindow 显示位置偏移的情况存在,最后完美解决了这个问题,所以把经验分享出来,看能否对你有用。 弹窗有很多种实现方式,例如: 1. Dialog 2. D...

2018-09-01 13:47:47

阅读数 115

评论数 0

原创 Andorid 开发中一定会遇到的小问题

前言 在开发Android时,经常会遇到千奇百怪的小问题,所以一个个记录下来,方便日后翻看,也希望能够帮到其他开发者。 目录 国际化时 Button 字符自动大写 View 在横屏模式下(虚拟按键)位置偏移 国际化时 Button 字符自动大写 复现 在英语环境...

2018-09-01 13:45:23

阅读数 36

评论数 0

原创 自定义 View 不难:带刻度线的 SeekBar(垂直方向)

需求 实现垂直摆放 根据容器大小均匀等分刻度 实现长按监听 思路 将原本水平的 SeekBar 垂直摆放 添加长按接口 根据等分的份数计算每份的长度 使用 Paint 逐个画线 实现 因为有份数是变动的,我们需要自定义属性 自定义 View 1. 自定义属...

2018-06-04 16:52:20

阅读数 587

评论数 0

原创 垂直摆放的进度条 VerticalSeekBar

前言 近期在项目开发中,需要对原生的 SeekBar 进行自定义,因为原生 SeekBar 只能水平放置并且样子太丑了,哈哈哈。需求是构建一个垂直摆放的 SeekBar,所以借鉴了 CSDN 中某位大牛的代码,但当时忙于完成工作,忘记是哪位前辈写的了。 话不多说,直接放图 对,没错;...

2018-05-30 10:03:27

阅读数 607

评论数 1

原创 View.onScreenStateChanged 解决广播延时的问题

前言 在解决公司项目 Bug 时,由于功能上依赖系统的屏幕监听广播(ACTION_SCREEN_ON 和 ACTION_SCREEN_OFF)。但是这里有个坑,广播发送有延时,当我们短时间内迅速地开启关闭屏幕,功能就异常了。 刚开始想通过前台广播解决,但只有自定义广播可以设置前台,系统广播...

2018-05-04 14:11:12

阅读数 262

评论数 0

原创 HyBird初探:Java 和 JavaScript交互

前言 这是 HyBird 开发学习笔记的第一篇,在这一篇中介绍怎样通过 WebView 实现两种语言间的互相调用。 参考博客:https://blog.csdn.net/sy18298711239/article/details/51945478 调用 JavaScript 1. 调用...

2018-04-27 16:41:37

阅读数 90

评论数 0

原创 View.getHitRect

是什么 所有的 View 在屏幕上都占据着一块矩形区域,Rect 在 Android 中表示矩形类,getHitRect()作为获取控件所在的矩阵范围函数,简直就像个神器。当然他也有不给力的情况,我们平常调用时候如果是在控件的监听器里调用就没事,但是如果主动的在onCreate 或者 onRes...

2018-04-27 13:59:17

阅读数 423

评论数 0

原创 Android 属性动画看这篇就够了

前言 动画绘制与 View 绘制有哪些区别? Android 动画框架是什么?适应场景有哪些? 动画机制 Android 内部有一套动画框架,开发者通过调用 Api 能够快速实现华丽丽的动画效果。 动画和 View 有着密切联系,其中动画的重绘在 ViewGroup.drawCh...

2018-04-08 17:35:15

阅读数 188

评论数 0

原创 Launcher 拖拽分析

前言 在手机屏幕上通过长按动作可以对图标拖拽删除,我们有了多个问题: Android 是怎样找到我们所长按的那个图标的? 进行拖拽伴随着图标的震动和动画是怎样实现的? 分析代码 我们知道长按屏幕是在 WorkSpace 进行操作的,所以我们直接在这个类中处理长按的方法。 @O...

2018-03-27 16:50:53

阅读数 196

评论数 0

原创 LauncherActivity 项目分析

前言 Launcher 是系统启动后第一个启动的程序,是其他应用程序的入口,也是我们的手机程序的桌面程序。 设计模式:MVC 目录 Launcher LauncherActivity.onCreate LauncherActivity.onResume LauncherActiv...

2018-03-21 16:36:47

阅读数 1164

评论数 0

原创 TabLayout + ViewPager 实现底部导航栏

效果 前言 底部导航栏有多种实现方式,最近学习了ViewPager+TabLayout 的实现。 发现 design 版本的tablayout提供了神奇的封装,只需要调用 setupWithViewPager(viewPager) 就会根据 ViewPager中view数量配置与...

2018-03-06 23:45:13

阅读数 544

评论数 0

原创 插入排序

前言 插入排序分为直接插入排序和希尔排序。 直接插入排序 将新的数插入到已经排序好的一个队列中,直接插入排序时间复杂度: O(n^2) public void insertSort(int k[]) { int temp; int j; ...

2018-02-15 13:41:06

阅读数 50

评论数 0

原创 单例模式的三种实现 (Java)

前言 为了避免重复创建对象,我们需要学习使用单例模式。推荐使用饿汉模式。 实现 懒汉模式 饿汉模式 双检锁/双重校验锁 * 懒汉模式 最简单的一种实现,实现懒加载,但是不适用于多线程。 懒加载:需要时才加载,不加载不占用空间。 实现代码 public clas...

2018-02-11 21:54:13

阅读数 168

评论数 0

原创 不看你会后悔的 View 绘制基础

前言 自定义 View 时Android 开发中的一个热点知识,我们结合源码了解绘制 View 的必备知识。 流程 measure 测量 layout 位置 draw 绘制 measure 测量 view 大小的测量是在 onMeasure 中实现的,测量过程用到了Mea...

2018-02-10 11:14:23

阅读数 97

评论数 0

原创 设计模式:观察者模式

前言 在使用 Java 写代码的过程中,我们经常遇到需要拓展功能的情况,为了代码更加灵活,我们必须学习设计模式。 实现截图 观察者模式 观察者模式=主题+观察者 类似报社订阅者发放报纸: 1. 订阅者订阅报纸,以后每当新闻出现,订阅者都会收到报社的新报纸。 2. 订阅...

2018-02-02 14:10:50

阅读数 58

评论数 0

原创 两个栈来实现一个队列 《剑指Offer》

题目 思路 栈:先进后出 队列:先进先出 使用两个栈,栈1用于push,栈2用于pop,两个栈底相当于是连接的。 代码 import java.util.Stack; public class Stack2Queue { Stack stack1 = new...

2018-01-27 20:37:50

阅读数 47

评论数 0

原创 从尾到头打印链表 《剑指Offer》

题目 思路 刚拿到题目,错误的认为是单链表的反转。这个题目用递归的方式会好做很多。 因为递归的底层使用堆栈实现的,它会一层层递归,到达底层时回朔。 解法 /** * public class ListNode { * int val; * ...

2018-01-26 11:30:57

阅读数 45

评论数 0

原创 替换空格 剑指Offer

题目 思路 首先从左往右计算空格的数量 反向替换空格,因为正向替换,需要大量的移动 代码 public String replaceSpace(StringBuffer str) { int spaceNum=0; int ne...

2018-01-24 21:42:46

阅读数 71

评论数 0

原创 冒泡排序的多种实现

冒泡是我最早接触的排序算法,两个 for 循环就搞定。 前言 国际惯例,先上效果图 目录 基本思想 算法实现 基本原理 通过比较相邻两个元素,如果符合条件就进行替换。 算法实现 写法有很多种,具有代表性的是《Java数据结构普与算法》书中给出的案例。 ...

2018-01-24 21:28:54

阅读数 123

评论数 0

原创 二维数组查找 《 剑指Offer》

题目 时间限制:1秒 空间限制:32768K 热度指数:517541 本题知识点: 查找 题目描述: 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。 思路 ...

2018-01-14 17:13:43

阅读数 73

评论数 0

原创 二叉树的递归遍历

前言 二叉树和链表在历年春招笔试中,都是重点考核对象。链表由于算法简单,一般考代码实现能力。二叉树考核遍历。 二叉树 二叉树是树形结构中比较简单的,它又可细分成完美二叉树,斜二叉树(相当于链表),完全二叉树。 二叉树的几个性质 第 i 层最大结点数为 2^(i-1) 深度为 k...

2018-01-10 21:08:10

阅读数 58

评论数 0

原创 链表的反转(使用循环遍历实现)

前言 链表的反转问题在校招中算是一个高频题目,同时考的比较勤的还有:Top K ,快排,堆排,这些在以后的帖子中我们再细说,今天我们先用 Java 实现单链表的反转。 推荐看看这个 看图理解单链表的反转,写得简单清晰。 单链表的反转 链表的反转有两种实现:遍历,递归; 遍历易于理解,...

2018-01-08 21:43:06

阅读数 481

评论数 0

原创 单链表的Java实现 (二)

前言前面我们对单链表的表头进行数据的插入和删除,其实也就是实现栈的链式存储。然而仅仅对首个结点进行操作太 easy,我们需要的是对任意位置的查询和删除。目录 查询结点 删除任意结点 查询结点以结点中存储的值为查询的索引 //根据值查询链表 private List queryByKey(i...

2018-01-02 20:32:21

阅读数 1623

评论数 0

原创 单链表的Java实现 (一)

前言最近准备春招,数据结构和算法是短板,决定下功夫恶补。链表能够实现数据的链式存储,可以做大量的数据插入删除,不用指定内存的大小。目录 结构 头结点 头部插入数据 头部删除数据 遍历数据 结构 class List { //数据 private int data...

2018-01-02 16:50:56

阅读数 855

评论数 0

原创 两分钟实现 NavigationView 侧滑菜单

前言Google 在 Android 5.0 后推出了官方的实习,在谷歌爸爸自家 App 中被大量运用,以前需要自己写,现在好了官方版本直接用轮子,接下来我们来看看怎样实现。实现效果目录 布局文件 Java 代码 布局文件 在 DrawerLayout 中添加 NavigationView <...

2017-12-16 21:07:22

阅读数 87

评论数 0

原创 Glide 给你点颜色看看

前言任何一款能抓住用户的App都离不开图片加载这个老生常谈的话题,所以我们先了解一个利器:Glide 框架。Glide 的优点:能加载 gif 动图,这是 Picasso 做不到的。从Github的官方介绍中,我们了解到 Glide 是一个很好用的框架,它加载图片既快速又能平滑,而且又配适主流网络...

2017-12-08 10:49:50

阅读数 167

评论数 0

原创 最简单靠谱的底部导航栏实现!!!

前言Android实现底部导航栏的方式很多,有5种实现方式。 作者使用过两种:RadioGroup+Fragment;FragmentTabHost;其中第一种更容易上手。实现效果目录 创建RadioGroup 监听,切换 Fragment 创建RadioGroup <RadioGroup...

2017-11-12 20:17:42

阅读数 1303

评论数 0

原创 可能是Android最简单的欢迎页面实现

例如QQ的经典欢迎页面 前言目前市面上的大多数 App 都有一个欢迎页面,有如下优点: 1. 利用展示欢迎页面的时间来加载数据 2. 展示品牌设计风格步骤 创建布局文件 设置欢迎页面 延时 2S 跳转 创建布局文件<?xml version="1.0" encodin...

2017-10-27 09:44:34

阅读数 169

评论数 0

原创 Git 不可不知的常识 (1)

目录 diff 两个相同的 Commit 分支 合并分支 diff diff 只需输入 ID 的前6位(最短)。 git diff ID :比较工作区的文件与该 ID 指向的文件的区别 git diff ID ID :比较两个 ID 对应的版本的区别 git diff oldID newID :...

2017-08-15 09:44:51

阅读数 6673

评论数 0

原创 Material Design 原来这么有趣

前言在材料设计中,有许多设计理念。运用现实生活中的材料,随时进行设计,这是它的核心。目录 平面 高度 FAB 悬浮按钮 CoordinatorLayout 颜色 字体 平面 平面就是 View 的抽象描述,toolBar 是一个平面,一个 Crad 也是一个平面,总之,用来包裹内容的,并且投射阴影...

2017-08-10 09:54:44

阅读数 7212

评论数 1

转载 认识 android-job

https://zhuanlan.zhihu.com/p/26093468“>原文链接 对于现在的应用来说,在应用生命周期之外运行一些后台任务可以说已经是一项必不可少的需求了。这些任务可能是在某个时间点提醒用户什么事情或同步本地数据到服务器等等。 对此 Android 有一系列方式来实现...

2017-08-01 14:52:27

阅读数 4732

评论数 0

原创 Notification 都不知道,还学什么 Android 应用开发

目录 Notification 的概念 在 Notification 中启动 Activity 在 Notification 中启动 Service 实现 Action Notification 的概念 是 Android 系统提供的一个功能,所以它独立于 Activity 存在 。 使用 Not...

2017-07-28 21:10:54

阅读数 4605

评论数 0

原创 IntentService的最简单实现

如果直接继承 Service ,那就需要程序猿自己开启和关闭线程。而Android 官方推出了 IntentService 工具,免去开启线程的烦恼,而且它还有自动关闭线程的功能,牛逼了。为了学习NDK,最近一直在上网络课,做开发如果没手艺那么就离淘汰不远了,后期还会和大家分享关于 OpenCV ...

2017-07-25 09:40:50

阅读数 3951

评论数 0

原创 使用内容提供器跨应用分享你的数据(1)

这是作者在android的学习旅途上具有历史性意义的一刻,因为四大组件就剩这一个了,从刚开始的写写样例,到现在已经养成了查看源代码的习惯,从以前android都会拼写错误,到现在开始有了自己的技术博客,这一路的成长真是不易。接下来了解一下四大组件的1/4,contentProvider适用于跨应用...

2017-07-15 09:30:41

阅读数 3197

评论数 0

原创 5分钟轻松解决Android数据库访问,Cursor类的基础使用

相比于MySql等数据库,SqLite有着它特有的工具Cursor,一次获取一行数据(在数据库中,一行包含了一个主键约束的索引的全部内容)。使用游标来读数据库一般分两步:(就像在游标卡尺上读数)1.横向的获取列名所对应的位置(储存在Cursor中的位置),getColumnIndex方法2.通过得...

2017-07-14 15:28:56

阅读数 8378

评论数 0

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