安卓APP實戰(五):觸摸屏幕動作捕捉、反射獲取資源及動態調整圖片尺寸、簡單的動畫演示、提示信息

觸摸屏幕動作捕捉

觸摸屏幕動作的捕捉基於一個載體,可以是某一張圖片,某一個控件,某一個佈局。
在Activity中通過findViewById或其他途徑獲取一個View,通過setOnTouchListener對其進行動作捕捉。捕捉動作就三個,按下動作,移動動作和擡起動作。在onTouch中可以使用even.getAction()獲取當前動作的類型,對不同類型進行不同的處理。

View.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
            	switch (event.getAction()) {
            		case MotionEvent.ACTION_DOWN:
            			//do something
            		case MotionEvent.ACTION_MOVE:
            			//do something
            		case MotionEvent.ACTION_UP:
            			//do something
            }
}

反射獲取資源及動態調整圖片尺寸

在Activity中獲取資源、使用資源時,如getResource(),ContextCompat.getDrawable(),setBackgroundResource()等等方法,他們所需要的都是資源的ID。
這時候我們通常會知道資源的名稱,可以通過名稱去獲得其ID,再使用ID進行接下來的操作。
getResources().getIdentifier(name,type,package);
name爲資源的名稱,即文件名。type爲資源類型,如drawable,raw,mipmap等等,package 在大多數情況下就使用getPackageName()進行獲取當前應用的包就可以。

獲取到的資源在不同機器上運行時,需要根據不同的屏幕大小進行尺寸調整。下面方法可以獲得當前運行設備的屏幕尺寸,根據尺寸和圖片的固定尺寸,便可以確定我們需要將圖片拉伸或縮小多少比例,以此來確保顯示在各設備上均可正常顯示。

widthPixels = this.getResources().getDisplayMetrics().widthPixels;
heightPixels = this.getResources().getDisplayMetrics().heightPixels;
scaleWidth = (float) widthPixels / 720;
scaleHeight = (float) heightPixels / 1280;

動態調整尺寸在通過屏幕動作捕獲時非常關鍵,捕獲屏幕往往獲取的是當前的座標,座標是以本設備爲基準的,所以我們在處理時以比例來進行數據的處理判斷,纔可以保證程序在不同機型上具有通用性,否則就可能導致程序的異常。

簡單的動畫演示

簡單的動畫演示就是連續切換顯示的圖片,切換的間隔時間較短,達到動畫的效果。

創建演示動畫可以在Layout中進行定義也可以在Activity中動態定義。
①layout中定義動畫
在RES目錄下新建目錄 anim (名稱不可變,固定名稱)。然後在anim 下新建animation resource file
使用<item>標籤在<set>標籤中添加動畫的每一幀,android:drawable屬性指定每一幀展示的圖片,android:duration展示每一幀間隔的時間。

<?xml version="1.0" encoding="utf-8"?>
<set>
	android:oneshot="false"
	xmlns:android="http://schemas.android.com/apk/res/android">
	<item android:drawable="@drawable/pic1" android:duration="150"/>
</set>

在Activity中使用AnimationDrawable類進行動畫的播放,播放載體依賴主佈局中的一個ImageView。需要將動畫設置爲ImageView的背景資源。

ImageView.setBackgroundResource(R.anim.XXX);
AnimationDrawable animation = (AnimationDrawable) ImageView.getBackground();
ImageView.post(new Runnable(){
	@Override
	public void run(){
		animation.start();
	}
})

②Activity中定義動畫
實例化一個AnimationDrawable類,使用animation.addFrame(drawable,duration);方法爲動畫動態添加幀。
使用animation.setOnshot(boolean)設置是否循環播放。

之後就和上面相同,將其設置爲ImageView的背景,在ImageView.poset()方法中設置動畫開始播放。

和音樂播放器一樣,動畫也可以獲取當前播放位置(幀位置),播放總時長,使用stop(),start()進行播放,停止等操作。

提示信息

