代码规范对于一个软件项目来说非常重要,当然Android项目也不例外,一个优秀的Android项目不仅需要严谨的业务逻辑和架构设计,更需要一套统一优雅的代码规范标准,才可以让整个项目团队更加高效。

阅读全文 »

控件架构

控件分为ViewGroup控件与View控件。ViewGroup控件作为父控件可以包含多个View控件,并管理包含的View控件。通过ViewGroup,整个界面上的控件形成了一个树形结构,这也就是我们常说的控件树,上层控件负责下层子控件的测量与绘制,并传递交互事件。

自定义View

自定义view的分类

  1. 继承View重写onDraw方法

    这种方法主要用于实现一些不规则的效果,采用这种方式需要自己支持wrap_content,并且padding也要处理。

  2. 继承ViewGroup派生特殊的Layout

    实现自定义布局。重新定义一种新的布局。需要处理View

  3. 继承特定的View(比如Textview)

    用于扩展已有的View的功能。不需要自己支持wrap_content和padding。

  4. 继承特定的ViewGroup(比如LinearLayout)

自定义View的注意

  1. 让View支持wrap_content
  2. 如果有必要,让你的view支持padding
  3. 尽量不要在View中使用Handler。
  4. View中如果有线程或者动画,需要及时停止。
  5. View中带有滑动嵌套情形时,需要处理好滑动冲突。

自定义view示例

继承View重写onDraw方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
public class CircleView extends View{

private int mColor = Color.RED;
private Paint mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
public CircleView(Context context) {
super(context);
init();
}

public CircleView(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}

public CircleView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init();
}



private void init(){
mPaint.setColor(mColor);
}

@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
final int paddingLeft = getPaddingLeft();
final int paddingRight = getPaddingRight();
final int paddingTop = getPaddingTop();
final int paddingBottom = getPaddingBottom();
int width = getWidth()-paddingLeft - paddingBottom;
int height = getHeight() - paddingTop - paddingBottom;
int radius = Math.min(width,height) /2;
canvas.drawCircle(paddingLeft+width/2,paddingTop+height/2,radius,mPaint);
}

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
int widthSpecMode = MeasureSpec.getMode(widthMeasureSpec);
int widthSpecSize = MeasureSpec.getSize(widthMeasureSpec);
int heightSpecMode = MeasureSpec.getMode(heightMeasureSpec);
int heightSpecSize = MeasureSpec.getSize(heightMeasureSpec);
if(widthSpecMode == MeasureSpec.AT_MOST && heightSpecMode == MeasureSpec.AT_MOST){
setMeasuredDimension(200,200);
}else if(widthSpecMode == MeasureSpec.AT_MOST){
setMeasuredDimension(200,heightSpecSize);
}else if(heightSpecMode == MeasureSpec.AT_MOST){
setMeasuredDimension(widthSpecSize,200);
}
}
}

在Android中,最简单的动画就是补间动画了。通过补间动画,可以对一个控件进行位移、缩放、旋转、改变透明度等动画。但是补间动画只能对一个控件使用,如果要对某一组控件播放一样的动画的话,可以考虑layout-animation。

阅读全文 »

UI技巧

Material Design系列,自定义Behavior实现Android知乎首页
Android 欢迎页
精通 Android 中的 tools 命名空间
Android开发:最详细的 Toolbar 开发实践总结&version=11020201&pass_ticket=JtFbOWzVz0QaHe5dN1epxdryv2HEDINGpaqXxeWcwGI%3D)
Android drawable微技巧,你所不知道的drawable的那些细节
Android键盘面板冲突 布局闪动处理方案
Android 透明状态栏实现方案
Drawable 着色的后向兼容方案
UI实时预览最佳实践
Tinting drawables
Android 高清加载巨图方案 拒绝压缩图片
Android ToolBar 的简单封装
Android中Canvas绘图基础详解
关于使用 CardView 开发过程中要注意的细节
实践自定UI
实践自定义UI2
自定义View的onMeasure、onLayout
Android快捷方式解密
ViewPager不为人知的秘密
Android Support Library 兼容库概念性介绍
RecyclerView添加Header的正确方式
Android布局优化之ViewStub、include、merge使用与源码分析
腾讯Bugly干货分享:Android机型适配之痛
如何更新及替换ViewPager中的Fragment
Android中WebView页面交互
Android 软键盘和emoji表情切换方案,和微信几乎一样的体验
Android – 固定在ScrollView顶部的View,类似于新浪微博的评论列表的顶部
自定义组件最详细实例讲解(7步实现自定义ViewGroup)
在滚动列表中实现视频的播放(ListView & RecyclerView)
Android开发中一些被冷落但却很有用的类和方法
Android夜间模式最佳实践
Android开发:最详细的 Toolbar 开发实践总结
这可能是目前最鲁棒的Android声音录制和播放封装库了
Android NavigationDrawer 开发实践总结
Android 界面性能调优资料
Android APP 快速 Pad 化实现&version=11020201&pass_ticket=mkxSG9yBAX1Owyn8FYzTXI641ZdTMCjVwh5JSkA24pE%3D)
夜晚的故事(android夜间模式实现)

