- 博客(94)
- 资源 (16)
- 问答 (6)
- 收藏
- 关注

原创 Android 图形系统详解
一个页面(Activity)显示到屏幕上流程分析:启动 Activity → 创建 Window → WMS 注册 Window → SurfaceFlinger 创建 Surface → 合成 layer → 显示主要涉及三个进程:App进程、System_server进程、SurfaceFlinger进程
2023-02-08 21:04:46
4583
原创 Android OpenGL 教程——窗口初始化&绘制矩形
上节介绍了,但是我们的窗口什么都没有,这节我们将 NativeActivity 创建的 window 绑定到 OpenGL 创建的 display 的 surface 上,并且绘制背景颜色和三角形,通过三角形绘制出一个矩形。
2023-07-24 20:46:29
629
原创 Android 输入系统详解
Android 输入系统的工作原理概括来说,内核将原始事件写入到设备节点中,InputReader 不断地通过 EventHub 将原始事件取出来并翻译加工成 Android 输入事件,然后交给 InputDispatcher。InputDispatcher 根据 WMS 提供的窗口信息将事件交给合适的窗口。窗口的 ViewRootImpl 对象再沿着控件树将事件派发给感兴趣的控件。控件对其收到的事件作出响应,更新自己的画面、执行特定的动作。
2023-05-06 18:15:35
853
原创 OkHttp简析及实现
OkHttp简析及实现还记得 2015 年刚开始学习 Android 那会,还在为 Eclipse 项目中集成 Afinal.jar 、 Volley.jar 爆红而发愁,一晃而过到现在的 2020 年,见证了 AndroidStudio 的兴起。就这短短的5年时间,很多工具和技术都进行了更新换代或者在升级今天我们就看看经过官方承认并使用的网络请求框架 OkHttp。OkHttp简析使用接入 OkHttp先来康康怎么接入,直接 gradle 中一行代码就搞定了。确实比之前还要下载相关 jar 包
2020-08-19 16:03:28
523
原创 EventBus之高效使用
EventBus之高效使用说起 EventBus,作为一名 Android 开发者,应该不会太陌生,但是我们大部分都会根据官方文档直接进行使用,其实还有一种比较高效的使用方式。就是不使用注解的方式,在编译时期,对相关注册方法进行注册。这其实就相当于用空间换时间的一种常规操作了。这里附上 官方源码 和 官方文档 的地址。先来贴一张官方文档中的图解,让大家对 EventBus 的工作机制现有一个宏观上的回忆。常规使用先来看看常规的使用方式。1、接入EventBus implementation
2020-07-01 20:49:07
456
原创 SVG 详解——自定义可点击的中国地图
SVG 详解——自定义可点击的中国地图SVG定义SVG 是一种图像文件格式,类似于 JPG、PNG。只不过 JPG 和 PNG 这种文件需要图像引擎加载,而 SVG 则是由画布来加载的。它的英文全称为 Scalable Vector Graphics,意思就是可缩放的矢量图形。可让你设计无损失、高分辨率的 Web 页面图像。猿猿们就可以用代码来描绘图像,不管怎么缩放都始终保持高清显示,不会...
2020-04-14 17:15:38
3902
原创 Android 事件分发机制分析及源码详解
Android 事件分发机制分析及源码详解文章目录Android 事件分发机制分析及源码详解事件的定义事件分发序列模型分发序列分发模型事件分发对象及相关方法源码分析事件分发总结一般在实际开发中,我们很少主动去处理相关滑动处理,所以就很少关注事件分发相关机制。因为系统已经帮我们处理好了,如:ScrollView、ViewPage、ListView 等。这里我们就以事件分发为入口,来分析一下...
2020-03-09 21:39:39
378
原创 Apk 全面瘦身详解
Apk 全面瘦身详解做 Android 开发的都有经历过,项目的体积大小随着开发时间增长,包体积也会随之增长。想想一个经历过5-6年的项目,如果不做包体积方面的控制和优化,最起码现在得有百兆了,还是一个简单的应用。随着 apk 的体积增大,相应的弊端也就暴露出来了,这也就是我们为什么要进行 apk 瘦身的原因安装包过大,导致很多用户不愿更新和下载安装包过大,导致新用户不愿下载安装包过...
2020-03-04 15:44:43
492
原创 APP 启动优化
APP 启动优化我们 Android 开发永远也摆脱不了性能优化的需求,做的 App 就是给用户用的,随着功能的增加,App启动功能的丰富。点击启动图标时,我们的 App 启动会出现一个白屏页面。这个非常影响交互体验。这节我们就来看看怎么优化这里启动方式首先,我们来看看 App 的启动方式都有哪些冷启动程序从头开始,系统灭有为该程序创建进程。一般有两种场景:1. 程序安装后的第一次...
2020-03-02 14:53:46
298
原创 View 自定义属性之 LayoutInflater
View 自定义属性之 LayoutInflater平常开发中,我们避免不了会自定义 view,自定义 view 的时候可以通过 AttributeSet 来获取自定义的相关属性。而怎么样不通过自定义 view,就能实现自定义相关属性呢,那就要使用自定义的 LayoutInflater 了。原生 LayoutInflater 使用我们先看看原生的 LayoutInflater 是怎么使用的。...
2020-02-28 18:13:35
534
原创 Vsync机制和Choreographer详解
文章目录UI 卡顿定义卡顿原因及常见解决方式VSync定义作用工作原理Buffer 缓存机制单缓存双缓存三缓存Choreographer使用源码分析UI 卡顿定义用户角度:APP 操作比较缓慢,响应不及时,列表滑动卡顿,动画刷新不流畅等系统角度:屏幕刷新帧率不稳定,无法保证每秒60(跟手机有关)帧刷新频率,出现掉帧现象卡顿原因及常见解决方式过度绘制去除不必要背景布局...
2019-11-07 16:42:03
1635
8
原创 Launch 桌面启动详解
Launch 桌面启动详解不管是开机还是重启手机,相信我们大家都不陌生吧。大部分的 90 后都经历了从 Android 2.* 的统一开机动画,到现在 Android 10 的各种定制开机动画。为什么 Android 系统启动时需要播放一段开机动画呢,而且播放完成后有的性能比较差的机器或者定制度比较高的 Room 都需要在最后一帧动画定格一段时间,是因为 Android 系统启动时首先需要从 ...
2019-11-02 18:21:15
2747
原创 AMS、Activity 启动流程详解
AMS、Activity 启动流程详解概述ActivityManagerService(以后简称AMS)都有所耳闻。AMS 是 Android 中最核心的服务,主要负责系统中四大组件的启动、切换、调度及应用进程的管理和调度等工作,其职责与操作系统中的进程管理和调度模块相类似,因此它在 Android 中非常重要。先来看AMS的家族图谱相关类说明ActivityManagerServic...
2019-11-01 17:09:08
1099
原创 PMS启动 APK 安装流程详解
PMS启动 APK 安装流程详解概述PackageManagerService(以下简称 PMS)是一个常用的系统服务,主要负责系统中的 Package 的管理,应用程序的安装、卸载、查询等相关功能。其相关类图如下相关类说明IPackageManager定义了服务端和客户端通信的业务函数,还定义了内部类 Stub ,该类从 Binder 派生并实现了 IPackageManager ...
2019-10-31 17:54:51
2500
原创 Binder 详解
Binder 详解什么是 BinderBinder 是一种进程间通信机制,基于开源的 OpenBinder 实现;OpenBinder 起初由 Be Inc. 开发,后由 Plam Inc. 接手。从字面上来解释 Binder 有胶水、粘合剂的意思,顾名思义就是粘和不同的进程,使之实现通信。Binder 的由来我们知道,Android 系统就是运行在 Linux 系统之上。而 Linux ...
2019-10-30 17:55:43
1300
原创 Android 动画使用及源码分析
Android 动画使用及源码分析Android 动画有如下三类,逐帧动画已经很少使用了,这里就不在说了,这里主要看一下 补间动画 和 属性动画 的加载和渲染逐帧动画补间动画属性动画补间动画补间动画分为如下四类动画属性相关类淡入淡出AlphaAnimation位移TranslateAnimation缩放ScaleAnimation旋转...
2019-10-11 14:07:54
515
原创 Android 音频录制(三)-OpenSL ES
Android 音频录制-OpenSL ES相关推荐音频基础知识Android 音频录制-MeidaRecordAndroid 音频录制-AudioRecordAndroid 音频录制-OpenSL ES
2019-09-29 11:14:18
425
原创 Android 音频录制(二)-AudioRecord
Android 音频录制(二)-AudioRecordAndroid 系统为我们提供了三种录制音频的方式MediaRecord( Java API)AudioRecord( Java API)OpenSL ES( Native API)这次我们来说复杂一点的 AudioRecord。官方API 介绍我们在上节说的 使用MeidaRecord录制,系统已经为我们将数据处理完成,我们只...
2019-09-26 14:19:09
855
原创 音频基础知识
音频基础知识小时候看电视、听广播就在想,这里面的人在哪藏着呢,那么小的空间,咋藏的呢,他也不出来,就在里面瞎BB。直到后来我入了计算机的坑,才发现万事万物皆01。经过后来了解,发现一个声音源要变成 01 数据需要经过以下几个过程。自然声波->模拟信号->数字信号自然声波->模拟信号当我们说话时,麦克风会将自然声波处理转换成为声音的模拟信号。麦克风一般分为以下两种...
2019-09-26 11:18:31
551
原创 Android 音频录制(一)-MediaRecord
Android 音频录制(一)-MediaRecordAndroid 系统为我们提供了三种录制音频的方式MediaRecord( Java API)AudioRecord( Java API)OpenSL ES( Native API)这次我们先从最简单的 MediaRecord 说起系统提供的这个是最简单的录制 API。不用关心编码、不用操作字节码,所有的数据处理内部都已经实现,...
2019-09-25 20:49:36
538
原创 Android WebView 与 Native 交互
Android WebView 与 Native 交互在 Android 开发过程中,难免会用到 WebView 展示一些 H5 页面,这样就免不了需要和 Native 进行一些信息的交互。比如获取当前登陆状态、保存一些值、调起相应页面或者功能等。这里将 H5 与 Android 交互这块封装成了一个模块,有兴趣可以看下 WNBridge,访问不了的可以下载资源先来看一下效果图Andro...
2019-08-29 20:25:42
453
原创 Android 屏幕适配
Android 屏幕适配常见方案限定符适配尺寸限定符限定符描述layout-small小屏幕layout-normal基准屏幕layout-large大屏幕layout-xlarge超大屏幕屏幕方向限定符限定符描述layout-land横向layout-port纵向分辨率限定符限定符描述...
2019-08-29 10:17:35
334
原创 源码分析软键盘弹出失效问题
源码分析软键盘弹出失效问题平常开发中,经常碰到 EditText 输入内容时需要调起软件盘。但是有时发现调用了之后没有生效,软键盘并没有弹出来。通常做法如下,延迟执行,虽然大概率提升了软键盘弹出的几率,但是偶尔还是会失效,没有从根本上解决问题的痛点。editTextView.postDelayed(new Runnable() { @Override ...
2019-08-26 21:47:56
720
原创 Android水波纹效果
Android水波纹效果最近学习了 Paint 和 Canvas 的相关知识,自定义 View 实现了一个水波纹效果注释在代码里面已经补全了。直接看代码即可package com.wuba.demo;import android.animation.Animator;import android.animation.AnimatorListenerAdapter;import an...
2019-08-15 12:58:54
426
原创 Canvas 详解
Canvas 详解这节我们来看一下 Canvas 的相关知识,官方文档有详细的功能说明,这里我们简要了解一下几个常用的功能绘制文本、几何图形、位图接口功能drawText绘制文本drawLine绘制连线drawPath根据给定的Path,绘制连线drawPoint绘制点drawBitmap绘制位图位置形状变换接口功能...
2019-08-13 21:28:04
324
原创 Paint 的ColorFilter(颜色过滤器)和 XFermode(图层混合模式)
Paint 的ColorFilter(颜色过滤器)和 XFermode(图层混合模式)ColorFilter-颜色过滤器顾名思义就是 Paint 画笔的颜色过滤功能。通过 setColorFilter(ColorFilter filter) 方法进行设置,该方法传入了一个 ColorFilter 对象,我们来看下这个是个嘛东东。/** * A color filter can be use...
2019-08-13 11:06:41
750
原创 Paint 详解
Paint 详解Android 中的 Paint 我们可以理解为画画中的画笔,画笔往往有多种颜色和粗细。Paint 只有一个,但是他可以设置相关属性,来实现各种画笔的特性。我们作画时是用画笔在画板上作画,这里的 Paint 就是我们的画笔,画板就是 Android 中的 Cavans 了,这节我们直谈 Paint,Cavans 就不过多介绍。常用 API我们列举出了 Paint 常见的一些 ...
2019-08-07 20:08:33
846
原创 UI 绘制流程及原理全过程解析
UI 绘制流程及原理全过程解析UI 绘制流程类文章在网上一搜一大把,但是都有一定的断层。比如只分析了View的三大流程 onMeasure 、 onLayout 、 onDraw ,但是这三个方法的调用链却没有描述。这篇文章就应运而生。Window 顶层 DecorView 身世我们都知道,通过 startActivity启动一个页面时,如果在 onCreate没有调用 setConten...
2019-08-01 11:23:28
1641
原创 View 的测量 MeasureSpec
View 的测量 MeasureSpec我们平常自定义都是重写 view 的 onMeasure(int widthMeasureSpec, int heightMeasureSpec)方法,而这个方法传入的宽和高都是一个32位 int 值。下面我们揭开这层神秘的面纱。MeasureSpec 解析MeasureSpec 是位于 View 类中的一个静态类,也就 100 行左右。我们先来看其中...
2019-07-30 21:24:46
268
原创 WebView与ListView滑动冲突——(二)LinearLayout控制WebView滚动
上一篇我们大致了解了一下View中 事件的一些基础《WebView与ListView滑动冲突——(一)事件基础篇》,Scroll是为了实现View平滑滚动的一个Helper类,通常在自定义View中使用。 这次我们从一下几个方面来了解一下Scroll与VelocityTracker的用法:View和MotionEvent的位置信息View中的Scroll方法Scroll中的scroll*()方
2017-09-01 09:51:22
1011
原创 WebView与ListView滑动冲突——(一)事件基础篇
Android中的事件有很多种,从宏观上来讲我们最常见,最常用的就是onClick事件了,微观上来说就是onTouchEvent、onInterceptTouchEvent、dispatchTouchEvent等方法都具有MotionEvent参数,该Event即为用户一次行为的具体体现。如果其中某一个方法返回true,则代表改方法消费了该事件,则该事件将不会向下传递,其后的ACTION_MOVE、
2017-08-29 20:58:30
1017
原创 Android底部弹出Dialog
一.简要先看看效果图把,点击中间的弹出对话框按钮,从底部弹出Dialog,我们可以选择拍照,选择相片,以及取消按钮二.实现首先先看看比较重要的两个文件把1.Dialog的布局文件dialog_layout.xml该布局文件主要是对弹出的Dialog进行布局<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http:
2017-04-26 17:08:51
3373
原创 Android内存泄漏——常见的内存泄露
JAVA是垃圾回收语言的一种,开发者无需特意管理内存分配。但是JAVA中还是存在着许多内存泄露的可能性,如果不好好处理内存泄露,会导致APP内存单元无法释放被浪费掉,最终导致内存全部占据堆栈(heap)挤爆进而程序崩溃。Java的内存JAVA是在JVM所虚拟出的内存环境中运行的,JVM的内存可分为三个区:堆(heap)、栈(stack)和方法区(method)。栈(stack):是简
2017-04-26 14:07:02
592
原创 Android自定义日历控件
概述日历有阳(公)历、阴(农)历之分,咱们从下面两个方面区分一下(当然,他们的区别还是挺多的,有兴趣的可以研究研究)月份的定义:阳(公)历 一年12 个月,每个月的天数各不同;阴(农)历,每个月固定28天每周的第一天:阳(公)历星期日是第一天;阴(农)历,星期一是第一天好了,咱们言归正传。日历翻译成英文就是Calendar,然而咱们平使用的是阳(公)历,翻译成英文就是GregorianCale
2017-03-28 22:36:51
4394
5
原创 Android自定义键盘的简单实现
自定义键盘的简单实现概述突然发现好多软件都使用了自己定义的软键盘。自己就想着先把这块坑先踩踩把,以后掉坑的时候不至于帅的太惨。言归正传,对于自定义软键盘。需要用到系统提供的两个类:Keyboard和KeyboardView。Keyboard设计键盘的布局文件,官方上对Keyboard是这么解释的Loads an XML description of a keyboard and stores the
2017-03-20 19:59:09
24022
10
原创 Android AIDL的简单应用
Android AIDL的简单应用概要AIDL(Android Interface Definition Language),从字面解释来看就是Android接口协议语言。如果是接口协议语言 那么就跟接口脱离不了关系。通过它我们可以定义进程间的通信接口。什么情况下使用AIDL你能看到这说明你已经知道AIDL是为了跨进成通信使用的。但是已经有了广播、ContentProvider等都可以进行跨进程通
2017-03-16 21:44:26
477
转载 Android OpenGL ES2.0基础(三、Shader相关介绍)
原文链接:http://www.tuicool.com/articles/VZVJra 与OpenGL ES1.x渲染管线相比,OpenGL ES 2.0渲染管线中“顶点着色器”取代了OpenGL ES 1.x渲染管线中的“变换和光照”;“片元着色器”取代了OpenGL ES 1.x渲染管线中的“纹理环境和颜色求和”、“雾”以及“Alpha测试”。 这使得开发人员在使用Op
2017-03-10 10:30:42
1385
Java向Exif添加新属性信息
2016-03-23
android和pc端socket链接重置抛出:Connection reset
2015-08-04
用MySql的Navicat创建存储过程总是报1458错误
2015-06-17
位图解析系统相机返回的图片异常
2015-06-15
基于android的图像处理,求大神带我飞。。。
2015-05-12
TA创建的收藏夹 TA关注的收藏夹
TA关注的人