【问题标题】:Android buttons issuesAndroid 按钮问题
【发布时间】:2017-03-02 05:18:57
【问题描述】:

我正在制作一个钢琴应用程序,其中有九个按钮,当我们触摸按钮时,每个按钮都会播放不同的声音。但现在的问题是——

1) 当我们触摸按钮时,它只会播放该按钮的声音,而不会在移动手指时播放下一个按钮的声音。

2)如果我使用 ACTION_UP 停止声音,那么在这些事件中,当我们将手指从按钮上抬起时,它会停止声音而不会完成该按钮的完整声音。

   public class Piano_view extends Activity implements View.OnTouchListener {

    Button sound1, sound2, sound3, sound4, sound5, sound6, sound7, sound8,
            sound9;

    MediaPlayer mp1, mp2, mp3, mp4, mp5, mp6, mp7, mp8, mp9;



    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.piano_view);
        initMpFiles();
        setVolumeControlStream(AudioManager.STREAM_MUSIC);





        sound1 = (Button) findViewById(R.id.one);
        sound2 = (Button) findViewById(R.id.second);
        sound3 = (Button) findViewById(R.id.three);
        sound4 = (Button) findViewById(R.id.four);
        sound5 = (Button) findViewById(R.id.five);
        sound6 = (Button) findViewById(R.id.six);
        sound7 = (Button) findViewById(R.id.seven);
        sound8 = (Button) findViewById(R.id.eight);
        sound9 = (Button) findViewById(R.id.nine);

        sound1.setOnTouchListener(this);
        sound2.setOnTouchListener(this);
        sound3.setOnTouchListener(this);
        sound4.setOnTouchListener(this);
        sound5.setOnTouchListener(this);
        sound6.setOnTouchListener(this);
        sound7.setOnTouchListener(this);
        sound8.setOnTouchListener(this);
        sound9.setOnTouchListener(this);
    }

    private void initMpFiles() {
        mp1 = MediaPlayer.create(Piano_view.this, R.raw.a4);
        mp2 = MediaPlayer.create(Piano_view.this, R.raw.b4);
        mp3 = MediaPlayer.create(Piano_view.this, R.raw.c4);
        mp4 = MediaPlayer.create(Piano_view.this, R.raw.c5);
        mp5 = MediaPlayer.create(Piano_view.this, R.raw.e4);
        mp6 = MediaPlayer.create(Piano_view.this, R.raw.b4);
        mp7 = MediaPlayer.create(Piano_view.this, R.raw.f4);
        mp8 = MediaPlayer.create(Piano_view.this, R.raw.d4);
        mp9 = MediaPlayer.create(Piano_view.this, R.raw.g4);
    }





    @Override
    public boolean onTouch(View v, MotionEvent event) {
        int id = v.getId();
        switch (id) {
            case R.id.one:

                float x = event.getX();
                float y = event.getY();
                if (event.getAction() == android.view.MotionEvent.ACTION_DOWN) {
                    mp1.start();
                    mp1.seekTo(0);
                    v.setPressed(true);
                    return true;
                }

                break;
            case R.id.second:
                if (event.getAction() == android.view.MotionEvent.ACTION_DOWN) {
                    mp2.start();
                    mp2.seekTo(0);
                    v.setPressed(true);
                    return true;
                }
                break;
            case R.id.three:
                if (event.getAction() == android.view.MotionEvent.ACTION_DOWN) {
                    mp3.start();
                    mp3.seekTo(0);
                    v.setPressed(true);
                    return true;
                }
                break;
            case R.id.four:
                if (event.getAction() == android.view.MotionEvent.ACTION_DOWN) {
                    mp4.start();
                    mp4.seekTo(0);
                    v.setPressed(true);
                    return true;
                }
                break;



            case R.id.five:
                if (event.getAction() == android.view.MotionEvent.ACTION_DOWN) {
                    mp5.start();
                    mp5.seekTo(0);

                    v.setPressed(true);
                    return true;
                }
                break;
            case R.id.six:
                if (event.getAction() == android.view.MotionEvent.ACTION_DOWN) {
                    mp6.start();
                  mp6.seekTo(0);
                    v.setPressed(true);
                    return true;
                }
                break;
            case R.id.seven:
                if (event.getAction() == android.view.MotionEvent.ACTION_DOWN) {
                    mp7.start();
                   mp7.seekTo(0);
                    v.setPressed(true);
                    return true;
                }
                break;
            case R.id.eight:
                if (event.getAction() == android.view.MotionEvent.ACTION_DOWN) {

                 mp8.start();
                    mp8.seekTo(0);
                    v.setPressed(true);
                    return true;
                }
                break;
            case R.id.nine:
                if (event.getAction() == android.view.MotionEvent.ACTION_DOWN) {
                    mp9.start();
                    mp9.seekTo(0);
                    v.setPressed(true);
                    return true;
                }


                    break;








        }
        return true;
    }


}

【问题讨论】:

    标签: android android-mediaplayer


    【解决方案1】:

    您可以使用 onTouch 并在新线程中开始播放音乐。如果你正在移动线程继续运行。 您可以使用处理程序。

    Handler handler = new Handler();
    

    在你的 onTouch 监听器中。我不确定它是否与 ACTION_DOWN 一起使用。您还可以添加 ACTION_MOVE 来检测移动。

                        int x = (int) motionEvent.getRawX() - coords[0];
                        int y = (int) motionEvent.getRawY() - coords[1];
                    if (event.getAction() == android.view.MotionEvent.ACTION_DOWN || event.getAction() == android.view.MotionEvent.ACTION_MOVE) {
                        if(put your test with the coodinates here){
                            handler.post(runMp1);
                            return true;
                        }
                    }
    
                break;
    

    现在您需要检查触摸坐标是否在按钮坐标内。一个例子可以是

     int M1right = (int) button.getRight();
     int M1top = (int) button.getTop();
     int M1left = (int) button.getLeft();
     int M1bottom = (int) button.getBottom();
    
     if(x < M1right && x > M1left && y < M1bottom && y > M1top)
    

    那么你需要一个线程

    private Runnable runMp1 = new Runnable() {
        @Override
        public void run() {
            mp1.start();
            mp1.seekTo(0);
            v.setPressed(true);
        }
    };
    

    另外你可以添加一个布尔变量,它被设置为 fase 直到声音结束。仅当此 var 为 true 时,处理程序才会启动。

    希望能解决您的问题。祝你有美好的一天!

    【讨论】:

    • 感谢您的回答,但请您详细解释一下,我如何使用 ACTION_UP 在新线程中为所有按钮启动音乐
    • 我的遮阳篷足够详细吗?或者有什么问题吗?
    【解决方案2】:

    在这种情况下,您不应该使用 Button。绘制一个包含 “9 个按钮” 的视图并自行处理触摸事件。

    【讨论】:

    • 谢谢,您能否给我发一个链接,其中包含我们绘制包含按钮的视图的示例。
    猜你喜欢
    • 1970-01-01
    • 2011-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多