ジェスチャー
このセクションの紹介:
私は土曜日に休みがありません。大規模な人員削減から戻ってきたばかりなので、書き続けます~
さて、この中で皆さんにお届けしたいこと。このセクションは第 3 章の最後のセクションです - Gestures (ジェスチャー)、 Meizuの携帯電話を使用したことのある友人は、画面のようにホームボタンの両側をスワイプするジェスチャに慣れているはずです。 バックグラウンドタスクリストなどを開くことができます。ジェスチャーを使用してアプリケーションを操作することで、ユーザーエクスペリエンスが大幅に向上します。 たとえば、Scroll ジェスチャでブラウザの画面をスクロールしたり、Fling でブラウザのページを切り替えたりできます。
もちろん、長所も短所もあり、不適切なジェスチャー操作はAPPのカーシュを引き起こし、ユーザーの不満を引き起こすことがよくあります。 したがって、アプリケーションにジェスチャを追加したい場合は、慎重に検討する必要があります。さらに、ジェスチャは、以前に学習した 1 本指/複数指のタッチとは区別する必要があります。
ジェスチャーとは: 画面を上下左右にスライドさせたり、不規則な幾何学図形を描いたりするなど、継続的にタッチする動作です。 Android は、上記のジェスチャ動作の両方をサポートします。
- Android は、ジェスチャ検出を提供し、ジェスチャ認識に対応するリスナーを提供します。
- Android 開発者は、自分でジェスチャーを追加し、ユーザーのジェスチャーを認識するための対応する API を提供できます。
お使いの携帯電話が Android 4.x のネイティブ Android システムである場合、携帯電話またはタブレットで Google が表示される場合があります。 Gesture Builder APP が提供されており、ユーザーは落書きに似た方法で手書きのシンボルを描くことができます。 文字列名に対応!もちろん、そのような携帯電話を持っていなくても問題ありません。エミュレータがあるので、自分で 4.0 システムを開いてみましょう。 さらに、mmtsdcardgestures に移動して、ジェスチャを保存するファイルを取得できることもわかります。 さて、しつこいことはたくさんあるので、本題に移りましょう!
ところで、最初に公式 API ドキュメントを投稿しましょう: GestureDetector
1. Android でのジェスチャ インタラクションの実行シーケンス
- 1. 指が画面に触れると、MotionEvent イベントがトリガーされます。
- 2. このイベントは OnTouchListener によって監視されており、MotionEvent オブジェクトはその onTouch() メソッドで取得できます。
- 3. GestureDetector を通じて MotionEvent オブジェクトを OnGestureListener に転送します。
- 4. OnGestureListener を通じてオブジェクトを取得し、関連する情報を取得し、関連する処理を実行します。
上記の 3 つのクラスが何に使用されるかを見てみましょう: MotionEvent: このクラスは、ジェスチャー、タッチ ペン、トラックボールなどのモーション イベントをカプセル化するために使用されます。 これは、2 つの重要な属性 X と Y を内部的にカプセル化しており、それぞれ水平軸と垂直軸の座標を記録するために使用されます。 GestureDetector: さまざまなジェスチャーを認識します。 OnGestureListener: これは、複数の抽象メソッドを提供する、ジェスチャ操作のリスニング インターフェイスです。 そして、GestureDetector のジェスチャ認識結果に応じて、対応するメソッドを呼び出します。
——上記の情報は、http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2012/1020/448.html から引用しています。
2 GestureListener の詳細な説明:
1 から、ジェスチャ監視の鍵 Yes:GestureListener 彼は次のコールバック メソッドを提供します:
- 押す (下へ): 指がタッチ スクリーンに触れた瞬間、それがタッチです。
- 投げる (onFling): タッチ スクリーン上で指を素早く動かし、指を離すアクション。
- 長押し (onLongPress): 指を一定時間押したまま放しません。
- スクロール (onScroll): タッチスクリーン上で指をスライドさせます。
- 長押し (onShowPress): 指がタッチ スクリーン上で押され、その時間範囲は、長押し前の、押下が有効になるまでの時間です。
- リフトアップ (onSingleTapUp): 指がタッチ スクリーンから離れた瞬間。
GestureListener の関連メソッドを理解した後、ジェスチャ検出を実装する手順は次のとおりです。
- ステップ 1: GestureDetector オブジェクトを作成するときに、GestureListener を実装して渡す必要があります。
- ステップ 2: アクティビティまたは特定のコンポーネントを挿入する 処理のために TouchEvent イベントを GestureDetector に渡すだけです。 このプロセスを検証するための簡単なコードを書いてみましょう。つまり、対応するメソッドを書き換えてみましょう:
コードは次のとおりです:
private MyGestureListener mgListener;
private GestureDetector mDetector;
private Final static String TAG = "MyGesture";
@Override
protected void onCreate(Bundle SavedInstanceState) {
super.onCreate(saved)インスタンスの状態) ; C SetContentView (R.Layout.Activity_main);
// インスタンス化された GESTURELISTENER および GESTUREDETECTOR オブジェクト
ETECTOR (this, mglistener);
@v@Public Boolean Over (Motionevent イベント) {
Return MDETECTOR.ontouchevent (Event)
}
// GESTUREListener をカスタムします。これは View クラスの下にあります。間違って書かないでください。 ! ! C Private Class MyGestureListener iMplements GestureDeTector.ongestureListener {
@oublic Boolean OOOLEN ONDOWNT {
LOG.D (Tag, "" "" onDown: Press "); OnshowPress (MotionEvent MotionEvent) {
Log.d (tag, "Onshowpress:指をしばらく押しますが、押していません"); OTionEvent) {
Log.d (Tag, "onSingletapup: 指が画面から離れた瞬間");
Return false;
}
@override
パブリックブールオンスクロール(MotionEvent MotionEvent、MotionEvent MotionEvent1、Float V、Float V1){
log.d( "onscroll:slide on the touch screen") .d(TAG, "onLongPress: 長押ししても離さない"); tionEvent motionEvent1, float v, float v1) {
Log.d(TAG, "onFling: すぐにスライドして離す");
falseを返す;
対応する操作のスクリーンショット:
1. すぐに押して放します:
2. 押し続けて放します:
- 3. 優しくスワイプします。同時に放します:
- 4. 長押ししてスライドを続けます:
3. 簡単な例: 下にスライドしてアクティビティを閉じ、上にスライドして新しいアクティビティを開始します 上記の SimpleOnGestureListener を使用して実装しましょう:
レンダリングの実行:
実装コード:
private GestureDetector mDetector;
private Final static int MIN_MOVE = 200; //最小距離
private MyGestureListener mgListener;
@Override
protected void onCreate(Bundle SavedInstanceState) {
super .onCreate (savedInstanceState);
setContentView(R.layout.activity_main);
//SimpleOnGestureListener オブジェクトと GestureDetector オブジェクトをインスタンス化します
mgListener = new MyGestureListener();
mDetector = new GestureDetector( this, mgListener);
}
@Override
public Boolean onTouchevent (MotionEvent Event) {
Return MDETECTOR.ONTOUCHEVENT (Event);
}
// GESTUREListener をカスタムします。これはビュー クラスからのものです。間違って書かないでください。 ! !
private class MyGestureListener extends GestureDetector.SimpleOnGestureListener {
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float v, float v1) {
If(e1.getY() - e2.getY() > MIN_MOVE){ T StartActivity (新しいインテント (MainActivity.this, MainActivity.class));
Toast.maketext (MAINACTIVIS.THIS, ジェスチャによる「アクティビティの開始」、toast.length_s Hort) .show (); Else if (E1.gety) ) - e2.getY() < MIN_MOVE){
finish();
Toast.makeText(MainActivity.this,"ジェスチャによるアクティビティの終了",Toast.LENGTH_SHORT).show();
}
return true;
}
}
}
結果分析:上記の比較から、SimpleOnGestureListener と比較して SimpleOnGestureListener を使用することがわかります。 さらに、この例は比較的簡単なので、自分で試してみることもできます。 ジェスチャーによる写真のズームなど、その他の遊び方もあります~
4. ジェスチャーの追加と認識:
上記で説明したジェスチャー検出に加えて、Android ではジェスチャーを追加することもでき、関連する認識 API も提供されます。 Android では、GestureLibrary を使用してジェスチャ ライブラリを表し、GestureLibraries ツール クラスはジェスチャ ライブラリを作成するために提供されています。
ジェスチャーライブラリをロードするための 4 つの静的メソッド:
GestureLibraries オブジェクトを取得した後、オブジェクトによって提供される次のメソッドを使用して、対応する操作を実行できます:
関連メソッド:
- public void addGesture (StringentryName, Gesturegesture):entryName という名前のジェスチャを追加します
- public Set<String> getGestureEntries (): ジェスチャ ライブラリ内のすべてのジェスチャの名前を取得します
- public ArrayList<Gesture> ):entryName 名に対応するすべてのジェスチャを取得します public ArrayList<Prediction> recognize
- (Gesture ジェスチャ): 現在のジェスチャ ライブラリからジェスチャに一致するすべてのジェスチャを認識します public void removeEntry
- (StringentryName): ジェスチャを削除しますジェスチャーライブラリーのentryName名に対応 public void removeGesture
- (StringentryName, Gesturegesture): ジェスチャーライブラリーのentryNameとGestureの両方に一致するジェスチャーを削除します public abstract boolean save
- (): したいジェスチャ ライブラリに追加します ジェスチャの後にこのメソッドを呼び出すか、このメソッドからジェスチャを削除してジェスチャ ライブラリを保存します
Android は、次のような GestureOverlayView の 3 つのリスナー インターフェイスを提供します。一般的に使用されるものは次のとおりです。
OnGesturePerformedListener; ジェスチャーの完了に使用されます。時間内に応答を返します。
5. ジェスチャー追加の例:追記: この例は Li Gang の「Android Crazy講義ノート」のコードを参照しています
レンダリングの実行:実装コードは以下に掲載されています:
2つのレイアウトファイル: activity_main.xmlとdialog_save.xml
activity_main.xml
xmlns:tools="http://schemas.android.com/tools"
android:layout_width=" match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content" D Android: Text = "下の画面にジェスチャーを描画してください ~"
Android: TextSize = "20SP"/& GT;
& LT;-GESTROKETYPE はジェスチャーを制御します。Multiple は複数のペンを許可することを示します--- > ="複数" />
</LinearLayout>
dialog_save.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android "
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height=" Wrap_content"
android :orientation="horizontal">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginRight="8dp"
android:text="请充填写手势名:"/> ;
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/edit_name"/>
</Linearレイアウト>
<イメージビュー
android: id="@+id/img_show"
android:layout_width="128dp"
android:layout_height="128dp"
android:layout_marginTop="10dp"/>
</LinearLayout>
MainActivity.java:
private EditText editText;
private GestureOverlayView gesture;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//获取手势编辑構成要素の後に、相关パラメータを設定します
gesture = (GestureOverlayView) findViewById(R.id.gesture);
gesture.setGestureColor(Color.GREEN);
gesture.setGestureStrokeWidth(5);
gesture.addOnGesturePerformedListener( new GestureOverlayView.OnGesturePerformedListener() {
@Override
public void onGesturePerformed(GestureOverlayView gestureOverlayView, final Gesture gesture) {
View saveD ialog = getLayoutInflater().inflate(R.layout.dialog_save,null,false);
ImageView img_show = (ImageView ) saveDialog.findViewById(R.id.img_show);
final EditText edit_name = (EditText) saveDialog.findViewById(R.id.edit_name);
Bitmap bitmap = gesture.toBitmap( 128,128,10,0xffff0000);
img_show.setImageBitmap (ビットマップ);
new AlertDialog.Builder(MainActivity.this).setView(saveDialog)
.setPositiveButton("保存",new DialogInterface.OnClickListener()
{
@Overrideer Public Void Onclick (Dialoginterface Dialoginterface, Int I) {
// GestureLibrary GESTURELIB = GESTURELIBRARIES.FROMFILE ("/Mn t/sdcard/myGestures ") ).toString(),gesture);
gestureLib.save(); setNegativeButton("キャンセル", null).show();
最後に、AndroidManifest.xml に SD カードへの書き込み権限を追加する必要があります:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
6. ジェスチャー認識の例
実装コード:
private GestureOverlayViewgesture;
private GestureLibrarygestureLibrary;
private Context mContext;
@Override
protected vo id onCreate(Bundle SavedInstanceState) {
super.onCreate(savedInstanceState) ;
setContentView(R .layout.activity_main);
mContext = MainActivity.this;
gestureLibrary = GestureLibraries.fromFile("mmt/sdcard/mygestures");
if (gestureLibrary.load()) {
ast.makeText(mContext, "ジェスチャ ライブラリ"正常にロードされました ", Toast.LENGTH_SHORT).show();
トースト。/ジェスチャー編集コンポーネントを取得した後、関連パラメーターを設定します
gesture = (GestureOverlayView) findViewById(R.id.gesture)
gesture.setGestureColor(Color.GREEN) ); gesture.seturestrokewidth(5); ognize(ジェスチャー);
) ;
// 見つかったすべての Prediction オブジェクトを走査します
for(予測:予測){
score); >
このセクションの概要:
さて、このセクションでは Android のジェスチャー ジェスチャーを紹介し、ジェスチャー判定、ジェスチャー追加、ジェスチャー認識の 3 つの内容について説明します。 、ほとんどの例は、Li Gang 先生の Android Crazy 講義ノートから引用されています。興味がある場合は、本を読んでください〜ありがとう
。