上一章讲述了Android界面设计时,一些基本控件的使用,本章主要讲述自定义控件,Fragment和Headler线程机制。
1.自定义控件
(1)基本知识
dp、sp和dx
px:像素点
dp:与像素密度密切相关
sp:相当于dp,修饰文字专用
dip:相当于dp
用法:
文字尺寸一律用sp
非文字尺寸一律用dp
偶尔需要用px 例如:在屏幕上画细的分割线 1px
当一个控件不在右侧预览视图里面显示的时候是因为控件没有明确的位置,需要设置一个位置之后才能正常显示
构造器初始化 :
- onMesure() 定大小
- onLayout() 定位置
- onDraw() 绘制
- invalidate() 刷新
自定义控件的三种主要创建形式:
- 继承已有的控件来实现自定义控件,如 Button、 CheckedTextView;
- 通过继承一个布局文件实现自定义控件,如RelativeLayout;
- 通过继承view类来实现自定义控件。
(2)提取布局属性 theme & style
- Theme是针对窗体级别的,改变窗体样式;Style 是针对窗体元素级别的,改变指定控件或者Layout的样式;
- 抽象view的共同属性;
- 可继承
对于定制一个自定义控件,可通过如下步骤:
(1)基本属性定义在一个配置文件中attrs.xml :
<?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类:
1 package com.example.chenjinhua.redcircle;
2
3 import android.content.Context;
4 import android.graphics.Canvas;
5 import android.graphics.Color;
6 import android.graphics.Paint;
7 import android.graphics.Rect;
8 import android.util.AttributeSet;
9 import android.view.View;
10
11 public class DrawRedCircleView extends View implements View.OnClickListener{
12 private Paint mPaint;
13 private Rect mRect;
14 private int mNumber = 20;
15
16 public DrawRedCircleView(Context context) {
17 this(context, null);
18 }
19
20 public DrawRedCircleView(Context context, AttributeSet attrs) {
21 this(context, attrs, 0);
22 }
23
24 public DrawRedCircleView(Context context, AttributeSet attrs, int defStyleAttr) {
25 super(context, attrs, defStyleAttr);
26 init();
27 }
28
29 private void init() {
30 mPaint = new Paint();
31 mRect = new Rect();
32 }
33
34 @Override
35 protected void onDraw(Canvas canvas) {
36 super.onDraw(canvas);
37 mPaint.setColor(Color.RED);
38 canvas.drawCircle(getWidth() / 2, getWidth() / 2, getWidth() / 2, mPaint);
39
40 mPaint.setColor(Color.WHITE);
41 mPaint.setTextSize(100);
42 String textNumber = String.valueOf(mNumber);
43 mPaint.getTextBounds(textNumber,0,textNumber.length(),mRect);
44 int textWidth = mRect.width();
45 int textHight = mRect.height();
46 canvas.drawText(textNumber,getWidth()/2 - textWidth/2,getWidth()/2 + textHight/2,mPaint);
47
48 View view = findViewById(R.id.redCircle_view);
49 view.setOnClickListener(this);
50
51 }
52
53 @Override
54 public void onClick(View view) {
55 if ( mNumber > 0 ){
56 mNumber --;
57 }else{
58 mNumber = 20;
59 }
60 invalidate();
61 }
62 }
自定义控件类
(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类中定义和使用
2.Fragment
(1)什么是Fragment
Fragment是activity界面中的一部分,多个Fragment组合到一个activity中。多个activity中可重用一个Fragment。
Fragment相当于模块化一个activity具有自己的生命周期,接收自己的事件,在activity运行时被添加或删除。
(2)为什么要使用Fragment
支持更动态更灵活的界面设计,在平板上的应用(左边列表,右边新闻)Activity的layout分成Fragment。
aaarticlea/png;base64,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" alt="" />
(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切换的动画效果
3.Headler多线程与异步
(1)Handler用来做什么?
- 定时执行Message和MessageQueue;
- 在不同线程中执行Runnable。
(2)Handler怎么使用?
- obtainMessage() //取得消息
- sendMessage() //发送消息
- handlerMessage() //处理消息
(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方法。