Android开发笔记四

一、dp、sp和px

PX :像素点

dp:与像素相关的单位

sp:同dp,通常用来修饰文字

文字尺寸一律用sp,非文字一律使用dp。

偶尔使用px。例如需要在屏幕上画一条细的分割线:1px

(用

二、Inflater

inflater就相当于将一个xml中定义的布局找出来。

LayoutInflater

得到LayoutInflater的三种方法:

1、getLayoutInflater()

2、getSystemService(LAYOUT_INFLATER_SERVICE)

3、LayoutInflater.form(Context)

得到inflater后可以读视图:

View view = inflate(R.layout.xml文件,null)

得到视图后可以找控件:

view.findViewById()

三、提取布局的属性theme&style

theme是针对窗体级别的,改变窗体样式;

style是针对窗体元素级别的,改变指定控件或者Layout的样式。

抽象view的共同属性

可继承

在style.xml文件中可以自定义样式


Android开发笔记四_第1张图片
红色全出来是自定义部分


Android开发笔记四_第2张图片
红色部分是引用的地方

四 View学习


View是如何工作的

第一步 view构造器 初始化

在新建的view类中要添加构造器并且在构造器中要初始化

在下图是在View构造器中进行初始化

Android开发笔记四_第3张图片

第二步 用onMesure()定大小

第三步用onLayout()定位置

第四步用onDraw()绘制

第五步用invalidate()刷新

五 自定义控件的形式

继承已有的控件来实现自定义控件

通过继承一个布局文件实现自定义控件

同继承view类来实现自定义控件

开发自定义控件的步骤:

1、了解View的工作原理

2、 编写继承自View的子类

3、 为自定义View类增加属性

4、 绘制控件

5、 响应用户消息

6 、自定义回调函数

六 Fragment学习

1、Fragment 相当于模块化的一段activity

2、具有自己的生命周期,接收自己的事件

3、在activity运行时被添加或删除

七 Handler学习

1、Handler

当应用程序启动时,Android首先会开启一个主线程(也就是UI线程),主线程为管理界面中的UI控件,进行事件分发。

主要接受子线程发送的数据, 并用此数据配合主线程更新UI。

当应用程序启动时,Android首先会开启一个主线程 (也就是UI线程) , 主线程为管理界面中的UI控件, 进行事件分发, 比如说, 你要是点击一个 Button ,Android会分发事件到Button上,来响应你的操作。  如果此时需要一个耗时的操作,例如: 联网读取数据,或者读取本地较大的一个文件的时候,你不能把这些操作放在主线程中,如果你放在主线程中的话,界面会出现假死现象, 如果5秒钟还没有完成的话,会收到Android系统的一个错误提示  "强制关闭"。  这个时候我们需要把这些耗时的操作,放在一个子线程中,因为子线程涉及到UI更新,Android主线程是线程不安全的, 也就是说,更新UI只能在主线程中更新,子线程中操作是危险的。 这个时候,Handler就出现了,来解决这个复杂的问题,由于Handler运行在主线程中(UI线程中),它与子线程可以通过Message对象来传递数据, 这个时候,Handler就承担着接受子线程传过来的(子线程用sedMessage()方法传弟)Message对象,(里面包含数据),把这些消息放入主线程队列中,配合主线程进行更新UI。

用handler发送消息,首先先取得一个Message,然后对里面的参数进行赋值,然后用handler的sendMessageDelayed将message延迟发送。

Android开发笔记四_第4张图片

发送出去消息后,然后用handleMessage接收消息,判断what来识别是哪一个message,然后对消息进行出处理。

Android开发笔记四_第5张图片

2、Message和MessageQueue(消息队列)

Message:消息,其中包含了消息ID,消息处理对象以及处理的数据等,由MessageQueue统一列队,终由Handler处理。

MessageQueue:消息队列,用来存放Handler发送过来的消息,并按照FIFO规则执行。当然,存放Message并非实际意义的保存,而是将Message以链表的方式串联起来的,等待Looper的抽取。

3、Looper(消息泵)

Looper:消息泵,不断地从MessageQueue中抽取Message执行。因此,一个MessageQueue需要一个Looper。

Thread:线程,负责调度整个消息循环,即消息循环的执行场所。

你可能感兴趣的:(Android开发笔记四)