觸摸屏幕動作捕捉
觸摸屏幕動作的捕捉基於一個載體,可以是某一張圖片,某一個控件,某一個佈局。
在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>