OntouchListener拖动按钮

时间:2014-02-17 15:16:19

标签: android android-button

我正在为Android开发一个钢琴应用程序。我正在尝试为我的活动中的所有8个按钮实现OnTouchListener。因此,当用户拖动或滑动手指时,我希望所有按钮都能播放声音。我认为下面的图片更好地解释了它。

请参阅?当用户将手放在第一个按钮上然后拖动到最后一个按钮时,我希望所有8个按钮都能播放该歌曲。但我无法实现它。下面的java代码仅适用于第一个按钮,但7个按钮的其余部分不会被按下。

这是:

@Override
public boolean onTouch(View v, MotionEvent event) {
    switch(v.getID())
    {
        case(R.id.btn1):
        //play button 1 sound
        break;

        case(R.id.btn2):
        //play button 2 sound
        break;

        case(R.id.btn3):
        //play button 3 sound
        break;

        case(R.id.btn4):
        //play button 4 sound
        break;

        case(R.id.btn5):
        //play button 1 sound
        break;

        case(R.id.btn6):
        //play button 6 sound
        break;

        case(R.id.btn7):
        //play button 7 sound
        break;

        case(R.id.btn8):
        //play button 8 sound
        break;
        }          
    return true;
    }

我已经看过this个问题和this,但在那里找不到答案。

请帮帮我。谢谢你的时间!

1 个答案:

答案 0 :(得分:0)

您应该在包含钢琴按钮的布局上实现onTouchListner

想法是在渲染后将所有钢琴按钮位置放在屏幕上(x,y)。

然后使用getX()和getY()方法获得触摸位置。

此时,您可以通过检查触摸x和y是否在视图开始和

之间来处理它

结束x和y,然后播放视图的声音。

在这个例子中,我使用soundpool和音调来播放不同的声音(我知道这不是完美的方式),而且我也在研究x因子,因为我只使用钢琴白键。

import android.app.Activity;
import android.media.*;
import android.os.Bundle;
import android.view.*;
import android.widget.*;

import java.util.ArrayList;
import java.util.List;


public class MainActivity extends Activity
{

    //The layout that holds the piano keys.
    LinearLayout pianoKeysContainer;

    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        pianoKeysContainer = (LinearLayout) findViewById(R.id.key_container);
        pianoKeysContainer.setOnTouchListener(onYourViewTouchListener);
    }


    //Here we load the view positions after render it and fill the array with the positions
    private List<Integer> positionsLeft_whiteKeys  = new ArrayList<Integer>();
    private List<Integer> positionsRight_whiteKeys = new ArrayList<Integer>();

    public void onWindowFocusChanged(boolean hasFocus)
    {
        super.onWindowFocusChanged(hasFocus);

        for (int i = 0; i < pianoKeysContainer.getChildCount(); i++)
        {
            //positionsLeft_whiteKeys holds the start x of each view.
            positionsLeft_whiteKeys.add(pianoKeysContainer.getChildAt(i).getLeft());
            //positionsRight_whiteKeys holds the end x of each view.
            positionsRight_whiteKeys.add(pianoKeysContainer.getChildAt(i).getRight());
        }
    }

    public View.OnTouchListener onYourViewTouchListener = new View.OnTouchListener()
    {
        float positionX;
        FrameLayout pianoKey;
        FrameLayout lastPlayedKey;
        ArrayList<FrameLayout> pressedKeys = new ArrayList<FrameLayout>();

        @Override
        public boolean onTouch(View view, MotionEvent motionEvent)
        {

            positionX = motionEvent.getX();

            float pitch;

            //Looping on the child of the layout which contains the piano keys
            for (int x = 0; x < ((LinearLayout) view).getChildCount(); x++)
            {
                // Calculating the pitch to get good chords
                pitch = (float) Math.pow(Math.pow(2.0, 1 / 12.0), (float) x);

                pianoKey = (FrameLayout) ((LinearLayout) view).getChildAt(x);

                if (positionsLeft_whiteKeys.size() >= 0 && positionsRight_whiteKeys.size() >= 0)
                {
                    if (positionX > positionsLeft_whiteKeys.get(x) && positionX < positionsRight_whiteKeys.get(x))
                    {
                        pianoKey = (FrameLayout) ((LinearLayout) view).getChildAt(x);

                        if (pianoKey != null)
                        {
                            pianoKey.setBackgroundResource(R.drawable.piano_key_pressed);
                            pressedKeys.add(pianoKey);
                        }
                        if (lastPlayedKey != pianoKey)
                            playKey(pitch);

                        lastPlayedKey = pianoKey;
                        break;
                    }

                    if (lastPlayedKey != null)
                    {
                        pianoKey.setBackgroundResource(R.drawable.piano_key);
                        lastPlayedKey.setBackgroundResource(R.drawable.piano_key);

                    }
                }
            }

            if (motionEvent.getAction() == MotionEvent.ACTION_UP)
            {
                lastPlayedKey = null;

                for (FrameLayout pressedKey : pressedKeys)
                {
                    pressedKey.setBackgroundResource(R.drawable.piano_key);
                }


            }

            return false;
        }
    };


    //This is sound play method
    SoundPool   sp = new SoundPool(1, AudioManager.STREAM_MUSIC, 1);
    public void playKey(final float pitch)
    {

        //here you should store your piano sound at res/raw then load it
        sp.load(this, R.raw.piano, 1);

        sp.setOnLoadCompleteListener(new SoundPool.OnLoadCompleteListener()
        {
            @Override
            public void onLoadComplete(SoundPool soundPool, int i, int i2)
            {
                soundPool.play(i, 0.99f, 0.99f, 1, 0, pitch);
            }
        });
    }

}

