2

多くのボタンで動作するマルチタスク アプリを管理しようとしています。

この目的のために、私はこの機能を作りました:

public boolean isTouched(View view, MotionEvent event) {
    boolean touched = false;
    int count = event.getPointerCount();

    int[] location = { 0, 0 };
    view.getLocationOnScreen(location);
    Point min = new Point(location[0], location[1]);
    Point max = new Point(min.x + view.getWidth(), min.y + view.getHeight());

    for (int i = 0; i < count; i++) {


        int rawX = (int) event.getX(i);
        int rawY = (int) event.getY(i);
        if(rawX>=min.x && rawX<=max.x && rawY>=min.y && rawY<=max.y){
            //Log.d("mylog", "***Found a view: " + v.getId());
            touched = true;
            if (event.getAction() == MotionEvent.ACTION_UP) touched = false;
        }
    }
    return touched;
    }

そして、onTouchEvent をインターセプトし、2 つの ImageView を管理するアクティビティの関数オーバーライド

@Override
public boolean onTouchEvent (MotionEvent event) {

    if (isTouched(button1,event)) {
        // it is pressed
        if ((Integer)button1.getTag() == 0) {  // but before wasn't pressed
            mp1.start();
            button1.setBackgroundResource(R.drawable.happy_on);
            button1.setTag(1);

            // start music 1
        }
    } else {
        // it isn't pressed
        if ((Integer)button1.getTag() == 1) {   // and before it was pressed
            mp1.stop();
            try {
                mp1.prepare();
            } catch (IOException e) {
                e.printStackTrace(); 
            }  catch (IllegalStateException e) {
                Log.e("hb","illegal state exception mp2") ;
                mp1= MediaPlayer.create(getBaseContext(), R.raw.female01) ;

            }

            button1.setBackgroundResource(R.drawable.happy_off);
            button1.setTag(0);
            // stop music 1
        }
    }

         if (isTouched(button2,event)) {
             // it is pressed
             if ((Integer)button2.getTag() == 0) {  // but before wasn't pressed
                 mp2.start();

                 button2.setBackgroundResource(R.drawable.to_on);
                 button2.setTag(1);
                 // start music 2
             }

         } else {
             // it isn't pressed
             if ((Integer)button2.getTag() == 1) {   // and before it was pressed
                 mp2.stop();
                 try {
                     mp2.prepare();
                 } catch (IOException e) {
                     e.printStackTrace(); 
                 } catch (IllegalStateException e) {
                     Log.e("hb","illegal state exception mp2") ;
                     mp2= MediaPlayer.create(getBaseContext(), R.raw.female02) ;                     }

                 button2.setBackgroundResource(R.drawable.to_off);
                 button2.setTag(0);
                 // stop music 1
             }
         }

    return false;

    }

ボタン (私は imageview を使用) はピアノの鍵盤のように押されます: 1 本、2 本の指でそれを渡すことができ、ポインターがビューに入ると非同期アクションが開始されます。event_up またはポインターがボタンを離れると、アクションが停止します。

これは機能しますが、非常に遅い方法です。多くの action_move イベントが殺到します。

マルチタッチ管理のこの方法を最適化する方法を知っている人はいますか?

編集: mp1 と mp2 は mp3 mediaplayer オブジェクトです。ポインターを離さずにボタンから別のボタンに渡すと機能しますが、メロディーがジャンプする数ミリ秒のギャップがあります。私が作りたい効果は、ピアノの鍵盤のような、隙間のないものです。

機能の重みでズレが生じると思いますが触れました。この体重を減らすにはどうすればよいですか?

ありがとうございました

4

1 に答える 1

0

XML で使用または定義する代わりに、通常Buttonの s を複数の状態のドローアブルで使用する必要があります。あなたが現在直面している問題は、あなたが下した欠陥のある設計上の決定の最初の側面にすぎないと思います。ImageViewsetOnClickListener(...)android:onclick

于 2013-01-14T16:45:48.277 に答える