11

私のクラスはViewを拡張しており、継続的なタッチイベントを取得する必要があります。

私が使用する場合:

public boolean onTouchEvent(MotionEvent me) {

    if(me.getAction()==MotionEvent.ACTION_DOWN) {
        myAction();
    }
    return true;
}

...タッチイベントが1回キャプチャされます。

指を動かさずに継続的にタッチする必要がある場合はどうなりますか?スレッドやタイマーを使う必要はない、と言ってください。私のアプリはすでに重すぎます。

ありがとう。

4

7 に答える 7

15

を使用しif(me.getAction() == MotionEvent.ACTION_MOVE)ます。指を画面上に100%完全に静止させることは不可能であるため、指が1、2ピクセルしかない場合でも、指が動くたびにAction_Moveが呼び出されます。

また、リッスンすることもできme.getAction() == MotionEvent.ACTION_UPます。それが発生するまで、ユーザーは画面に指を置いたままにする必要があります。

于 2010-03-29T16:56:44.517 に答える
5

要素android:focusable = "true" android:clickable = "true"にこのプロパティを設定する必要があります。そうでない場合は、ダウンアクションを生成するだけです。

于 2013-08-06T15:06:41.857 に答える
4

彼女は、continuestouchイベントを処理する方法を示す単純なコードスニペットです。デバイスに触れてタッチを押したままファインダーを動かすと、タッチ移動アクションが実行されます。

@Override
public boolean onTouchEvent(MotionEvent event) {
    float x = event.getX();
    float y = event.getY();
    if(isTsunami){
    switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN:
            // Write your code to perform an action on down
            break;
        case MotionEvent.ACTION_MOVE:
            // Write your code to perform an action on contineus touch move
            break;
        case MotionEvent.ACTION_UP:
            // Write your code to perform an action on touch up
            break;
    }
    }
    return true;
}
于 2010-03-29T19:16:42.213 に答える
1

これを試して。それは私に働きます:

public static OnTouchListener loadContainerOnTouchListener() {
    OnTouchListener listener = new OnTouchListener(){
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        LinearLayout layout = (LinearLayout)v;
        for(int i =0; i< layout.getChildCount(); i++)
        {
            View view = layout.getChildAt(i);
            Rect outRect = new Rect(view.getLeft(), view.getTop(), view.getRight(), view.getBottom());
            if(outRect.contains((int)event.getX(), (int)event.getY()))
            {
                Log.d(this.getClass().getName(), String.format("Over view.id[%d]", view.getId()));
            }
        }

    }

注意:設定するリスナーは、コンテナレイアウト(グリッド、相対、線形)である必要があります。

LinearLayout layout = findViewById(R.id.yourlayoutid);
layout.setOnTouchListener(HelperClass.loadContainerOnTouchListener());
于 2011-06-20T19:46:04.603 に答える
1

これは役立つかもしれません、

requestDisallowInterceptTouchEvent(true);

このように、親ビューで-

        @Override
        public boolean onTouch(View view, MotionEvent motionEvent) {
            view.getParent().requestDisallowInterceptTouchEvent(true);
            switch(motionEvent.getAction()){
            }

            return false; 

         }
于 2018-01-11T11:15:05.293 に答える
0

カスタムビューをサムコントロールとして使用してゲームを作成していました。。。これが私がしたことです

float x = 0, y = 0;

@Override
public boolean onTouchEvent(MotionEvent event) {
    x = event.getX();
    y = event.getY();

    // handle touch events with 
    switch( event.getActionMasked() ) {
        case MotionEvent.ACTION_DOWN :
            if(cont)
            {
                // remove any previous callbacks
                removeCallbacks(contin);

                // post new runnable
                postDelayed(contin, 10);
            }
            invalidate();
            return true;
        case MotionEvent.ACTION_MOVE :
            if(!cont && thumbing != null)
            {
                //  do non-continuous operations here
            }
            invalidate();       
            return true;
        case MotionEvent.ACTION_UP :

            // set runnable condition to false
            x = 0;

            // remove the callbacks to the thread
            removeCallbacks(contin);
            invalidate();
            return true;
        default :
            return super.onTouchEvent(event);
    }
}

public boolean cont = false;

// sets input to continuous
public void set_continuous(boolean b) { cont = b; }


public Runnable contin = new Runnable()
{

    @Override
    public void run() {
        if(x != 0)
        {
            //  do continuous operations here
            postDelayed(this, 10);
        }
    }

};

ただし、このビューを呼び出すメインアクティビティで、次のようにonPauseメソッドを介してコールバックを手動で削除するようにしてください。

@Override
protected void onPause() {
    if(left.cont) left.removeCallbacks(left.contin);
    if(right.cont) right.removeCallbacks(left.contin); 
    super.onPause();
}

そうすれば、一時停止して戻ってきた場合、タッチイベントは2回処理されず、ビューはスレッドのオーバーヘッドから解放されます。

**ハードウェアアクセラレーションを使用してSamsungGalaxyS3でテスト済み**

于 2014-05-29T02:54:25.687 に答える
0

これらの答えはすべて部分的に正しいですが、問題を正しい方法で解決することはできません。

まず第一に、イベントがACTION_MOVEであるときを追跡することを決定するそこにいるすべての人のために。まあそれはいつ推測するだけで動作しますか?ユーザーが指を動かすとき、カスタムサムコントロールを実装することにした場合は問題ありませんが、通常のカスタムボタンの場合はそうではありません。

次に、ACTION_DOWN内でフラグを使用し、ACTION_UPでそれをチェックすることは論理的な方法のようですが、Clusterfuxがwhile(!up_flag)論理を実装しているかどうかを確認すると、問題が発生します;)

したがって、それを行う適切な方法はここに記載されています:

Androidでの継続的な「Action_DOWN」

連続プレス中に作成するロジックでUIを何らかの方法で変更する必要がある場合は、メインスレッドから実行する必要があります。それ以外の場合は、別のスレッドを使用することをお勧めします。

于 2017-11-28T05:49:50.477 に答える