这是xml文件(main.xml)

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:orientation="vertical"
              android:layout_width="match_parent"
              android:layout_height="match_parent">

    <LinearLayout
        android:orientation="horizontal"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:clickable="true"
        android:id="@+id/key_container">

        <FrameLayout
            android:layout_height="match_parent"
            android:layout_marginRight="2dp"
            android:layout_width="48dp"
            android:background="@drawable/piano_key"/>

        <FrameLayout
            android:layout_height="match_parent"
            android:layout_marginRight="2dp"
            android:layout_width="48dp"
            android:background="@drawable/piano_key"/>

        <FrameLayout
            android:layout_height="match_parent"
            android:layout_marginRight="2dp"
            android:layout_width="48dp"
            android:background="@drawable/piano_key"/>

        <FrameLayout
            android:layout_height="match_parent"
            android:layout_marginRight="2dp"
            android:layout_width="48dp"
            android:background="@drawable/piano_key"/>

        <FrameLayout
            android:layout_height="match_parent"
            android:layout_marginRight="2dp"
            android:layout_width="48dp"
            android:background="@drawable/piano_key"
            />

        <FrameLayout
            android:layout_height="match_parent"
            android:layout_marginRight="2dp"
            android:layout_width="48dp"
            android:background="@drawable/piano_key"/>

        <FrameLayout
            android:layout_height="match_parent"
            android:layout_marginRight="2dp"
            android:layout_width="48dp"
            android:background="@drawable/piano_key"/>

        <FrameLayout
            android:layout_height="match_parent"
            android:layout_marginRight="2dp"
            android:layout_width="48dp"
            android:background="@drawable/piano_key"/>

        <FrameLayout
            android:layout_height="match_parent"
            android:layout_marginRight="2dp"
            android:layout_width="48dp"
            android:background="@drawable/piano_key"/>

        <FrameLayout
            android:layout_height="match_parent"
            android:layout_marginRight="2dp"
            android:layout_width="48dp"
            android:background="@drawable/piano_key"/>

        <FrameLayout
            android:layout_height="match_parent"
            android:layout_marginRight="2dp"
            android:layout_width="48dp"
            android:background="@drawable/piano_key"/>

        <FrameLayout
            android:layout_height="match_parent"
            android:layout_marginRight="2dp"
            android:layout_width="48dp"
            android:background="@drawable/piano_key"/>

    </LinearLayout>


</LinearLayout>

注意:完成示例的唯一方法就是放置 钢琴键图像(按下并未按下)并放入钢琴音色 在res / raw