上一章讲述了Android界面设计时,一些基本控件的使用,本章主要讲述自定义控件,Fragment和Headler线程机制。android
(1)基本知识数据结构
dp、sp和dx
px:像素点
dp:与像素密度密切相关
sp:至关于dp,修饰文字专用
dip:至关于dp多线程
用法:
文字尺寸一概用sp
非文字尺寸一概用dp
偶尔须要用px 例如:在屏幕上画细的分割线 1px异步
当一个控件不在右侧预览视图里面显示的时候是由于控件没有明确的位置,须要设置一个位置以后才能正常显示ide
构造器初始化 :模块化
自定义控件的三种主要建立形式:oop
(2)提取布局属性 theme & style布局
对于定制一个自定义控件,可经过以下步骤:动画
(1)基本属性定义在一个配置文件中attrs.xml :this
<?xml version="1.0" encoding="utf-8"?> <resources> //类 <declare-styleable name="ViewTest"> //每个attr都是一个属性,每一个属性都有一个format <attr name="backgroundColor" format="color"/> <attr name="textColor" format="color"/> <attr name="textSize" format="dimension"/> </declare-styleable> </resources>
(2)定义一个控件View类:
(3)视图页面引用:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" //添加自定义命名空间 xmlns:jinhua="http://schemas.android.com/apk/res-auto" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <!--引用自定义的控件--> <com.example.chenjinhua.thirdweek.ViewTest android:layout_width="300dp" android:layout_height="300dp" jinhua:backgroundColor="@color/colorAccent" jinhua:textSize="18dp"/><!--attrs文件中定义的属性-->
</LinearLayout>
(4)Activity类中定义和使用<!--attrs文件中定义的属性-->
(1)什么是Fragment
Fragment是activity界面中的一部分,多个Fragment组合到一个activity中。多个activity中可重用一个Fragment。
Fragment至关于模块化一个activity具备本身的生命周期,接收本身的事件,在activity运行时被添加或删除。
(2)为何要使用Fragment
支持更动态更灵活的界面设计,在平板上的应用(左边列表,右边新闻)Activity的layout分红Fragment。
(3)Fragmet应用
getSupportFragmentManager().beginTransaction().
setCustomAnimations(R.anim.slide_in_from_right, R.anim.slide_out_to_left).
replace(R.id.fl_content, new ReadCardFragment(), "latest").
commit();
//setCustomAnimations:指定Fragment切换的动画效果
(1)Handler用来作什么?
(2)Handler怎么使用?
(3)Handler基本使用方法:
Handler myHandler = new Handler() {
public void handleMessage(Message msg) {
switch (msg.what) {
case TestHandler.GUIUPDATEIDENTIFIER:
myBounceView.invalidate();
break;
}
super.handleMessage(msg);
}
};
class myThread implements Runnable {
public void run() {
while (!Thread.currentThread().isInterrupted()) {
Message message = new Message();
message.what = TestHandler.GUIUPDATEIDENTIFIER;
TestHandler.this.myHandler.sendMessage(message);
try {
Thread.sleep(100);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
}
}
}
在android中提供了一种异步回调机制Handler,使用它,咱们能够在完成一个很长时间的任务后作出相应的通知。
在主线程中,使用handler很简单,new一个Handler对象实现其handleMessage方法,在handleMessage中提供收到消息后相应的处理方法便可。
使用myThreadHandler.sendEmptyMessage(0);发送一个message对象,那么Handler是如何接收该message对象并处理的呢?以下数据结构图:
从这个图中咱们很清楚能够看到调用sendEmptyMessage后,会把 Message对象放入一个MessageQueue队列,该队列属于某个Looper对象,每一个Looper对象经过 ThreadLocal.set(new Looper())跟一个Thread绑定了,Looper对象所属的线程在Looper.Loop方法中循环执行从MessageQueue队列读取 Message对象,并把Message对象交由Handler处理,调用Handler的dispatchMessage方法。