1. 程式人生 > >常用控制元件02(圖片框與進度條)

常用控制元件02(圖片框與進度條)

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

//在activity_main.xml裡
<Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="myToast"
        />
        //在MainActivity.java裡
       public void myToast(View view) {
        Toast.makeText(this,"haha",Toast.LENGTH_LONG).show();
    } 
  1. ImageView 2.0 注意事項:res下面的資源名不能使用大寫字母,特別是圖片資源中的圖片的檔名,會造成R.java檔案丟失,改正確後即可 例如:smallImage.png錯誤,small_image.png正確

    2.1 scaleType(縮放型別) 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的長寬 (圖片會完整顯示)

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

    scaleType屬性分二種情況分析 1.1.1 圖片比ImageView小(android08_widget03_d01_v1)

<ImageView
        android:layout_width="100dp"
        android:background="@color/red"
        android:src="@drawable/small_image"
        android:scaleType="matrix"
        android:layout_height="100dp"
        />
  1. 進度條 ProgressBar 3.1 常用屬性 style=”?android:attr/progressBarStyleHorizontal” 預設為圓形 android:progress=”33” android:max=”100”

    執行緒休眠 Thread.sleep(100);//拋異常 SystemClock.sleep(100);//不會拋異常

    //在activity_main.xml裡
<ProgressBar
        android:id="@+id/main_btn_pb1"
        android:layout_width="match_parent"
        style="?android:attr/progressBarStyleHorizontal"//預設為圓形的進度
        android:layout_height="60dp"/>

        <Button
        android:id="@+id/main_btn_btn1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="2"
        android:onClick="mypb" />

//在MainActivity.java裡
private ProgressBar main_btn_pb1;
private int progress;

private class MyThread extends Thread{
        @Override
        public void run() {
            super.run();
            while(true){
                try {
                    Thread.sleep(100);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                if(progress==100){
                    progress=0;
                    break;
                }
                progress++;
                main_btn_pb1.setProgress(progress);
                }
        }
    }

 public void mypb(View view) {
        if(0==progress){
            new MyThread().start();
        }
    }

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

 SubThread->MainThread    錯誤

3.3 Handler(重點、面試問得比較多) 用於執行緒之間的通訊,比如:主執行緒與子執行緒

3.4 執行緒小結 SubThread->MainThread 錯誤 SubThread->Handler->MainThread 正確

  核心:
  1、toast彈框
  2、imageview
  3、進度條
  4、子執行緒訪問主執行緒(執行緒中的通訊handler<展示進度條百分比)
 <FrameLayout
        android:layout_width="match_parent"
        android:layout_height="60dp">
        <TextView
            android:id="@+id/tv_main_tv1"
            android:layout_width="60dp"
            android:layout_height="match_parent" />
            <ProgressBar
                android:id="@+id/main_btn_pb1"
                android:layout_width="match_parent"
                style="?android:attr/progressBarStyleHorizontal"
                android:max="100"
                android:layout_height="60dp"/>
    </FrameLayout>

//在MainActivity.java裡
    private ProgressBar main_btn_pb1;
    private int progress;
    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){
                progress++;
                main_btn_pb1.setProgress(progress);
                tv_main_tv1.setText(progress+"%");
            }
        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        main_btn_pb1=this.findViewById(R.id.main_btn_pb1);
        tv_main_tv1=this.findViewById(R.id.tv_main_tv1);
    }
    public void mypb(View view) {
        if(0==progress){
            new MyThread().start();
        }
    }



    private class MyThread extends Thread{
        @Override
        public void run() {
            super.run();
            while(true){
                try {
                    Thread.sleep(100);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                if(progress==100){
                    progress=0;
                    break;
                }
                Message msg=new Message();
                msg.what=1;//what代表哪一個程序
                myHandler.sendMessage(msg);
            }
        }
    }