关于RadioButton setCheck方法的问题

在做项目过程中,使用radioButton来做菜单切换导航,发现在RadioButton在与其他按钮来回切换会背景不生效,可以使用以下代码

1
rg.clearCheck();//清除选中状态的

参考来源

代码优化

Android客户端性能优化(魅族资深工程师毫无保留奉献)
谈Android模拟点击的价值和实现
BaseAdapter使用之逗比式、普通式和文艺式
关于 Android 进程保活,你所需要知道的一切
如何减小 PNG 图片大小
论Android应用进程长存的可行性
安卓性能优化之被忽视的内存泄露
Android 热修复,没你想的那么难
RecyclerView.Adapter优化了吗?
微信支付SDK-两行代码解决支付
Android Bitmap面面观
利用 Android Annotations 来玩玩契约编程
怎样用 Android Annotations 写出高性能代码
安卓App热补丁动态修复技术介绍&version=11020201&lang=en&pass_ticket=1zsiC5hQfwATA4R3ndq32UtcvN%2B5kATcavEv4xN2HMY%3D)

Android中如何提取和生成mp4文件
Android 热补丁动态修复框架小结
Android App 线上热修复方案
解决 singleTask onActivityResult() 无效的问题
判断指定App是否位于前台的方法
Android开发的那些坑和小技巧
你应该知道的那些Android小经验&version=11020201&pass_ticket=pvdhfR4lRer%2FtYDsP5cnFux5OK0GM%2FUQMgt5TOvHlpQ%3D)
android:process 的坑,你懂吗?
关于Android开发的40条优化建议
APK瘦身记,如何实现高达53%的压缩效果&version=11020201&pass_ticket=AOchp9l%2F7Ug8gVFlX0%2BK1tAyLOPwStguLTy4jV5RBLc%3D)
Android MultiDex实践:如何绕过那些坑?&version=11020201&pass_ticket=%2FiqZ3iooRz56i55SDTJXia%2F538BgsKzUx5BjjlLzrNU%3D)
APP瘦身之资源优化篇

Android studio教程

配置出“NB”的Android Studio

RxJava 教程

一张图读懂RxJava中的线程控制
RxJava 教程第一部分:入门之 Why Rx
Rx和RxJava文档中文翻译项目
RxJava Essentials 中文翻译版
给 Android 开发者的 RxJava 详解
RxJava学习资源
用 RxJava 实现 EventBus
用 RxJava 实现 BroadcastReceiver
Rxlifecycle使用详解,解决RxJava内存泄露问题
Getting Started With ReactiveX on Android
可能是东半球最全的RxJava使用场景小结
RxJava Essentials 一书的中文翻译版
Awesome-RxJava
使用RxJava 提升用户体验
我们为什么要在Android中使用RxJava
RxJava 与 Retrofit 结合的最佳实践
一个用于学习RxJava操作符的APP
从案例学习RxAndroid
RxJava常见的使用场景总结
我们的安卓客户端是如何使用 RxJava 的
RxJava中的错误处理
RxJava化的OnActivityResult—RxActivityResult
RxJava 和 Retrofit 结合使用的几个最常见使用方式举例
Android平台上RxJava的使用Demo集

