1. 程式人生 > >Android常用控制元件,用執行緒寫一個進度條。

Android常用控制元件,用執行緒寫一個進度條。

一、事件監聽(三種寫法)

1、標籤上直接繫結監聽方法
      public void xxx(View view)

2、 建立監聽器物件,元件再繫結監聽器物件
2.1、匿名內部類

2.2、使用匿名內部類並定義成全域性的屬性

二、文字框(TextView)

1、TextView直接繼承View,作用就是在介面上顯示文字(類似於Swing中的JLabel),同時它還是EditText、Button兩個UI元件類的父類。另外Android關閉了它的文字編輯功能,如果想編輯內容,則可以使用EditText。

2、常用屬性

①、text

②、 autoLink

③、 singleLine(已過時,現在應為:android:lines)

④、 lines

⑤、 minLines

⑥、 textColor

⑦、 textSize

⑧、 textStyle :字型風格粗體、斜體

⑨、 backgroud :設定背景,可以是顏色或圖片

⑩、 drawableXX 設定文字的icon

⑪、 ellipsize 當文字長度超過textview寬度時的顯示方式 
         android:ellipsize="start"      省略號顯示在開頭 "...pedia"
         android:ellipsize="end"        省略號顯示在結尾  "encyc..."
         android:ellipsize="middle"     省略號顯示在中間 "en...dia"
         android:ellipsize="marquee"    以橫向滾動方式顯示(另外還需要設定其它三個屬性,否則不滾動,即必須讓該控制元件獲得焦點)


3、編輯框(EdiText)

(1)、EditText和TextView非常相似,它與TextView共用了絕大總分XML屬性和文法,
      二者最大區別在於:EditText可以接受使用者輸入。

(2)、常用屬性:

①、inputType:它是EditText元件最重要的屬性,它相當於HTML中<input>標籤的type屬性,用於EditText指定輸入元件的型別。
       常用取值有:number|numberPassword|date|phone

②、hint:提示字元資訊

三、Toast(吐絲框)

1、Toast是Android中的一種簡易的訊息提示框(注意使用網格佈局:LinearLayout)

在activity_main.xml裡面配佈局,如下:


<Button
        android:layout_width="match_parent"
        android:onClick="studyToast"
        android:text="點選彈出框"
        android:layout_height="wrap_content" />

2、使用這個類的最簡單的方法是呼叫靜態方法構造您所需要的一切,並返回一個新的Toast物件。
Toast toast=Toast.makeText(getApplicationContext(), "預設的Toast", Toast.LENGTH_SHORT);
toast.show(); 
第一個引數:當前的上下文環境。可用getApplicationContext()或this 
第二個引數:要顯示的字串。也可是R.string中字串ID 
第三個引數:顯示的時間長短。Toast預設的有兩個LENGTH_LONG(長)和LENGTH_SHORT(短),也可以使用毫秒如2000ms 

public void studyToast(View view) {
        Toast.makeText(this, "你好,Toast", Toast.LENGTH_SHORT).show();
}

四、ImageView

1、注意事項:res下面的資源名不能使用大寫字母,特別是圖片資源中的圖片的檔名,會造成R.java檔案丟失,改正確後即可
例如:smallImage.png錯誤,small_image.png正確

2、scaleType(縮放型別)

(1)、scaleType的屬性值有:matrix   fitXY  fitStart   fitCenter  fitEnd  center   centerCrop  centerInside 

①、matrix 用矩陣來繪製(從左上角起始的矩陣區域)
②、fitXY  不按比例縮放圖片,目標是把整個圖片塞滿整個View
③、fitStart  把圖片按比例擴大或縮小到View的[[[寬度]]],然後置頂部顯示(圖片會完整顯示)
④fitCenter  把圖片按比例擴大或縮小到View的[[[寬度]]],然後居中顯示(圖片會完整顯示)
⑤、fitEnd   把圖片按比例擴大或縮小到View的[[[寬度]]],然後置底部顯示(圖片會完整顯示)
⑥、center  不縮放,將圖片按原來大小居中顯示,當圖片寬高超過View的寬高時,則擷取圖片的居中部分顯示
⑦、centerCrop  按比例擴大(或縮小)圖片的size居中顯示,使得圖片的長寬的[[[等於或大於]]]View的長寬
⑧、centerInside  按比例擴大(或縮小)圖片的size居中顯示,使得圖片的長寬的[[[等於或小於]]]View的長寬 (圖片會完整顯示) 

