ここに私のコードがあり、指が画面を下るときを検出したいので、画面に触れるとACTION_DOWN
しかし、指で画面を下に移動すると、ACTION_MOVE
は認識されず、ACTION_UP
なぜなのかご存知ですか?
float x=0;
protected void onCreate(Bundle savedInstanceState) {
do things
ImageView image2 = (ImageView) findViewById(R.id.imageView3);
image2.setOnTouchListener(new OnTouchListener(){
@Override
public boolean onTouch(View arg0, MotionEvent arg1) {
if (arg1.getAction()==MotionEvent.ACTION_DOWN) {
x=arg1.getX();
}
else {
if (arg1.getAction()==MotionEvent.ACTION_MOVE){
if (arg1.getX()>x) {
do things
}
}
else {
if (arg1.getAction()==MotionEvent.ACTION_UP){
do things
}
}
}
}
onTouch()
メソッドが、最初のACTION_DOWN
false
に応答してMotionEvent
を返す場合、この特定のジェスチャーに属する後続のイベントを受信しません。代わりに、これらのタッチイベントは、階層内の親に提示されます。
別の言い方をすれば、ジェスチャ(ACTION_DOWN
)の開始中にonTouch()
からfalse
を返すと、メソッドはもう何も表示したくないことを示します。ジェスチャ、およびジェスチャのイベントが親View
に送信される必要があること。
以下のコメントでmarkproxyが指摘しているように、false
がACTION_DOWN
以外、たとえばACTION_MOVE
などの場合、MotionEvent
を返すとnot現在のジェスチャーの後続のMotionEvent
sがView
に提示されるのを防ぎます。
MotionEvent.getAction()
は、単なるフラグ以上のものを返します。以下を試してください:
_int action = arg1.getAction() & MotionEvent.ACTION_MASK;
if (action == MotionEvent.ACTION_MOVE) ...
_
MotionEvent.getActionMasked()
を使用することもできます。こちらもご覧ください http://developer.Android.com/reference/Android/view/MotionEvent.html
いくつかのこと:
1)ビューがイベントを消費したことを示すためにブール値を返す必要があります。
動作する非常に単純な実装を次に示します。
package com.test;
import Android.app.Activity;
import Android.os.Bundle;
import Android.util.Log;
import Android.view.MotionEvent;
import Android.view.View;
import Android.view.View.OnTouchListener;
public class TestProjActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
final String TAG = "TEST_TAG";
View v = findViewById(R.id.touchTest);
v.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if (event.getAction()==MotionEvent.ACTION_DOWN) {
Log.e(TAG,"Down");
return true;
}
if (event.getAction()==MotionEvent.ACTION_MOVE){
Log.e(TAG,"Move");
return true;
}
if (event.getAction()==MotionEvent.ACTION_UP){
Log.e(TAG,"Up");
return true;
}
return false;
}
});
}
}
これがmain.xmlです
::
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_width="fill_parent"
Android:layout_height="fill_parent"
Android:orientation="vertical" >
<TextView
Android:id="@+id/touchTest"
Android:layout_width="fill_parent"
Android:layout_height="wrap_content"
Android:text="@string/hello" />
</LinearLayout>
次の2つの場合があります。
1)OnClickListener()-> onTouch()も設定した場合はfalseを返す必要があります。
(onTouch()がtrueを返す場合、OnClickListener()は機能しません)
2)OnClickListener()を設定しない場合-> onTouch()はtrueを返す必要があります。
(onTouch()がfalseを返す場合、ACTION_DOWNのみが呼び出されます)
OnTouch()メソッドの戻り値を確認してください。
それは偽ではなく真でなければなりません。
return true;
うまくいくことを願っています。