Handler

Android Handler消息机制的理解
Android Handler消息机制的理解
Android消息循环机制源码分析

Adapter

Adapter优化方案的探索

开源项目

RxJava 与 Retrofit 结合的最佳实践
你真的会用Retrofit2吗?Retrofit2完全教程
从零开始开发一款Android App
Retrofit2与RxJava用法解析
Retrofit2 完全解析 探索与okhttp之间的关系
通过对流行的优质android开源项目分析、学习、仿写
开源选型之 Android 三大图片缓存原理、特性对比
Glide 一个专注于平滑滚动的图片加载和缓存库
Android实战之你应该使用哪个网络库?
okHttp,GreenDao,EventBus简单封装使用
Retrofit 入门教程
好用的网络请求库Retrofit2(入门及讲解)
安卓下拉刷新开源库对比
Volley+OkHttp3+Gson(Jackson)开源库的封装过程
如何更高效地使用 OkHttp
Glide 深入研究
Glide 系列使用教程
深入浅出 Retrofit,这么牛逼的框架你们还不来看看?

设计师

APP界面切图命名和文件整理规范
双管齐下:同时设计 iOS 和 Android

程序员的自我修养

原理

Android 插件化原理解析——Service的插件化
Android绘制流程
公共技术点之 View 绘制流程
Android热更新实现原理
Android源码分析-全面理解Context
Android杂谈–Activity、Window、View的关系
Android应用开发Scroller详解及源码浅析
Android应用开发之自定义View触摸相关工具类全解
理解Android安全机制
Android Scroller完全解析,关于Scroller你所需知道的一切
阅读Android源码的一些姿势
深入理解LayoutInflater.inflate()
关于获取当前Activity的一些思考
ViewAnimator源码分析
AsyncTask源码剖析

优化

给 App 提速:Android 性能优化总结
Android打包的那些事
加速你的Android应用
内存泄露从入门到精通三部曲之基础知识篇&version=11020201&pass_ticket=hgYTL4MW7%2FI9mnat%2BT9S2RRS0IkFfm6yOLSy%2F4bguL4%3D)
关于Android Log的一些思考
Android项目重构之路:架构篇
内存泄露从入门到精通三部曲之排查方法篇&version=11020201&pass_ticket=DhP26XYXJwz4Wb0cgRmjgcxeGfVbtRncCyGulGN45GY%3D)
内存泄露从入门到精通三部曲之常见原因与用户实践
10 条提升 Android 性能的建议
Android应用启动优化:一种DelayLoad的实现和原理
Android性能调优利器StrictMode
Android性能优化之被忽视的优化点
Android性能优化之如何避免Overdraw
Android 中 SQLite 性能优化
手机淘宝性能优化
手淘双十一系列(一) | 521 性能优化项目揭秘
Android退出应用最优雅的方式
Android 开发绕不过的坑:你的 Bitmap 究竟占多大内存?
BlockCanary — 轻松找出Android App界面卡顿元凶
使用pngquant来缩小你的APK
Android性能优化典范
Android UI性能优化详解
[个人总结]APK瘦身实践
Android中导致内存泄漏的竟然是它—-Dialog&version=11020201&pass_ticket=3czwvrJ0y4smIOu90jD4B8NFtnWfzwg%2FT2S2qlILyyY%3D)
优化 Android 线程和后台任务开发
Android 内存泄漏总结
Android APK终极瘦身21招
Android 内存泄漏案例和解析
Android开发——避免内存泄露

提高

包括65536原因、multidex解决、NoClassDefFoundError、Application Not Responding、App首次启动加载方案等
深入理解Android之AOP
移动端图片格式调研
如何选择 compileSdkVersion, minSdkVersion 和 targetSdkVersion
Android平台的崩溃捕获机制及实现
携程Android App插件化和动态加载实践
Binder学习指南
Android使用FFMpeg实现推送视频直播流到服务器
这里收集了大家常用的一些Android的模板代码
Android实现多次闪退清除数据
Android路由框架设计与实现
Android 插件化原理解析——插件加载机制
Android M 新的运行时权限开发者需要知道的一切
Android 插件化开发专题

