- 博客(44)
- 收藏
- 关注
原创 OpenGL ES 扫盲
前言OpenSL 是处理音频的底层开源库, OpenGL 则是处理图像相关的库,而对于移动端 Cpu/内存资源比较吃紧的特性,OpenGL 将部分不那么重要的 Api 进行精简,推出了 OpenGL ES ,相当于一个 mini 版本从 2014 年以来,OpenGL ES 经历多个版本迭代,现在已经迭代到 3.x 版本如何在 Android 上使用首先它对应了专门的控件 GLSurfaceView,我们用 Opengl ES 可以直接绘制的图形有点、线、三角形,其他图像怎么办呢? – 用三角形拼
2020-09-02 15:44:11
285
原创 Java 编程思想笔记(二)
前言阅读《Java 编程思想》,《Android 源码设计模式》这两本书后,发现了以往编码过程中有很多代码可以优化的点,以及当时的优化方案,所以记录下来。从事 Android 开发快一年时间了,对编码的开始有了感悟,项目需求变更时,我们最好不要直接修改原有代码,最好使用添加的方式来实现,避免破坏原有代码的稳定,最好定期进行部分重构,及时清除代码中的“垃圾”。单一责任原则一个类应当包含某功...
2019-03-09 15:56:57
155
原创 自定义控件-58同城加载动画
前言加载动画主要用于网络请求时提示用户等待,用来提升体验,各家 App 的效果千差万别,大多数应用使用 Progressbar ,也有蛮多设计感十足的加载动画,其中 58同城 的自由落体动画就算一个,先来展示最终效果文末附上<深入理解Java虚拟机>电子书,包括 Epub,mobi 等格式目录分析动画效果自定义控件:下落物体自定义控件:阴影深入理解JVM分析该...
2018-12-27 10:02:00
231
原创 自定义控件-5分钟手写计步器
前言自定义控件是每个 Android 应用开发者的必备技能,所以一起来试着手写自定义控件,挑战自定义 View 中最好玩的 onDraw.我们仿照 QQ 计步器的样式来做,主要熟悉画笔(Paint)的使用技巧在这里感谢红橙Darren老师的指导绘制步骤自定义属性继承 View绘制背景圆弧绘制前景圆弧绘制文字设置方法自定义属性 // 自定义计步器控件属性 &...
2018-12-06 18:11:31
274
原创 手写 BufferKnife -- Android Ioc 框架(ViewJet)
前言黄油刀(BufferKnife)使用注解声明控件,不再反复 findViewById,使得代码简洁高效。下面我们手撸一套ioc框架实现黄油刀的效果。Github 地址ViewJet 2.0 (View飞行器)特性BindView 注解声明控件对象自动绑定监听器Gradle 集成实现原理注解+反射注入属性注入方法使用教程添加 Gradle 依赖rep...
2018-11-06 23:28:35
247
原创 游戏 sdk 开发总结
前言历时 2 个月的时间,终于完成了第一个作品,开发过程中产品的逻辑界面经历了多次改动,而代码保持了简洁清晰,真的学到蛮多东西.目录sdk 开发的不同点屏幕适配混淆自定义控件Gradle 设置sdk 开发的不同点sdk 和普通 app 有什么区别呢?sdk 是作为一个 module ,也就是程序库,它不能独立存在,需要其他app去调用.sdk 不能引入开源框架,比如图...
2018-09-20 09:36:52
2055
原创 5分钟搞定PopUpWindow
前言最近在项目中用到了 PopUpWindow,并且在机型适配时发现华为等具有虚拟按键的手机在横屏状态时会造成 PopUpWindow 显示位置偏移的情况存在,最后完美解决了这个问题,所以把经验分享出来,看能否对你有用。弹窗有很多种实现方式,例如: 1. Dialog 2. DialogFragment 3. Fragment 4. PopUpWindow 5. List...
2018-09-01 13:47:47
302
原创 Andorid 开发中一定会遇到的小问题
前言在开发Android时,经常会遇到千奇百怪的小问题,所以一个个记录下来,方便日后翻看,也希望能够帮到其他开发者。目录国际化时 Button 字符自动大写View 在横屏模式下(虚拟按键)位置偏移国际化时 Button 字符自动大写复现在英语环境下,按钮上的字符全都自动大写了,必须注意到的是,作者并未在样式中规定全部大写,这是因为:在 Andor...
2018-09-01 13:45:23
142
原创 自定义 View 不难:带刻度线的 SeekBar(垂直方向)
需求实现垂直摆放根据容器大小均匀等分刻度实现长按监听思路将原本水平的 SeekBar 垂直摆放 添加长按接口根据等分的份数计算每份的长度使用 Paint 逐个画线实现因为有份数是变动的,我们需要自定义属性自定义 View1. 自定义属性我们将份数定义为 tick_mark_count ,整形<?xml version...
2018-06-04 16:52:20
1343
原创 垂直摆放的进度条 VerticalSeekBar
前言近期在项目开发中,需要对原生的 SeekBar 进行自定义,因为原生 SeekBar 只能水平放置并且样子太丑了,哈哈哈。需求是构建一个垂直摆放的 SeekBar,所以借鉴了 CSDN 中某位大牛的代码,但当时忙于完成工作,忘记是哪位前辈写的了。话不多说,直接放图对,没错;就是图中调节亮度和音量的进度条,下面 po 出的代码只是垂直摆放控件,图片中具体样式需要自定义Ve...
2018-05-30 10:03:27
1146
1
原创 HyBird初探:Java 和 JavaScript交互
前言这是 HyBird 开发学习笔记的第一篇,在这一篇中介绍怎样通过 WebView 实现两种语言间的互相调用。参考博客:https://blog.csdn.net/sy18298711239/article/details/51945478调用 JavaScript1. 调用 JavaScript 首先需要构建一个 html 文件<!DOCTYPE html P...
2018-04-27 16:41:37
261
原创 View.getHitRect
是什么所有的 View 在屏幕上都占据着一块矩形区域,Rect 在 Android 中表示矩形类,getHitRect()作为获取控件所在的矩阵范围函数,简直就像个神器。当然他也有不给力的情况,我们平常调用时候如果是在控件的监听器里调用就没事,但是如果主动的在onCreate 或者 onResume中,拿到的矩阵坐标全是0.怎么用rect 是一个空白的矩形,调用 View.getHi...
2018-04-27 13:59:17
1230
原创 Android 属性动画看这篇就够了
前言动画绘制与 View 绘制有哪些区别? Android 动画框架是什么?适应场景有哪些? 动画机制Android 内部有一套动画框架,开发者通过调用 Api 能够快速实现华丽丽的动画效果。动画和 View 有着密切联系,其中动画的重绘在 ViewGroup.drawChild 中实现,听说刷新间隔10ms。视图动画View(视图)动画的作用对象是 Vi...
2018-04-08 17:35:15
318
原创 Launcher 拖拽分析
前言 在手机屏幕上通过长按动作可以对图标拖拽删除,我们有了多个问题:Android 是怎样找到我们所长按的那个图标的?进行拖拽伴随着图标的震动和动画是怎样实现的?分析代码我们知道长按屏幕是在 WorkSpace 进行操作的,所以我们直接在这个类中处理长按的方法。@Override public void performLongClick(final floa...
2018-03-27 16:50:53
404
原创 LauncherActivity 项目分析
前言Launcher 是系统启动后第一个启动的程序,是其他应用程序的入口,也是我们的手机程序的桌面程序。设计模式:MVC目录LauncherLauncherActivity.onCreate LauncherActivity.onResume LauncherActivity.onDestroy Launcher通过查看 AndroidManifest 清...
2018-03-21 16:36:47
2679
原创 TabLayout + ViewPager 实现底部导航栏
效果前言底部导航栏有多种实现方式,最近学习了ViewPager+TabLayout 的实现。发现 design 版本的tablayout提供了神奇的封装,只需要调用setupWithViewPager(viewPager)就会根据 ViewPager中view数量配置与之相等的tab。实现Fragment我们使用Fragment去填充Viewpage...
2018-03-06 23:45:13
1063
原创 插入排序
前言插入排序分为直接插入排序和希尔排序。直接插入排序将新的数插入到已经排序好的一个队列中,直接插入排序时间复杂度: O(n^2) public void insertSort(int k[]) { int temp; int j; int i; for (i = 1; i < k.length; ...
2018-02-15 13:41:06
132
原创 单例模式的三种实现 (Java)
前言为了避免重复创建对象,我们需要学习使用单例模式。推荐使用饿汉模式。实现懒汉模式饿汉模式双检锁/双重校验锁* 懒汉模式最简单的一种实现,实现懒加载,但是不适用于多线程。懒加载:需要时才加载,不加载不占用空间。实现代码public class LazzySingleInstance { public static LazzySing...
2018-02-11 21:54:13
305
原创 不看你会后悔的 View 绘制基础
前言自定义 View 时Android 开发中的一个热点知识,我们结合源码了解绘制 View 的必备知识。流程measure 测量layout 位置draw 绘制measure 测量view 大小的测量是在 onMeasure 中实现的,测量过程用到了MeasureSpac,MeasureSpec是一个int类型的值,由高2位的规格模式和低30位的具体尺寸,...
2018-02-10 11:14:23
207
原创 设计模式:观察者模式
前言在使用 Java 写代码的过程中,我们经常遇到需要拓展功能的情况,为了代码更加灵活,我们必须学习设计模式。实现截图观察者模式观察者模式=主题+观察者类似报社订阅者发放报纸: 1. 订阅者订阅报纸,以后每当新闻出现,订阅者都会收到报社的新报纸。 2. 订阅者取消订阅后,报社不再发放报纸。 3. 一家报社对应多个订阅者。实现原理两个接口:
2018-02-02 14:10:50
126
原创 两个栈来实现一个队列 《剑指Offer》
题目思路栈:先进后出队列:先进先出使用两个栈,栈1用于push,栈2用于pop,两个栈底相当于是连接的。代码import java.util.Stack;public class Stack2Queue { Stack stack1 = new Stack(); Stack stack2 = new Stack(); //进队
2018-01-27 20:37:50
107
原创 从尾到头打印链表 《剑指Offer》
题目思路刚拿到题目,错误的认为是单链表的反转。这个题目用递归的方式会好做很多。因为递归的底层使用堆栈实现的,它会一层层递归,到达底层时回朔。解法/*** public class ListNode {* int val;* ListNode next = null;** ListNode(int val)
2018-01-26 11:30:57
95
原创 替换空格 剑指Offer
题目思路首先从左往右计算空格的数量反向替换空格,因为正向替换,需要大量的移动代码 public String replaceSpace(StringBuffer str) { int spaceNum=0; int newLength=0; int oldIndex; // 统计数量
2018-01-24 21:42:46
173
原创 冒泡排序的多种实现
冒泡是我最早接触的排序算法,两个 for 循环就搞定。前言国际惯例,先上效果图目录基本思想算法实现基本原理通过比较相邻两个元素,如果符合条件就进行替换。算法实现写法有很多种,具有代表性的是《Java数据结构普与算法》书中给出的案例。 //out 一趟排列出最大(最小)值 int out; /
2018-01-24 21:28:54
258
原创 二维数组查找 《 剑指Offer》
题目时间限制:1秒 空间限制:32768K 热度指数:517541本题知识点: 查找题目描述: 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。思路选取右上角或者左下角的元素a[row][column]与target进行比较, 当target
2018-01-14 17:13:43
163
原创 二叉树的递归遍历
前言二叉树和链表在历年春招笔试中,都是重点考核对象。链表由于算法简单,一般考代码实现能力。二叉树考核遍历。二叉树二叉树是树形结构中比较简单的,它又可细分成完美二叉树,斜二叉树(相当于链表),完全二叉树。二叉树的几个性质第 i 层最大结点数为 2^(i-1)深度为 k 的二叉树最大结点数为 2^k -1 (完美二叉树)二叉树的遍历先序中序后序层次
2018-01-10 21:08:10
170
原创 链表的反转(使用循环遍历实现)
前言链表的反转问题在校招中算是一个高频题目,同时考的比较勤的还有:Top K ,快排,堆排,这些在以后的帖子中我们再细说,今天我们先用 Java 实现单链表的反转。推荐看看这个 看图理解单链表的反转,写得简单清晰。单链表的反转链表的反转有两种实现:遍历,递归;遍历易于理解,递归代码简洁,各有千秋。反转的遍历实现在遍历时,要分清头指针 first (有的教程里写成
2018-01-08 21:43:06
1320
原创 单链表的Java实现 (二)
前言前面我们对单链表的表头进行数据的插入和删除,其实也就是实现栈的链式存储。然而仅仅对首个结点进行操作太 easy,我们需要的是对任意位置的查询和删除。目录查询结点删除任意结点查询结点以结点中存储的值为查询的索引 //根据值查询链表 private List queryByKey(int key) { List current = first; while
2018-01-02 20:32:21
1802
原创 单链表的Java实现 (一)
前言最近准备春招,数据结构和算法是短板,决定下功夫恶补。链表能够实现数据的链式存储,可以做大量的数据插入删除,不用指定内存的大小。目录结构 头结点头部插入数据头部删除数据遍历数据结构 class List { //数据 private int data; //储存指向下一节点的指针 private List next;
2018-01-02 16:50:56
1003
原创 两分钟实现 NavigationView 侧滑菜单
前言Google 在 Android 5.0 后推出了官方的实习,在谷歌爸爸自家 App 中被大量运用,以前需要自己写,现在好了官方版本直接用轮子,接下来我们来看看怎样实现。实现效果目录布局文件Java 代码布局文件在 DrawerLayout 中添加 NavigationView<android.support.v4.widget.DrawerLayout xmlns:andro
2017-12-16 21:07:22
180
原创 Glide 给你点颜色看看
前言任何一款能抓住用户的App都离不开图片加载这个老生常谈的话题,所以我们先了解一个利器:Glide 框架。Glide 的优点:能加载 gif 动图,这是 Picasso 做不到的。从Github的官方介绍中,我们了解到 Glide 是一个很好用的框架,它加载图片既快速又能平滑,而且又配适主流网络框架。### 目录 * Glide 集成 * Glide 的基本使用Glide 集成在Gra
2017-12-08 10:49:50
350
原创 最简单靠谱的底部导航栏实现!!!
前言Android实现底部导航栏的方式很多,有5种实现方式。 作者使用过两种:RadioGroup+Fragment;FragmentTabHost;其中第一种更容易上手。实现效果目录创建RadioGroup监听,切换 Fragment创建RadioGroup <RadioGroup android:id="@+id/radiogroup" android:l
2017-11-12 20:17:42
1570
原创 可能是Android最简单的欢迎页面实现
例如QQ的经典欢迎页面 前言目前市面上的大多数 App 都有一个欢迎页面,有如下优点: 1. 利用展示欢迎页面的时间来加载数据 2. 展示品牌设计风格步骤创建布局文件设置欢迎页面延时 2S 跳转创建布局文件<?xml version="1.0" encoding="utf-8"?><android.support.constraint.ConstraintLayout xmlns:an
2017-10-27 09:44:34
384
原创 Git 不可不知的常识 (1)
目录diff 两个相同的 Commit分支合并分支diffdiff 只需输入 ID 的前6位(最短)。git diff ID :比较工作区的文件与该 ID 指向的文件的区别git diff ID ID :比较两个 ID 对应的版本的区别git diff oldID newID :输出的是新文件的增加项 ++++git diff newID oldID :此时新文件的增加项变成了—
2017-08-15 09:44:51
6828
原创 Material Design 原来这么有趣
前言在材料设计中,有许多设计理念。运用现实生活中的材料,随时进行设计,这是它的核心。目录平面高度FAB 悬浮按钮CoordinatorLayout颜色字体平面平面就是 View 的抽象描述,toolBar 是一个平面,一个 Crad 也是一个平面,总之,用来包裹内容的,并且投射阴影的(在 MD 中通过阴影来实现部件的分层)。基本准则:最好不要同时出现5个平面。 高度高度是平面离背
2017-08-10 09:54:44
7363
1
转载 认识 android-job
https://zhuanlan.zhihu.com/p/26093468“>原文链接 对于现在的应用来说,在应用生命周期之外运行一些后台任务可以说已经是一项必不可少的需求了。这些任务可能是在某个时间点提醒用户什么事情或同步本地数据到服务器等等。 对此 Android 有一系列方式来实现这些后台任务:1. JobSchedularJobSchedular 在 Lollipop (API leve
2017-08-01 14:52:27
4999
原创 Notification 都不知道,还学什么 Android 应用开发
目录Notification 的概念在 Notification 中启动 Activity在 Notification 中启动 Service实现 ActionNotification 的概念是 Android 系统提供的一个功能,所以它独立于 Activity 存在 。 使用 NotificationManager 来调用。在 Notification 中启动 Activity点击
2017-07-28 21:10:54
4711
原创 IntentService的最简单实现
如果直接继承 Service ,那就需要程序猿自己开启和关闭线程。而Android 官方推出了 IntentService 工具,免去开启线程的烦恼,而且它还有自动关闭线程的功能,牛逼了。为了学习NDK,最近一直在上网络课,做开发如果没手艺那么就离淘汰不远了,后期还会和大家分享关于 OpenCV 和 OpenGL 的相关知识,希望我的分享能成你的干货 。目录IntentService 的结构I
2017-07-25 09:40:50
4073
原创 使用内容提供器跨应用分享你的数据(1)
这是作者在android的学习旅途上具有历史性意义的一刻,因为四大组件就剩这一个了,从刚开始的写写样例,到现在已经养成了查看源代码的习惯,从以前android都会拼写错误,到现在开始有了自己的技术博客,这一路的成长真是不易。接下来了解一下四大组件的1/4,contentProvider适用于跨应用读取数据,比如在荷包app中自动填写短信验证码,免去输入的烦恼。其实内容提供器的内部封装了一个SQlit
2017-07-15 09:30:41
3352
原创 5分钟轻松解决Android数据库访问,Cursor类的基础使用
相比于MySql等数据库,SqLite有着它特有的工具Cursor,一次获取一行数据(在数据库中,一行包含了一个主键约束的索引的全部内容)。使用游标来读数据库一般分两步:(就像在游标卡尺上读数)1.横向的获取列名所对应的位置(储存在Cursor中的位置),getColumnIndex方法2.通过得到的位置,getString(index) or getInt(index)3.也可以做循环输出 wh
2017-07-14 15:28:56
9356
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人