### Android应用界面 ###
- 视图组件与容器组件
- Android 应用的绝大部分UI 组件都放在android. widget 包及其子包、android.view 包及其子包中, Android 应用的所有UI 组件都继承了View 类
- View 类还有一个重要的子类: ViewGroup , 但ViewGroup 通常主要作为其他组件的容器使用。但由ViewGroup 是一个抽象类,因此实际使用中通常总是使用ViewGroup的子类来作为容器,例如各种布局管理器。
- Android 的所有UI 组件都是建立在View 、VtewGroup 基础之上的, Android 采用了“组合器”设计模式来设计View 和ViewGroup: ViewGroup 是View 的子类,因此ViewGroup 也可被当成View 使用。对于一个Android 应用的图形用户界面来说, ViewGroup 作为容器来盛装其他组件, 而ViewGroup 里除了可以包含普通View 组件之外, 还可以再次包含VtewGroup 组件。
- Android 推荐使用XML布局文件来定义用户界面,而不是使用Java 代码来开发用户界面;大部分时候,控制UI组件的XML 属性都有对应的方法。如果希望在代码中控制UI界面, 那么所有UI组件都将通过new 关键字创建出来, 然后以合适的方式“ 搭建” 在一起即可。
- ViewGroup 容器控制其子.组件的分布依赖于ViewGroup.LayoutParams、ViewGroup.MarginLayoutParams 两个内部类。
- ViewGroup.LayoutParams 所支持的两个XML 属性。
- android: layout_ height、android:layout_ wid由两个属性
- VtewGroup.MarginLayoutParams 用于控制子组件周围的页边距( Margin, 也就是组件四周的留自〉,XML文件中属性为android: layout_ marginBottom、android: layout_ marginLeft、android: layout_ marginRight、android:layout_marginTop
- 自定义view
android在绘制view前,也必须对view进行测量,即告诉系统该画一个多大的view,该过程是在onMeasure()方法中进行,测量好一个view ,就可以在界面绘制相应的图像,就必须在Canvas上进行绘制,Canvas就像是一个画板,使用Paint就可以在画板上作画,这通常需要通过继承View并重写onDraw()方法;而且,在自定义view时,通常会重写onDraw()方法来绘制view显示的内容,如果该view还需要wrap_content属性,那么必须重写onMeasure()方法,另外,通过自定义attrs属性,还可以设置新的属性配置值。
- 通常需要重写的方法
- 构造器: 重写构造器是定制View 的最基本方式, 当Java 代码创建一个View 实例,或根据XML布局文件加载并构建界面时将需要调用该构造器。
- onFinishInflate():这是一个回调方法,当应用从XML布局文件加载该组件并利用它来构建界面之后,该方法将会被回调。
- onMeasure(int,int:调用该方法来检测View 组件及其所包含的所有子组件的大小。
- onLayout(boolean, int,int,int,int):当该组件需要分配其子组件的位置、大小时,该方法就会被回调。
- onSizeChanged(int,int,int,int): 当该组件的大小被改变时回调该方法。
- onDraw(Canvas): 当该组件将要绘制它的内容时回调该方法进行绘制。
- onKeyDown(int,KeyEvent): 当某个键被按下时触发该方法。
- onKeyUp(int, KeyEvent): 当松开某个键时触发该方法。
- onTrackballEvent(MotionEvent): 当发生轨迹球事件时触发该方法。
- onTouchEvent(MotionEvent): 当发生触摸屏事件时触发该方法。
- onFocusChanged(boolean gain Focus, int direction, Rect previouslyFocusedRect):当该组件焦点发生改变时触发该方法。
- onWindowFocusChanged(boolean): 当包含该组件的窗口失去或得到焦点时触发该方法。
- onAttachedToWindow(): 当把该组件放入某个窗口时触发该方法。
- onDetachedFromWindow(): 当把该组件从某个窗口上分离时触发该方法。
- onWindowVisibilityChanged(int): 当包含该组件的窗口的可见性发生改变时触发该方法。
ps:以上的方法,并不是所有的方法都需要重写,根据业务需要重写部分方法即可
- 自定义View三种情况
1. 对现有控件进行拓展
- 在原生控件的基础上进行拓展,增加新的功能,修改显示的UI等,一般可以再onDraw()方法中对原生控件行为进行拓展
- 程序在调用`super.onDraw(canvas);`来实现原生控件的功能,但是在调用`super.onDraw(canvas);`之前和之后,都可以实现自己的逻辑,比如自定义一个拓展于原生的TextView的TextView,如下代码
```
@Override
protected void onDraw(Canvas canvas) {
//在回调父类方法前,实现自己的逻辑,对TextView 来说即是在绘制文本内容前
super.onDraw(canvas);
//在回调父类方法前,实现自己的逻辑,对TextView 来说即是在绘制文本内容后
}
```
2. 通过组合来实现新的控件
- 这种方式通常需要继承一个合适的ViewGroup,再给它添加指定功能的控件,从而组合成新的复合控件。这种方式创建的控件,一般我们给它指定一些可配置的属性,让它具有更强的拓展性;为一个View 提供可自定义的属性非常简单,只需要在res 资源目录的values 目录下创建一个attrs.xmll 的属性定义文件,并在该文件中通过相应的代码定义相应的属性即可。即:只需要在res 资源目录的values 目录下创建一个attrs.xmll 的属性定义文件,并在该文件中通过相应的代码定义相应的属性即可。在代码中通过<declare-styleable>标签声月了使用了自定义属性,并通过name 属性来确定引用的名称。最后,通过<attr〉标签来声明具体的自定义属性
3. 重写View来实现全新的控件
- 创建一个全新的自定义View了,难点在于绘制控制控件和实现交互,通常需要继承View类,并重写它的onDraw()、onMeasure()等方法实现绘制逻辑,同时通过重写onTouchEvent()等触控事件来实现交互逻辑,还可以引入自定义属性,丰富自定义View的可定制性。
- 自定义viewGroup
- ViewGroup 存在的目的就是为了对其子View 进行管理,为其子View 添加显示、响应的规则。因此,自定义ViewGroup 通常需要重写onMeasure()方法来对子View 进行测量,重写onLayout()方法来确定子View 的位置,重写onTouchEvent()方法增加响应事件。
- 布局管理器
![](http://i.imgur.com/qsVNQTi.jpg)
- 从上图 可以看出, 所有布局都可作为容器类使用, 因此可以调用多个重载的addViewO 向布局管理器中添加组件。实际上, 我们完全可以用一个布局管理器嵌套到其他布局管理器中一一因为布局管理器也继承了View , 也可以作为普通UI 组件使用。
- 线性布局
- Android 的线性布局不会换行,当组件一个挨着一个地排列到头之后, 剩下的组件将不会被显示出来。
- 使用9patch图片作为背景
- 为什么用9patch图片?
- 当按钮的内容太多或者按钮宽度为match_content填充父布局,或者按钮的背景图片的大小和按钮定义的宽度高度大小不匹配时, Android 会自动缩放整张图片,以保证背景图片能覆盖整个按钮。但这种缩放整张图片的效果可能并不好。可能存在的情况是我们只想缩放图片中某个部分, 这样才能保证按钮的视觉效果。
- 作用:实现只缩放图片中某个部分的效果
- 介绍
- 9Patch 图片是一种特殊的PNG图片, 这种图片以.9 .png 结尾, 它在原始图片四周各添加一个宽度为1像素的线条,这4 条线就决定了该图片的缩放规则、内容显示规则。
- 左侧和上侧的直线共同决定了图片的缩放区域: 以左边直线为左边界绘制矩形, 它覆盖的区域可以在纵向上缩放; 以上面直线为上边界绘制矩形,它覆盖的区域可以水平缩放; 它们二者的交集可以在两个方向上缩放。下图中的四周粉色的小矩形区域就是图片缩放区域。、
![](http://i.imgur.com/hhpTGtz.png)
- 右侧和下侧的直线共同决定图片的内容显示区域: 以右边直线为右边界绘制矩形,以下边直线为下边界绘制矩形, 它们二者的交集就是图片的内容显示区域。下图中的紫色的文本矩形局域就是图片的内容显示区域的示意图。
![](http://i.imgur.com/EKpJ9VT.png)
- ![](http://i.imgur.com/mJn2XhB.png)
- XML Nine-Patch
- 一个XML Nine-Patch是一种在XML中定义的资源,指向一个Nine-Patch文件。XML可以为图像指定抖动。
- 文件位置:res/drawable/filename.xml
- 语法
- ![](http://i.imgur.com/9RYxgQS.png)、
- xmlns:android----字符串。必备。定义 XML 命名空间,其必须是 `"http://schemas.android.com/apk/res/android"。`
- android:src----可绘制对象资源。必备。引用九宫格文件。
- android:dither----布尔值。当位图的像素配置与屏幕不同时(例如:ARGB 8888 位图和 RGB 565 屏幕),启用或停用位图抖动。
- 前言
- Android系统的体系结构
- Dalvik VM 和 JVM 的比较
- Android 打包应用程序并安装的过程
- Android ADB工具
- Android应用开发
- Android UI相关知识总结
- Android 中window 、view、 Activity的关系
- Android应用界面
- Android中的drawable和bitmap
- AndroidUI组件adapterView及其子类和Adapter的关系
- Android四大组件
- Android 数据存储
- SharedPreference
- Android应用的资源
- 数组资源
- 使用Drawable资源
- Material Design
- Android 进程和线程
- 进程
- 线程
- Android Application类的介绍
- 意图(Intent)
- Intent 和 Intent 过滤器(Google官网介绍)
- Android中关于任务栈的总结
- 任务和返回栈(官网译文)
- 总结
- Android应用安全现状与解决方案
- Android 安全开发
- HTTPS
- 安卓 代码混淆与打包
- 动态注入技术(hook技术)
- 一、什么是hook技术
- 二、常用的Hook 工具
- Xposed源码剖析——概述
- Xposed源码剖析——app_process作用详解
- Xposed源码剖析——Xposed初始化
- Xposed源码剖析——hook具体实现
- 无需Root也能Hook?——Depoxsed框架演示
- 三、HookAndroid应用
- 四、Hook原生应用程序
- 五、Hook 检测/修复
- Android 应用的逆向与加固保护技术
- OpenCV在Android中的开发
- Android高级开发进阶
- 高级UI
- UI绘制流程及原理
- Android新布局ConstraintLayout约束布局
- 关键帧动画
- 帧动画共享元素变换
- Android异步消息处理机制完全解析,带你从源码的角度彻底理解
- Android中为什么主线程不会因为Looper.loop()里的死循环卡死?
- 为什么 Android 要采用 Binder 作为 IPC 机制?
- JVM 中一个线程的 Java 栈和寄存器中分别放的是什么?
- Android源码的Binder权限是如何控制?
- 如何详解 Activity 的生命周期?
- 为什么Android的Handler采用管道而不使用Binder?
- ThreadLocal,你真的懂了吗?
- Android屏幕刷新机制