新特性

8个类搞定插件化(上)
要做一个有冒险精神的人!开启漫漫的agera之旅
Android M新特性Doze and App Standby模式详解&version=11020201&pass_ticket=hgYTL4MW7%2FI9mnat%2BT9S2RRS0IkFfm6yOLSy%2F4bguL4%3D)
聊一聊Android 6.0的运行时权限
AppBar简述
AppBar的详解
Android 6.0: 动态权限管理的解决方案
Android 6.0 运行时权限处理完全解析
Android Support Library 23.2有哪些新东西
AndroidStudyDemo之Android4.x介绍
MVVM-DBinding
HotFix的抉择
没时间解释了,快使用Snackbar!——Android Snackbar花式使用指南

架构

浅析MVP中model层设计
Google官方MVP+Dagger2架构详解
Medium Android 客户端都使用了哪些开源项目?
英语流利说 Android 架构演进&version=11020201&pass_ticket=JtFbOWzVz0QaHe5dN1epxdryv2HEDINGpaqXxeWcwGI%3D)
google官方架构MVP解析与实战【从零开始搭建android框架系列(3)】
《程序员必读之软件架构》读书笔记
App架构设计经验谈:接口的设计
选择恐惧症的福音!教你认清MVC,MVP和MVVM
微信为啥这么省流量(技术宅入)
Android 项目重构之路:界面篇
各大热补丁方案分析和比较
用MVP架构开发Android应用
Android应用架构
说说Android的MVP模式
说说Android的MVP模式
几幅图MVC,MVP 和 MVVM框架一下子全明白了!
饿了么移动APP的架构演进
Android架构合集
Android应用架构
Android干净架构详解:为你的应用打造一个清爽的架构!
不要写死!天猫App的动态化配置中心实践&version=11020201&pass_ticket=k0qKNM4TZo426DYTd0YLgC8zV3UKUywv%2Fk7W7VEvbY8%3D)
Android App的设计架构:MVC,MVP,MVVM与架构经验谈
App架构经验总结
Android MVP架构中的Presentation层应该怎么设计
我的 Android 开发实战经验总结
微信Android客户端后台保活经验分享&version=11020201&pass_ticket=gGDjhIlTQ7vPThoj%2FZ5xrdCNNXWwfjAXhqZnbyhnJmQ%3D)
Android MVP 详解(上)
Android MVP 详解(下)
我眼中的Android架构
Android官方MVP架构示例项目解析
Android官方MVP架构示例项目解析
选择恐惧症的福音!教你认清MVC,MVP和MVVM
Android App的设计架构:MVC,MVP,MVVM与架构经验谈

适配

安卓分辨率的相关知识
安卓资源及适配的一些问题
AndroidAutoLayout:Android 屏幕适配方案

博客

leanote

官方学习网站/Wiki

Android Developer
Android Developer(无需梯子)
Android Training 中文版
Material Design 中文版
值得阅读的android技术文章
整理一些比较好的Android开发教程
2015年最新Android基础入门教程目录(完结版)

面试题

很详细的Android工程师面试题大全
Android 面试常见问题
衡量android开发者水平的面试问题
Activity LaunchMode 应用场景
Activity的LaunchMode应用场景思考
Android 编程下 Touch 事件的分发和消费机制
ndroid子线程真的不能更新UI么
程序员怎么获得高工资
Andorid-15k+的面试题。
笔试面试知识整理
Android开发知识清单整理
2016Android某公司面试题

开发工具

