1,GDI介绍
2,UI绘制流程
3.自定义控件的实现
GDi(Graphics Device interface)及时图形设备接口,它的主要任务是用来系统与绘图程序之间的信息交互
Android的GDI在上层为Gui提供一个抽象的概念,GDI输出抽象成了文本,画笔,位图操作等设备无关的操作,让应用程序只需要面向逻辑的设备的上下文进行输出操作,而不要涉及设备的输出设备,以及输出边界的管理,GDI负责将文本,线条位图概念对象映射到具体的物理设备.
2.UI绘制流程
Android系统中,View指的是widget,也可以称为控件,View可以分为三种,基本的View,容器View,布局View
典型的View 如:ImageView TextView
容器类的View 如:ListView ,GridView ViewGroup
布局类的View 如:FrameLayout GridView LineaLayout
1.AndroidActivityManagerService 创建Activity线程,激活一个Activity
2.系统调用Instrumentation.newActivtity创建一个线程
3.Activity创建后,关联一个新创建的phonewindow中,这样Activity获取唯一 的一个WindowManager服务的实例,该实例就是ActivityView的实例
4.Activity创建的过程中使用setContentView来设置用户UI,这些View 被加入到PhoneWindow的ContentParent中
5.Activity线程线程继续执行,当执行Activity.makeVisible是将根view DecoView加入到WindowsManager中,windowsManger会为每个DecoView创建对应的ViewRoot .
6.每个ViewRoot拥有一个Surface,每个Surface将会调用底层库创建图形绘制的内存空间,这个底层库就是SurfaceFlingger,Surface将会负责将整个View整合到一块儿(按照Z轴现实到屏幕)
7.如果用户直接在Canvas上绘制,实际上它直接操作Surface,但对每个View的变更,它要通知到ViewRoot,然后ViewRoot获取Canvas,如果绘制成功则会通知SurfaceFlinger,合并Surface到Surface设备屏幕
自定义控件的实现
1,继承已有的控件,实现控件的自定义
主要是实现一个控件和已有控件在很多方面的比较类似,通过对控件的拓展就可以满足需求
2.通过继承一个布局来实现控件的自定义
一般来说做组合控件的时候可以通过这个方式来实现
3.通过继承View类来实现控件的自定义
无法通过上述的两种方式来实现的时候可以考虑这个 方法
详细讲解下通过继承一个布局来实现控件的自定义
如果需要在XML文件里面与控件的属性进行绑定,这个时候要在values/attrs.xml 文件里面对控件的属性进行声明
<declare-styleable name=“progress”> //控件名字
<attr name=“text”format=“string”/> //属性名和类型
<attr name="titleSize"format="dimension"/>
</declare-styleable>
声明后就可以再其的构造方法里面对其进行加载,此时,加载XML属性:
TypedArray attr = context.obtainStyledAttributes(attrs, R.styleable.progress); //
加载属性集
attr.getString(R.styleable.progress_text) //这个地方是对特定的属性的读取。
在读取完成之后可以对其进行使用
另外在应用的时候要注意命名空间的问题
<com.eoe.control.view.progressBar
xmlns:progress="http://schemas.android.com/apk/res/com.eoe.control"
android:id="@+id/my_progressBar"
android:layout_width="fill_parent" android:layout_height="wrap_content"
progress:text="我是自定义的" progress:titleSize="30sp">
</com.eoe.control.view.progressBar>