ps:用得最多還是fitXY fitStart fitCenter fitEnd,預設是fitCenter

2、 scaleType屬性分二種情況分析

①、 圖片比ImageView小(android08_widget03_d01_v1)

<ImageView
            android:layout_width="50dp"
            android:layout_height="50dp"
            android:layout_marginRight="10dp"
            android:background="#FF0000"
            android:scaleType="matrix"
            android:src="@drawable/small_image" />

②、圖片比ImageView大(android08_widget03_d01_v2)

<ImageView
        android:layout_width="100dp"
        android:background="@color/colorAccent"
        android:src="@drawable/small_image"
        android:scaleType="matrix"
        android:layout_height="100dp" />

五、ProgressBar(進度條)

1、常用屬性

//預設為圓形 
style="?android:attr/progressBarStyleHorizontal" 
//進度條的進度
android:progress="33"
//進度條最大值
android:max="100" 

2、執行緒休眠

①、Thread.sleep(100);//拋異常

②、SystemClock.sleep(100);//不拋異常

3、執行緒注意事項: 
不能在主執行緒中執行耗時的操作,只能在子執行緒中操作 
另外,在子執行緒中不能操作主執行緒中的控制元件(ProgressBar除外)

eg、SubThread->MainThread    錯誤

SubThread->Handler->MainThread 正確

4、用執行緒寫一個進度條

      在activity_main_xml裡的佈局:

<FrameLayout
        android:layout_width="match_parent"
        android:layout_height="60dp">
        <TextView
            android:id="@+id/tv_main_tv1"
            android:textColor="@color/red"
            android:textSize="80dp"
            android:layout_width="90dp"
            android:layout_height="match_parent" />
        <ProgressBar
            android:id="@+id/pb_main_pb1"
            android:layout_width="match_parent"
            style="?android:attr/progressBarStyleHorizontal"
            android:max="100"
            android:layout_height="60dp" />
</FrameLayout>


<Button
        android:id="@+id/btn_main_btn1"
        android:layout_width="match_parent"
        android:text="啟動進度條"
        android:onClick="setProgressBar"
        android:layout_height="wrap_content" />

      MainActivity.java裡面的方法

public class MainActivity extends AppCompatActivity {
    //初始化進度條 
    private ProgressBar pb_main_pb1;
    private int prosess;
    private TextView tv_main_tv1;
    private MyHandler myHandler = new MyHandler();
    private int code = 1;

    private class MyHandler extends Handler{
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            if(code == msg.what){
                prosess ++;
                pb_main_pb1.setProgress(prosess);
                tv_main_tv1.setText(prosess + "%");

            }
        }
    }


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        pb_main_pb1 = this.findViewById(R.id.pb_main_pb1);
        tv_main_tv1 = this.findViewById(R.id.tv_main_tv1);
    }
    //啟動進度條
    public void setProgressBar(View view) {
        //判斷進度條為0時方可啟動
        if(0==prosess){
            new MyThread().start();
        }
    }

    //編寫子執行緒  進行具體操作
    public class MyThread extends Thread{
        @Override
        public void run() {
            super.run();
            while (true){
                //設定休眠時間
                try {
                    Thread.sleep(100);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                //判斷進度條的進度  如果執行完了 恢復原來的進度
                if(prosess == 100){
                    prosess = 0;
                    break;
                }
                //觸發Handler  將子執行緒的請求通過Handler傳送給主執行緒
                Message msg = new Message();
                //為了方便多個執行緒同時進行
                msg.what = 1;
                myHandler.sendMessage(msg);

            }
        }
    }