Android Studio 一些快捷键的整理,提高效率怎么能少得了这篇
使用原理视角看 Git
自己编写Android Studio插件 别停留在用的程度了
微信测试工程师手把手教你做弱网络模拟测试
深入浅出Android打包&version=11020201&pass_ticket=JtFbOWzVz0QaHe5dN1epxdryv2HEDINGpaqXxeWcwGI%3D)
如何调试Android Framework?
Android多渠道打包这样做才酸爽!?
Gradle 多渠道打包实践
闯过这 54 关,点亮你的 Git 技能树 (四)
IntelliJ IDEA 简体中文专题教程
日常使用 Git 的 19 个建议
Android Studio你不知道的调试技巧
Android单元测试研究与实践
闯过这 54 关,点亮你的 Git 技能树
android studio 64位手机+Fresco引起的在arm64位机器上找不到对应的so库
Android Studio上打的包在arm64位机器上找不到对应的so库
Android中使用Espresso进行UI测试
Git全解析之用起来先
Android Studio Gradle实践之多渠道自动化打包+版本号管理
优雅的Android Studio项目配置–常用库和版本管理
使用Android Studio查找文件中含有中文字符串位置
Android studio调试技巧
更优雅的 Android 发布自动版本号方案
这些小工具让你的Android开发更高效
企业级开发:Gitflow Workflow工作流
如何在Github打造你的爆款开源项目
MAT使用入门
Android自动清理无用资源工具
高效Android开发者必须知道的4个工具
Android Studio 配置
MAT - Memory Analyzer Tool 使用进阶

学习

AndroidStudyDemo项目介绍
Android程序员 如何入门iOS ——故事从这里开始
Android开发技术周报特刊之React Native
生还是死?Android 进程优先级详解
Kotlin for android developers》中文版翻译
定期翻译Android官方博客
android学习资料
10个很棒的学习Android 开发的网站
Android知识架构
开发艺术视频
Android开发书籍推荐:从入门到精通系列学习路线书籍介绍
一个老鸟发的公司内部整理的 Android 学习路线图 Markdown 版本

数据库

SQLite 大数据量 新增 / 修改 提升效率的办法
使用replace

安全

Android应用安全开发之源码安全
Android应用安全开发之防范无意识的数据泄露
Android应用安全开发之浅谈加密算法的坑&version=11020201&pass_ticket=AOchp9l%2F7Ug8gVFlX0%2BK1tAyLOPwStguLTy4jV5RBLc%3D)
手把手教你逆向分析 Android 程序

测试

测试技巧 – 你所不知道的测试黑科技
[团队分享]使用jenkins自动化构建android和ios应用
世界级的Android测试开发流程(一)
世界级的Android测试开发流程(二)
Roboletric探索之路,从抗拒到依赖
Android持续集成以及测试覆盖率可视化

sdk

sdk

适配

移动端适配方案(下)

管理

第三篇:规范开发篇
团队分享]如何更好的开发一个Android应用
Android技术积累:开发规范
聊聊创业团队的项目管理如何面向开发人员优化
Android 编码规范
Android技术积累:开发规范

客户端API请求规范
提升代码的可读性系列(一)–基础篇
API返回结果设计经验与总结

Reactnative

史上最详细Windows版本搭建安装React Native环境配置
React-Native入门指南
React Native 开发之 IDE 选型和配置

kotlin

kotlin学习资源整理
Kotlin for android developers
Building a Kotlin project 1/2
Building a Kotlin project 2/2
实战Kotlin@Andorid(二):界面构建与扩展方法

简历

程序员,你的简历应该这样弄
我敢保证,面试官想在简历里看到的其实是这些

网站

在线 API 文档、技术文档工具 ShowDoc

Java

java提高篇(四)—–抽象类与接口
线程、多线程与线程池总结
你离顶尖Java程序员,只差这11本书的距离
反射、注解与依赖注入总结
Java设计模式(十三) 别人再问你设计模式,叫他看这篇文章

内存优化

Android内存优化之OOM
Android 内存泄漏总结

产品

产品经理信息收集渠道大盘点

开源项目

13个开源项目集体登场,这是一场开源的技术盛宴!

源码解析

Retrofit2源码分析(一)
由浅入深全面剖析ThreadLocal
Android JNI原理分析
Binder 源码分析
Service源码解析
Android 深入理解Loader机制 让APP轻装上阵
Android JNI原理分析

Agera

Agera Wiki 中文版

Dagger2

Dagger 2: Step To Step

TODO 新技术
1.kotlin
2.Reace Native
3.swift
4.agera
5.databinding

Android的布局支持百分比的设置进行开发,来学习如何去实现它,不过看起来会像网页的设置,比如宽度的设置属性是layout_widthPercent。在此之前,我们一般都会设置Linearlayout的weight权重来实现布局间的比例大小。

阅读全文 »