android 界面設計基本知識Ⅱ

上一章講述了Android界面設計時,一些基本控件的使用,本章主要講述自定義控件,Fragment和Headler線程機制。android

1.自定義控件

(1)基本知識數據結構

      dp、sp和dx
      px:像素點
     dp:與像素密度密切相關
     sp:至關於dp,修飾文字專用
    dip:至關於dp多線程

   用法:
    文字尺寸一概用sp
    非文字尺寸一概用dp
   偶爾須要用px 例如:在屏幕上畫細的分割線 1px異步

  當一個控件不在右側預覽視圖裏面顯示的時候是由於控件沒有明確的位置,須要設置一個位置以後才能正常顯示ide

構造器初始化 :模塊化

  1. onMesure() 定大小
  2. onLayout() 定位置
  3. onDraw() 繪製
  4. invalidate() 刷新

自定義控件的三種主要建立形式:oop

  1. 繼承已有的控件來實現自定義控件,如 Button、 CheckedTextView;
  2. 經過繼承一個佈局文件實現自定義控件,如RelativeLayout;
  3. 經過繼承view類來實現自定義控件。

(2)提取佈局屬性 theme & style佈局

  1. Theme是針對窗體級別的,改變窗體樣式;Style 是針對窗體元素級別的,改變指定控件或者Layout的樣式;
  2. 抽象view的共同屬性;
  3. 可繼承

對於定製一個自定義控件,可經過以下步驟:動畫

(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文件中定義的屬性-->

2.Fragment

(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切換的動畫效果

3.Headler多線程與異步

(1)Handler用來作什麼?

  1. 定時執行Message和MessageQueue;
  2. 在不一樣線程中執行Runnable。

(2)Handler怎麼使用?

  1. obtainMessage() //取得消息
  2. sendMessage() //發送消息
  3. 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方法。

相關文章
相關標籤/搜索