前言
- 手勢識別在
Android
開發(fā)的應用非常常見 - 今天
carson
將詳細給大家講解Android
手勢識別類:GestureDetector
類的使用痢艺。(含實例講解)
目錄
簡介
下面撤嫩,我將結合實例望几,詳細介紹GestureDetector的使用接口 & 使用類牢酵。
接口1:OnGestureListener
1. 作用
檢測用戶在屏幕的以下操作:按下瞬間、按壓默蚌、長按母剥、輕擊、快速滑屏茵烈、拖動
2. 使用步驟
// 步驟1:創(chuàng)建手勢檢測器實例 & 傳入OnGestureListener接口(需要復寫對應方法)
// 構造函數(shù)有3個百匆,常用的是第二個
// 1. GestureDetector gestureDetector=new GestureDetector(GestureDetector.OnGestureListener listener);
// 2. GestureDetector gestureDetector=new GestureDetector(Context context,GestureDetector.OnGestureListener listener);
// 3. GestureDetector gestureDetector=new GestureDetector(Context context,GestureDetector.SimpleOnGestureListener listener);
GestureDetector mGestureDetector = new GestureDetector(this, new GestureDetector.OnGestureListener() {
// 1. 用戶輕觸觸摸屏
public boolean onDown(MotionEvent e) {
Log.i("MyGesture", "onDown");
return false;
}
// 2. 用戶輕觸觸摸屏,尚未松開或拖動
// 與onDown()的區(qū)別:無松開 / 拖動
// 即:當用戶點擊的時呜投,onDown()就會執(zhí)行加匈,在按下的瞬間沒有松開 / 拖動時onShowPress就會執(zhí)行
public void onShowPress(MotionEvent e) {
Log.i("MyGesture", "onShowPress");
}
// 3. 用戶長按觸摸屏
public void onLongPress(MotionEvent e) {
Log.i("MyGesture", "onLongPress");
}
// 4. 用戶輕擊屏幕后抬起
public boolean onSingleTapUp(MotionEvent e) {
Log.i("MyGesture", "onSingleTapUp");
return true;
}
// 5. 用戶按下觸摸屏 & 拖動
public boolean onScroll(MotionEvent e1, MotionEvent e2,
float distanceX, float distanceY) {
Log.i("MyGesture", "onScroll:");
return true;
}
// 6. 用戶按下觸摸屏、快速移動后松開
// 參數(shù):
// e1:第1個ACTION_DOWN MotionEvent
// e2:最后一個ACTION_MOVE MotionEvent
// velocityX:X軸上的移動速度仑荐,像素/秒
// velocityY:Y軸上的移動速度雕拼,像素/秒
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
float velocityY) {
Log.i("MyGesture", "onFling");
return true;
}
});
// 步驟2-1:讓某個View檢測手勢 - 重寫View的onTouch函數(shù),將View的觸屏事件交給GestureDetector處理粘招,從而對用戶手勢作出響應
View.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
mGestureDetector.onTouchEvent(event);
return true; // 注:返回true才能完整接收觸摸事件
}
});
// 步驟2-2:讓某個Activity檢測手勢:重寫Activity的dispatchTouchEvent函數(shù)啥寇,將觸屏事件交給GestureDetector處理,從而對用戶手勢作出響應
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
mGestureDetector.onTouchEvent(ev); // 讓GestureDetector響應觸碰事件
super.dispatchTouchEvent(ev); // 讓Activity響應觸碰事件
return false;
}
3. 實例說明
現(xiàn)在對一個TextView進行手勢檢測
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity"
>
<TextView
android:id="@+id/textView"
android:layout_width="match_parent"
android:layout_height="600dp"
android:text="carson_ho Test"
android:textAppearance="?android:attr/textAppearanceLarge" />
</LinearLayout>
MainActivity.java
public class MainActivity extends AppCompatActivity {
TextView mTextView;
GestureDetector mGestureDetector;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 步驟1:創(chuàng)建手勢檢測器實例 & 傳入OnGestureListener接口(需要復寫對應方法)
mGestureDetector = new GestureDetector(this, new GestureDetector.OnGestureListener() {
// 1. 用戶輕觸觸摸屏
public boolean onDown(MotionEvent e) {
Log.i("MyGesture", "onDown");
return false;
}
// 2. 用戶輕觸觸摸屏洒扎,尚未松開或拖動
// 與onDown()的區(qū)別:無松開 / 拖動
// 即:當用戶點擊的時辑甜,onDown()就會執(zhí)行,在按下的瞬間沒有松開 / 拖動時onShowPress就會執(zhí)行
public void onShowPress(MotionEvent e) {
Log.i("MyGesture", "onShowPress");
}
// 3. 用戶長按觸摸屏
public void onLongPress(MotionEvent e) {
Log.i("MyGesture", "onLongPress");
}
// 4. 用戶輕擊屏幕后抬起
public boolean onSingleTapUp(MotionEvent e) {
Log.i("MyGesture", "onSingleTapUp");
return true;
}
// 5. 用戶按下觸摸屏 & 拖動
public boolean onScroll(MotionEvent e1, MotionEvent e2,
float distanceX, float distanceY) {
Log.i("MyGesture", "onScroll:");
return true;
}
// 6. 用戶按下觸摸屏逊笆、快速移動后松開
// 參數(shù):
// e1:第1個ACTION_DOWN MotionEvent
// e2:最后一個ACTION_MOVE MotionEvent
// velocityX:X軸上的移動速度栈戳,像素/秒
// velocityY:Y軸上的移動速度,像素/秒
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
float velocityY) {
Log.i("MyGesture", "onFling");
return true;
}
});
// 步驟2:讓TextView檢測手勢:重寫View的onTouch函數(shù)难裆,將觸屏事件交給GestureDetector處理子檀,從而對用戶手勢作出響應
mTextView = (TextView) findViewById(R.id.textView);
mTextView.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
mGestureDetector.onTouchEvent(event);
return false;
}
});
}
}
4. 示意圖
我在屏幕作出一系列手勢進行測試
接口2:OnDoubleTapListener
1. 作用
檢測用戶單擊、雙擊屏幕
2. 使用步驟
// 步驟1:創(chuàng)建手勢檢測器實例
// 注:使用OnDoubleTapListener接口時乃戈,需要使用GestureDetector褂痰,而GestureDetector的創(chuàng)建則必須傳入OnGestureListener接口
// 所以在使用OnDoubleTapListener接口時,也必須實現(xiàn)OnGestureListener接口
// 構造函數(shù)有3個症虑,常用的是第二個
// 1. GestureDetector gestureDetector=new GestureDetector(GestureDetector.OnGestureListener listener);
// 2. GestureDetector gestureDetector=new GestureDetector(Context context,GestureDetector.OnGestureListener listener);
// 3. GestureDetector gestureDetector=new GestureDetector(Context context,GestureDetector.SimpleOnGestureListener listener);
GestureDetector mGestureDetector = new GestureDetector(this, new GestureDetector.OnGestureListener() {
// 1. 用戶輕觸觸摸屏
public boolean onDown(MotionEvent e) {
Log.i("MyGesture", "onDown");
return false;
}
// 2. 用戶輕觸觸摸屏缩歪,尚未松開或拖動
// 與onDown()的區(qū)別:無松開 / 拖動
// 即:當用戶點擊的時,onDown()就會執(zhí)行谍憔,在按下的瞬間沒有松開 / 拖動時onShowPress就會執(zhí)行
public void onShowPress(MotionEvent e) {
Log.i("MyGesture", "onShowPress");
}
// 3. 用戶長按觸摸屏
public void onLongPress(MotionEvent e) {
Log.i("MyGesture", "onLongPress");
}
// 4. 用戶輕擊屏幕后抬起
public boolean onSingleTapUp(MotionEvent e) {
Log.i("MyGesture", "onSingleTapUp");
return true;
}
// 5. 用戶按下觸摸屏 & 拖動
public boolean onScroll(MotionEvent e1, MotionEvent e2,
float distanceX, float distanceY) {
Log.i("MyGesture", "onScroll:");
return true;
}
// 6. 用戶按下觸摸屏匪蝙、快速移動后松開
// 參數(shù):
// e1:第1個ACTION_DOWN MotionEvent
// e2:最后一個ACTION_MOVE MotionEvent
// velocityX:X軸上的移動速度,像素/秒
// velocityY:Y軸上的移動速度习贫,像素/秒
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
float velocityY) {
Log.i("MyGesture", "onFling");
return true;
}
});
// 步驟2:創(chuàng)建 & 設置OnDoubleTapListener接口實現(xiàn)類
mGestureDetector.setOnDoubleTapListener(new GestureDetector.OnDoubleTapListener() {
// 1. 單擊事件
// 關于OnDoubleTapListener.onSingleTapConfirmed()和 OnGestureListener.onSingleTapUp()的區(qū)別
// onSingleTapConfirmed:再次點擊(即雙擊)逛球,則不會執(zhí)行
// onSingleTapUp:手抬起就會執(zhí)行
public boolean onSingleTapConfirmed(MotionEvent e) {
Log.i("MyGesture", "onSingleTapConfirmed");
return false;
}
// 2. 雙擊事件
public boolean onDoubleTap(MotionEvent e) {
Log.i("MyGesture", "onDoubleTap");
return false;
}
// 3. 雙擊間隔中發(fā)生的動作
// 指觸發(fā)onDoubleTap后,在雙擊之間發(fā)生的其它動作苫昌,包含down颤绕、up和move事件;
public boolean onDoubleTapEvent(MotionEvent e) {
Log.i("MyGesture", "onDoubleTapEvent");
return false;
}
});
// 步驟3-1:讓某個View檢測手勢 - 重寫View的onTouch函數(shù),將View的觸屏事件交給GestureDetector處理奥务,從而對用戶手勢作出響應
View.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
mGestureDetector.onTouchEvent(event);
return true; // 注:返回true才能完整接收觸摸事件
}
});
// 步驟3-2:讓某個Activity檢測手勢:重寫Activity的dispatchTouchEvent函數(shù)物独,將觸屏事件交給GestureDetector處理,從而對用戶手勢作出響應
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
mGestureDetector.onTouchEvent(ev); // 讓GestureDetector響應觸碰事件
super.dispatchTouchEvent(ev); // 讓Activity響應觸碰事件
return false;
}
3. 實例說明
現(xiàn)在對一個TextView進行手勢檢測
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity"
>
<TextView
android:id="@+id/textView"
android:layout_width="match_parent"
android:layout_height="600dp"
android:text="carson_ho Test"
android:textAppearance="?android:attr/textAppearanceLarge" />
</LinearLayout>
MainActivity.java
public class MainActivity extends AppCompatActivity {
TextView mTextView;
GestureDetector mGestureDetector;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 步驟1:創(chuàng)建手勢檢測器實例 & 傳入OnGestureListener接口(需要復寫對應方法)
mGestureDetector = new GestureDetector(this, new GestureDetector.OnGestureListener() {
// 1. 用戶輕觸觸摸屏
public boolean onDown(MotionEvent e) {
Log.i("MyGesture1", "onDown");
return false;
}
// 2. 用戶輕觸觸摸屏氯葬,尚未松開或拖動
// 與onDown()的區(qū)別:無松開 / 拖動
// 即:當用戶點擊的時挡篓,onDown()就會執(zhí)行,在按下的瞬間沒有松開 / 拖動時onShowPress就會執(zhí)行
public void onShowPress(MotionEvent e) {
Log.i("MyGesture", "onShowPress");
}
// 3. 用戶長按觸摸屏
public void onLongPress(MotionEvent e) {
Log.i("MyGesture", "onLongPress");
}
// 4. 用戶輕擊屏幕后抬起
public boolean onSingleTapUp(MotionEvent e) {
Log.i("MyGesture", "onSingleTapUp");
return true;
}
// 5. 用戶按下觸摸屏 & 拖動
public boolean onScroll(MotionEvent e1, MotionEvent e2,
float distanceX, float distanceY) {
Log.i("MyGesture", "onScroll:");
return true;
}
// 6. 用戶按下觸摸屏溢谤、快速移動后松開
// 參數(shù):
// e1:第1個ACTION_DOWN MotionEvent
// e2:最后一個ACTION_MOVE MotionEvent
// velocityX:X軸上的移動速度瞻凤,像素/秒
// velocityY:Y軸上的移動速度,像素/秒
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
float velocityY) {
Log.i("MyGesture", "onFling");
return true;
}
});
// 步驟2:創(chuàng)建 & 設置OnDoubleTapListener接口實現(xiàn)類
mGestureDetector.setOnDoubleTapListener(new GestureDetector.OnDoubleTapListener() {
// 1. 單擊事件
// 關于OnDoubleTapListener.onSingleTapConfirmed()和 OnGestureListener.onSingleTapUp()的區(qū)別
// onSingleTapConfirmed:再次點擊(即雙擊)世杀,則不會執(zhí)行
// onSingleTapUp:手抬起就會執(zhí)行
public boolean onSingleTapConfirmed(MotionEvent e) {
Log.i("MyGesture", "onSingleTapConfirmed");
return false;
}
// 2. 雙擊事件
public boolean onDoubleTap(MotionEvent e) {
Log.i("MyGesture", "onDoubleTap");
return false;
}
// 3. 雙擊間隔中發(fā)生的動作
// 指觸發(fā)onDoubleTap后阀参,在雙擊之間發(fā)生的其它動作,包含down瞻坝、up和move事件蛛壳;
public boolean onDoubleTapEvent(MotionEvent e) {
Log.i("MyGesture", "onDoubleTapEvent");
return false;
}
});
// 步驟3:重寫View的onTouch函數(shù),將觸屏事件交給GestureDetector處理所刀,從而對用戶手勢作出響應
mTextView = (TextView) findViewById(R.id.textView);
mTextView.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
mGestureDetector.onTouchEvent(event);
return true;
}
});
}
}
4. 測試效果
日志效果如下
使用類:SimpleOnGestureListener
1. 作用
集成了兩個接口的手勢檢測功能
2. 與上述兩個接口的區(qū)別
- OnGestureListener和OnDoubleTapListener接口里的函數(shù)都是強制必須重寫的
- 而SimpleOnGestureListener類的函數(shù)則可根據(jù)需要選擇性復寫衙荐,因為SimpleOnGestureListener類本身已經(jīng)實現(xiàn)了這兩個接口的所有函數(shù),只是里面全是空的而已
3. 使用步驟
// 步驟1:創(chuàng)建手勢檢測器實例
// 構造函數(shù)有3個浮创,此處用的是第三個
// 1. GestureDetector gestureDetector=new GestureDetector(GestureDetector.OnGestureListener listener);
// 2. GestureDetector gestureDetector=new GestureDetector(Context context,GestureDetector.OnGestureListener listener);
// 3. GestureDetector gestureDetector=new GestureDetector(Context context,GestureDetector.SimpleOnGestureListener listener);
GestureDetector mGestureDetector = new GestureDetector(this, new GestureDetector.SimpleOnGestureListener() {
// OnGestureListener接口的函數(shù)
// 1. 用戶輕觸觸摸屏
public boolean onDown(MotionEvent e) {
Log.i("MyGesture1", "onDown");
return false;
}
// 2. 用戶輕觸觸摸屏忧吟,尚未松開或拖動
// 與onDown()的區(qū)別:無松開 / 拖動
// 即:當用戶點擊的時,onDown()就會執(zhí)行斩披,在按下的瞬間沒有松開 / 拖動時onShowPress就會執(zhí)行
public void onShowPress(MotionEvent e) {
Log.i("MyGesture", "onShowPress");
}
// 3. 用戶長按觸摸屏
public void onLongPress(MotionEvent e) {
Log.i("MyGesture", "onLongPress");
}
// 4. 用戶輕擊屏幕后抬起
public boolean onSingleTapUp(MotionEvent e) {
Log.i("MyGesture", "onSingleTapUp");
return true;
}
// 5. 用戶按下觸摸屏 & 拖動
public boolean onScroll(MotionEvent e1, MotionEvent e2,
float distanceX, float distanceY) {
Log.i("MyGesture", "onScroll:");
return true;
}
// 6. 用戶按下觸摸屏溜族、快速移動后松開
// 參數(shù):
// e1:第1個ACTION_DOWN MotionEvent
// e2:最后一個ACTION_MOVE MotionEvent
// velocityX:X軸上的移動速度,像素/秒
// velocityY:Y軸上的移動速度垦沉,像素/秒
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
float velocityY) {
Log.i("MyGesture", "onFling");
return true;
}
// OnDoubleTapListener的函數(shù)
// 1. 單擊事件
// 關于OnDoubleTapListener.onSingleTapConfirmed()和 OnGestureListener.onSingleTapUp()的區(qū)別
// onSingleTapConfirmed:再次點擊(即雙擊)煌抒,則不會執(zhí)行
// onSingleTapUp:手抬起就會執(zhí)行
public boolean onSingleTapConfirmed(MotionEvent e) {
Log.i("MyGesture", "onSingleTapConfirmed");
return false;
}
// 2. 雙擊事件
public boolean onDoubleTap(MotionEvent e) {
Log.i("MyGesture", "onDoubleTap");
return false;
}
// 3. 雙擊間隔中發(fā)生的動作
// 指觸發(fā)onDoubleTap后,在雙擊之間發(fā)生的其它動作厕倍,包含down寡壮、up和move事件;
public boolean onDoubleTapEvent(MotionEvent e) {
Log.i("MyGesture", "onDoubleTapEvent");
return false;
}
});
// 步驟2-1:讓某個View檢測手勢 - 重寫View的onTouch函數(shù)讹弯,將View的觸屏事件交給GestureDetector處理况既,從而對用戶手勢作出響應
View.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
mGestureDetector.onTouchEvent(event);
return true; // 注:返回true才能完整接收觸摸事件
}
});
// 步驟2-2:讓某個Activity檢測手勢:重寫Activity的dispatchTouchEvent函數(shù),將觸屏事件交給GestureDetector處理组民,從而對用戶手勢作出響應
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
mGestureDetector.onTouchEvent(ev); // 讓GestureDetector響應觸碰事件
super.dispatchTouchEvent(ev); // 讓Activity響應觸碰事件
return false;
}
4. 實例說明
現(xiàn)在對一個TextView進行手勢檢測
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity"
>
<TextView
android:id="@+id/textView"
android:layout_width="match_parent"
android:layout_height="600dp"
android:text="carson_ho Test"
android:textAppearance="?android:attr/textAppearanceLarge" />
</LinearLayout>
MainActivity.java
public class MainActivity extends AppCompatActivity {
TextView mTextView;
GestureDetector mGestureDetector;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 步驟1:創(chuàng)建手勢檢測器實例 & 傳入OnGestureListener接口(需要復寫對應方法)
mGestureDetector = new GestureDetector(this, new GestureDetector.SimpleOnGestureListener() {
// OnGestureListener接口的函數(shù)
// 1. 用戶輕觸觸摸屏
public boolean onDown(MotionEvent e) {
Log.i("MyGesture1", "onDown");
return false;
}
// 2. 用戶輕觸觸摸屏棒仍,尚未松開或拖動
// 與onDown()的區(qū)別:無松開 / 拖動
// 即:當用戶點擊的時,onDown()就會執(zhí)行邪乍,在按下的瞬間沒有松開 / 拖動時onShowPress就會執(zhí)行
public void onShowPress(MotionEvent e) {
Log.i("MyGesture", "onShowPress");
}
// 3. 用戶長按觸摸屏
public void onLongPress(MotionEvent e) {
Log.i("MyGesture", "onLongPress");
}
// 4. 用戶輕擊屏幕后抬起
public boolean onSingleTapUp(MotionEvent e) {
Log.i("MyGesture", "onSingleTapUp");
return true;
}
// 5. 用戶按下觸摸屏 & 拖動
public boolean onScroll(MotionEvent e1, MotionEvent e2,
float distanceX, float distanceY) {
Log.i("MyGesture", "onScroll:");
return true;
}
// 6. 用戶按下觸摸屏降狠、快速移動后松開
// 參數(shù):
// e1:第1個ACTION_DOWN MotionEvent
// e2:最后一個ACTION_MOVE MotionEvent
// velocityX:X軸上的移動速度,像素/秒
// velocityY:Y軸上的移動速度庇楞,像素/秒
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
float velocityY) {
Log.i("MyGesture", "onFling");
return true;
}
// OnDoubleTapListener的函數(shù)
// 1. 單擊事件
// 關于OnDoubleTapListener.onSingleTapConfirmed()和 OnGestureListener.onSingleTapUp()的區(qū)別
// onSingleTapConfirmed:再次點擊(即雙擊)榜配,則不會執(zhí)行
// onSingleTapUp:手抬起就會執(zhí)行
public boolean onSingleTapConfirmed(MotionEvent e) {
Log.i("MyGesture", "onSingleTapConfirmed");
return false;
}
// 2. 雙擊事件
public boolean onDoubleTap(MotionEvent e) {
Log.i("MyGesture", "onDoubleTap");
return false;
}
// 3. 雙擊間隔中發(fā)生的動作
// 指觸發(fā)onDoubleTap后,在雙擊之間發(fā)生的其它動作吕晌,包含down蛋褥、up和move事件;
public boolean onDoubleTapEvent(MotionEvent e) {
Log.i("MyGesture", "onDoubleTapEvent");
return false;
}
});
// 步驟2:重寫View的onTouch函數(shù)睛驳,將觸屏事件交給GestureDetector處理烙心,從而對用戶手勢作出響應
mTextView = (TextView) findViewById(R.id.textView);
mTextView.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
mGestureDetector.onTouchEvent(event);
return true;
}
});
}
}
5. 測試效果
日志效果如下
至此,關于Android手勢識別類GestureDetector類使用講解完畢乏沸。
總結
- 本文主要對
Android
手勢識別類:GestureDetector
類的使用進行全面講解 - 接下來我將繼續(xù)介紹
Android
開發(fā)中的相關知識淫茵,感興趣的同學可以繼續(xù)關注本人博客Carson_Ho的開發(fā)筆記
相關系列文章閱讀
Carson帶你學Android:學習方法
Carson帶你學Android:四大組件
Carson帶你學Android:自定義View
Carson帶你學Android:異步-多線程
Carson帶你學Android:性能優(yōu)化
Carson帶你學Android:動畫
歡迎關注Carson_Ho的簡書
不定期分享關于安卓開發(fā)的干貨,追求短蹬跃、平匙瘪、快,但卻不缺深度蝶缀。