2

モーションイベントを使用する ontouch リスナーを使用する小さなプロジェクトを試しています。画面上で指を動かすたびに、異なるサウンドが再生されます。これは問題なく完全に機能します。今、私は別のプロセスを実行しようとしています-移動を停止した直後に(指を削除せずに)画面を長押しすると、別の新しいアクティビティを開く必要があります。したがって、onlongpress イベントを使用しようとしていましたが、onlongpress が機能していないようでした。OnTouchListener と SimpleOnGestureListener がうまく連携しないと信じているためです。これらの唯一の作品で - touchlistner または SimpleonGesture?

したがって、長押しではなくカウントダウンタイマーを使用して、独自のロジックを試しました。oldmove と newmove が等しいかどうかを確認します (x と y の値は、たとえば 2 秒間同じです)。そうであれば、新しいアクティビティをトリガーします。ロジックは完璧に機能しますが、アクティビティが開かれた後でも、同じアクティビティが何度も開かれるという問題があります。なぜかわからない?

また、カウンターが始まる前にカウンタートレッドをキャンセルしようとしました-結果が遅くなるということです-代わりに2秒で10秒かかりますが、2回または3回何度も来ます。

  OnTouchListener MyOnTouchListener= new OnTouchListener()
{

    public boolean onTouch(View view, final MotionEvent event)
    {
        switch(event.getAction() & MotionEvent.ACTION_MASK)
        {

        case MotionEvent.ACTION_DOWN:

            x = (int) event.getX();
            y = (int) event.getY();    
            down = x+y;
            break;


        case MotionEvent.ACTION_MOVE:
        {

            int move= (int) (event.getX() + event.getY()); 

            if(Math.abs(down-move)>125 && Math.abs(down-move)<300 )
            {
                if(counter!=null)
                {
                    counter.cancel();
                }

                if(longpressCount==1)
                {
                    soundPool.play(id1, 1f, 1f, 1, 0, 1f);
                    try 
                    {
                        Thread.sleep(500);
                    } catch (InterruptedException e) {
                    }
                }
                else if(longpressCount==2)
                {
                    soundPool.play(id2, 1f, 1f, 1, 0, 1f);
                    try 
                    {
                        Thread.sleep(500);
                    } catch (InterruptedException e) {
                    }
                }
                else if(longpressCount==3)
                {
                    soundPool.play(id3, 1f, 1f, 1, 0, 1f);
                    try 
                    {
                        Thread.sleep(500);
                    } catch (InterruptedException e) {
                    }
                }
                else if(longpressCount==4)
                {
                    soundPool.play(id4, 1f, 1f, 1, 0, 1f);
                    try 
                    {
                        Thread.sleep(500);
                    } catch (InterruptedException e) {
                    }

                    longpressCount = 0;
                }

                down =   (int) (event.getX() + event.getY());
                move1 =  (int) (event.getX() + event.getY());
                    longpressCount++;

                }
            else if((Math.abs(move1-move))<20)
            {
                Log.e("STARTING COUNTER", "");
                counter = new CountDownTimer(2000, 2000) 
                {

                    int mold =(int) (event.getX() + event.getY());

                    public void onFinish() 
                    {
                        int mnew = (int) (event.getX() + event.getY());

                        if(Math.abs(mold-mnew)<30)
                        {
                            Log.e("Current longpressCount", longpressCount+"");
                        }
                    }

                    @Override
                    public void onTick(long millisUntilFinished) 
                    {

                    }

                }.start();
            }

            break;
        }
        }
        return true;
    }
};

問題は何だと思いますか?私は私のロジックを達成することができませんか?

4

0 に答える 0