在開發軟件,經常要給用戶反饋一些信息,如提示用戶的錯誤操作,程序出現了異常等等。

提示方法1:

Toast.makeText(context, message, duration).show();

toast提示非常好用,會在手機上出現一個不影響程序的小提示框,用戶無法對其操作,類似於一個提示、通知信息,僅具有告知作用。
context爲上下文,使用當前Activity獲取應用的context都可以,message是提示信息內容,duration是提示信息存在的時間,長時間Toast.LONG和短時間 Toast.SHORT。
在這裏插入圖片描述

提示方法2:

Dialog類
官方給出的有
AlertDialog,CharacterPickerDialog,Presentation三種直接繼承了Dialog的類,另有繼承了AlertDialog三個類 DatePickerDiaglog,ProggressDialog,TimePickerDialog.

最簡單的AlertDialog彈框提示,類似於JAVAWEB中的ALERT。

	AlertDialog.Builder builder = new AlertDialog.Builder(上下文);
    builder.setMessage("提示信息");
    builder.setTitle("彈框標題");
    builder.setPositiveButton("按鈕名稱1", new DialogInterface.OnClickListener() {
           @Override
           public void onClick(DialogInterface dialog, int which) {
                dialog.dismiss();
                //點擊後的處理時間
            }
    });
    builder.setNegativeButton("按鈕名稱2", new DialogInterface.OnClickListener() {
            @Override
           public void onClick(DialogInterface dialog, int which) {
           dialog.dismiss();
            //點擊後的處理時間
     		}
     });
     builder.create().show();

參考:https://www.cnblogs.com/gzdaijie/p/5222191.html
其中還列舉了一些常用的dialog

然而dialog的功能不止於此,包括但不限於帶圖片,帶動畫,帶音樂、進度條等等等各種你能想到的自定義方式。

基於AlertDialog類,我們可以自定義各種我們想要的彈出框。
以本需求中的演示按鈕,彈出動畫爲例。可以看出彈出框就是一個界面,在界面上我們可以像設計其他任何頁面一樣去設計這個彈出頁面,實現各種功能。

比較常用的進度條,就用相同的佈局就可以,開啓一個子線程不斷請求當前處理狀態,每次請求到狀態後去動態更新佈局中的控件參數。
文字控件中設置最新的處理狀態組成提示信息
圖片控件設置底圖不變,覆蓋一張根據當前處理進度百分比調整寬度的圖片,就能實現進度條向前移動的效果。

彈框演示動畫源碼如下:
----------------彈出框類----------------------------

public class AnimationDialog extends AlertDialog {

    private AnimationDrawable animation;
    private String loadingTip;

//首先定義構造方法,實例化彈出框需要傳入上下文,彈出框的提示信息和彈出框內嵌入的動畫效果
    public AnimationDialog(Context context, String loadingTip, AnimationDrawable animation) {
        super(context);
        this.loadingTip = loadingTip;
        this.animation = animation;
        //AlertDialog自帶的方法,設置點擊邊緣時取消彈出框。
        setCanceledOnTouchOutside(true);
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //設置彈出框內的顯示佈局文件
        setContentView(R.layout.progress_dialog);
        //獲取佈局文件中的文字框並設置傳入的提示文字
        TextView loadingTv = (TextView) findViewById(R.id.loadingTv);
        loadingTv.setText(loadingTip);
         //獲取佈局文件中的圖片框,與傳入的動畫綁定並開始播放
        ImageView loadingIv = (ImageView) findViewById(R.id.loadingIv);
        loadingIv.setBackground(animation);
        loadingIv.post(new Runnable() {
            @Override
            public void run() {
                animation.start();
            }
        });            
    }
}

------------彈出框佈局文件----------------------------

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#333333">

    <ImageView
        android:id="@+id/loadingIv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true" />

    <TextView
        android:id="@+id/loadingTv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/loadingIv"
        android:layout_centerHorizontal="true"
        android:textColor="#FFFFFF"
        android:textSize="10sp" />

</RelativeLayout>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章