戌印-INUJIRUSHI- (Androidあれこれ)

Androidのプログラミングをメインにしてます。記事に貼られたソースコードはダブルクリックすることで行番号をはずしてコピーすることができます。

 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
10

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

タッチイベントを取得 : onTouchEvent

Android のタッチパネル操作には複数のタッチイベントがあります。

① タップやスライドといった単純なタッチイベントを処理する
  Activity#onTouchEvent / View#onTouchEvent
② ダブルタップやロングタッチなどの複雑なタッチイベントを処理する
  GestureDetector / ScaleGestureDetector

ここでは①の単純なタッチイベントの取得について解説します。
解説の最後には HTC 端末での問題点を少々…。

【参考サイト】
TechBooster - タッチイベントを取得する(onTouchEventとMotionEvent)
TechBooster - MotionEventでマルチタッチを検出する
Androidプログラマへの道 ~ Moonlight 明日香 ~ - タッチイベントを取得する
Androidプログラマへの道 ~ Moonlight 明日香 ~ - マルチタッチイベントを取得する

【タッチイベントの取得】
・Activity でタッチイベントを取得するには onTouchEvent(MotionEvent event) をオーバーライドする (※)
・タッチアクションは MotionEvent#getAction() から取得する。
・タッチアクションには何点目かを示すポインタも含まれているため、イベントを取得するには MotionEvent.ACTION_MASK でマスクする必要がある。

※ onTouchEvent(MotionEvent event) は Activity / View それぞれでオーバーライド可能。
※ View は View#OnTouchListener でタッチイベントを設定できる。
※ Activity / View 共にタッチイベントが取得可能な場合、View が優先される。

【タッチアクション】
ACTION_DOWN
  タッチイベント開始(1本目の指がタッチパネルに触れた)
ACTION_UP
  タッチイベント終了 (最後の指をタッチパネルから離した)
ACTION_MOVE
  タッチ中の指をスライドした
ACTION_CANCEL
  タッチイベントがキャンセルされた
以下はマルチタッチイベント。API 5 (Android 2.0) より追加。
ACTION_POINTER_UP
  2本目以降の指がタッチパネルに触れた
ACTION_POINTER_DOWN
  2本以上の指がタッチパネルに触れている時に指をタッチパネルから離した

【サンプル】
■ 画面イメージ
Android_onTouchEvent.png


■ TouchActivity.java
package jp.inujirushi.android.sample;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.MotionEvent;
import android.widget.TextView;

public class TouchActivity extends Activity {

TextView mTextView;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_touch);
mTextView = (TextView) findViewById(R.id.text);
}

@Override
public boolean onTouchEvent(MotionEvent event) {
// --------------------------------------------------
// 最後に発生したタッチイベントをログ表示
// --------------------------------------------------
// タッチ情報を取得
int action = event.getAction();
int actionEvent = (action & MotionEvent.ACTION_MASK);
int pointerId = (action & MotionEvent.ACTION_POINTER_ID_MASK) >> MotionEvent.ACTION_POINTER_ID_SHIFT;

// タッチイベント処理を実行
switch (actionEvent) {
case MotionEvent.ACTION_DOWN:
Log.i("onTouchEvent", "ACTION_DOWN");
break;
case MotionEvent.ACTION_UP:
Log.i("onTouchEvent", "ACTION_UP");
break;
case MotionEvent.ACTION_MOVE:
Log.i("onTouchEvent", "ACTION_MOVE");
break;
case MotionEvent.ACTION_CANCEL:
Log.i("onTouchEvent", "ACTION_CANCEL");
break;
case MotionEvent.ACTION_POINTER_UP:
Log.i("onTouchEvent", "ACTION_POINTER_UP:ID=" + pointerId);
break;
case MotionEvent.ACTION_POINTER_DOWN:
Log.i("onTouchEvent", "ACTION_POINTER_DOWN:ID=" + pointerId);
break;
}

// --------------------------------------------------
// 現在のタッチ状態を画面に表示
// --------------------------------------------------
StringBuilder sb = new StringBuilder();
for (int i = 0; i < event.getPointerCount(); i++) {
sb.append("ID:" + event.getPointerId(i)
+ ", x=" + event.getX(i)
+ ", y=" + event.getY(i)
+ "\n");
}
mTextView.setText(sb.toString());

return super.onTouchEvent(event);
}
}



タッチイベントを行うには HTC 端末で注意が必要です。
HTC の一部端末では『HTCジェスチャー』という3本指操作時に『HTCメディアコンパニオン』を起動する機能があり、デフォルトでオンになっています。
これにより、マルチタッチでは2点までしか認識せず、3本指以上でタッチすると onTouchEvent で MotionEvent.ACTION_CANCEL が発生します。

確認端末:HTC J ISW13HT
[設定] - [ディスプレイ、ジェスチャ、ボタン]
Android_HTC_Settings.png

このチェックをはずすとマルチタッチで5点まで認識するようになり、MotionEvent.ACTION_CANCEL も発生しなくなります。
なぜこの特別な設定をデフォルトにしちゃうんでしょうね…
スポンサーサイト

Comments

Leave a Comment


Body
プロフィール

とむ・やむくん

Author:とむ・やむくん
管理人について

Windows 7 / 64bit
Eclipse 4.2 Juno (日本語パッチ済)

スポンサーサイト
最新トラックバック
検索フォーム
ブロとも申請フォーム
QRコード
QR
Twitter
2013/01/04 19:00 カウント開始

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。