0

我的应用程序有一个音乐风琴的背景图像,我使用LinearLayouts 和Buttons 并将它们的背景设置@null为键。

我已经实现了我的布局,View.OnTouchListener并在OnTouch我播放相关声音MotionEvent.ACTION_DOWN并停止它MotionEvent.ACTION_UP

这种工作正常,除了当我的手指滑过按钮(风琴键)时,因为它们是按钮(我认为),除非我抬起并修饰按钮,否则不会触发新的 ontouch 事件。

任何人都可以建议一个更好的布局,使用其他一些控件,也许这将使我能够检测到它们之间的滑动以实现向上或向下滑动键盘效果?

我真的不想从头开始绘制它们的键,因为我想利用比绘制的矩形更令人愉悦的背景图像(用于风琴键盘)中的图形。谢谢

    <LinearLayout android:id="@+id/ll" android:layout_width="fill_parent" android:layout_height="fill_parent" android:background="@drawable/vibrato_off" android:orientation="vertical" android:weightSum="95" xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" tools:context=".main">
<LinearLayout android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="70"></LinearLayout>
<LinearLayout android:id="@+id/llblack" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="11">
    <View android:layout_width="1dp" android:layout_height="0dip" android:layout_weight="1.5"/>
    <android.view.View android:id="@+id/vib_off" android:layout_width="0dp" android:layout_height="fill_parent" android:layout_weight="1" android:background="@null"/>
    <View android:layout_width="1dp" android:layout_height="0dip" android:layout_weight="0.4"/>
    <android.view.View android:id="@+id/a2u" android:layout_width="0dp" android:layout_height="fill_parent" android:layout_weight="0.5" android:background="@null"/>
    <android.view.View android:id="@+id/a2sharp" android:layout_width="0dp" android:layout_height="fill_parent" android:layout_weight="1" android:background="@null"/>
    <android.view.View android:id="@+id/b2u" android:layout_width="0dp" android:layout_height="fill_parent" android:layout_weight="0.5" android:background="@null"/>
    <android.view.View android:id="@+id/c3u" android:layout_width="0dp" android:layout_height="fill_parent" android:layout_weight="0.5" android:background="@null"/>
    <android.view.View android:id="@+id/c3sharp" android:layout_width="0dp" android:layout_height="fill_parent" android:layout_weight="1" android:background="@null"/>
    <android.view.View android:id="@+id/d3sharp" android:layout_width="0dp" android:layout_height="fill_parent" android:layout_weight="1" android:background="@null"/>
    <android.view.View android:id="@+id/e3u" android:layout_width="0dp" android:layout_height="fill_parent" android:layout_weight="0.5" android:background="@null"/>
    <android.view.View android:id="@+id/f3u" android:layout_width="0dp" android:layout_height="fill_parent" android:layout_weight="0.5" android:background="@null"/>
    <android.view.View android:id="@+id/f3sharp" android:layout_width="0dp" android:layout_height="fill_parent" android:layout_weight="1" android:background="@null"/>
    <android.view.View android:id="@+id/g3sharp" android:layout_width="0dp" android:layout_height="fill_parent" android:layout_weight="1" android:background="@null"/>
    <android.view.View android:id="@+id/a3sharp" android:layout_width="0dp" android:layout_height="fill_parent" android:layout_weight="1" android:background="@null"/>
    <android.view.View android:id="@+id/b3u" android:layout_width="0dp" android:layout_height="fill_parent" android:layout_weight="0.5" android:background="@null"/>
    <android.view.View android:id="@+id/c4u" android:layout_width="0dp" android:layout_height="fill_parent" android:layout_weight="0.5" android:background="@null"/>
    <android.view.View android:id="@+id/c4sharp" android:layout_width="0dp" android:layout_height="fill_parent" android:layout_weight="1" android:background="@null"/>
    <android.view.View android:id="@+id/d4sharp" android:layout_width="0dp" android:layout_height="fill_parent" android:layout_weight="1" android:background="@null"/>
    <android.view.View android:id="@+id/e4u" android:layout_width="0dp" android:layout_height="fill_parent" android:layout_weight="0.5" android:background="@null"/>
    <View android:layout_width="1dp" android:layout_height="0dip" android:layout_weight="0.5"/>
</LinearLayout>
<LinearLayout android:id="@+id/llwhite" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="9">
    <View android:layout_width="1dp" android:layout_height="0dip" android:layout_weight="1.5"/>
    <android.view.View android:id="@+id/vib_on" android:layout_width="0dp" android:layout_height="fill_parent" android:layout_weight="1" android:background="@null"/>
    <View android:layout_width="1dp" android:layout_height="0dip" android:layout_weight="0.4"/>
    <android.view.View android:id="@+id/a2" android:layout_width="0dp" android:layout_height="fill_parent" android:layout_weight="1" android:background="@null"/>
    <android.view.View android:id="@+id/b2" android:layout_width="0dp" android:layout_height="fill_parent" android:layout_weight="1" android:background="@null"/>
    <android.view.View android:id="@+id/c3" android:layout_width="0dp" android:layout_height="fill_parent" android:layout_weight="1" android:background="@null"/>
    <android.view.View android:id="@+id/d3" android:layout_width="0dp" android:layout_height="fill_parent" android:layout_weight="1" android:background="@null"/>
    <android.view.View android:id="@+id/e3" android:layout_width="0dp" android:layout_height="fill_parent" android:layout_weight="1" android:background="@null"/>
    <android.view.View android:id="@+id/f3" android:layout_width="0dp" android:layout_height="fill_parent" android:layout_weight="1" android:background="@null"/>
    <android.view.View android:id="@+id/g3" android:layout_width="0dp" android:layout_height="fill_parent" android:layout_weight="1" android:background="@null"/>
    <android.view.View android:id="@+id/a3" android:layout_width="0dp" android:layout_height="fill_parent" android:layout_weight="1" android:background="@null"/>
    <android.view.View android:id="@+id/b3" android:layout_width="0dp" android:layout_height="fill_parent" android:layout_weight="1" android:background="@null"/>
    <android.view.View android:id="@+id/c4" android:layout_width="0dp" android:layout_height="fill_parent" android:layout_weight="1" android:background="@null"/>
    <android.view.View android:id="@+id/d4" android:layout_width="0dp" android:layout_height="fill_parent" android:layout_weight="1" android:background="@null"/>
    <android.view.View android:id="@+id/e4" android:layout_width="0dp" android:layout_height="fill_parent" android:layout_weight="1" android:background="@null"/>
    <View android:layout_width="1dp" android:layout_height="0dip" android:layout_weight="0.4"/>
</LinearLayout>

4

1 回答 1

2

我假设您正在做一些数学运算以知道将按钮放在哪里,以便它们与背景图像相对应。

如果您将 an 设置OnTouchListener为整体LinearLayout并实现它以在 and 上执行操作ACTION_DOWNACTION_UP您可以使用相同的数学计算来确定用户触摸的位置LinearLayout以了解他或她实际打算按下的键。所以你根本不需要按钮。

然后,您将实现侦听器以也做一些事情,ACTION_MOVE并借助您已经在做的数学运算,您可以弄清楚用户何时用他或她的手指离开了一个键并移动到另一个键。因此,您基本上会将手指的当前坐标与onTouch()之前调用该方法时的坐标进行比较,这样您就可以知道移动到了哪个键,以便您可以开始播放它的声音,以及它从哪个键开始,以便您可以停止播放上一个的声音。如果运动在同一个键上开始和结束,你什么也不做。

大约一年前,当我实现一个日历时,我做了类似的事情,用户可以通过从一个日历单元滑动到另一个来选择一个间隔。并且日历必须随着用户滑动而更新,所以我还必须知道他或她何时离开一个单元格并将手指移动到另一个单元格。所以我确信,如果你正确地实施它,它会起作用。

我假设,因为它应该是一个模拟钢琴的应用程序,所以您需要允许用户不仅用一个手指滑动键盘,而且用两个(或更多)手指滑动键盘,对吧?我认为这也应该很容易实现,因为它MotionEvent携带有关执行该动作的指针(手指、鼠标指针……)的信息。我对此没有任何经验,但您可以在MotionEvent此处的文档中阅读更多相关信息:http: //developer.android.com/reference/android/view/MotionEvent.html

希望能帮助到你。如果您还有其他问题,我很乐意回答(更具体地说,我还有日历的代码。)

祝你好运。

编辑回答评论:

我不是说用Views 代替Buttons。我的意思是您的布局仅包含LinearLayout设置为背景图像的 a 。就是这样。然后在代码中,你附加一个OnTouchListener它,在onTouch()方法中,你计算位置。在我的脑海中,我认为你可以这样做:

我假设该应用程序应该在横向模式下使用,并且钢琴的图像覆盖整个屏幕。假设您有 8 个白色钢琴键。通过将屏幕宽度除以 8,您可以知道设备上一个钢琴键的宽度。您还知道一个键的开始位置和结束位置。假设一个键的宽度为 50 像素。然后第一个从第 1 个像素开始,到第 50 个像素结束。第二个从 51 日开始,到 100 日结束。等等。

因此,如果触摸事件发生,您可以通过调用MotionEvent.getX或访问其坐标MotionEvent.getY。现在我不知道你是否需要getXor getY,你必须弄清楚。因此,假设该方法返回一个类似 94 的数字。当您将其除以先前计算的钢琴键宽,并将结果四舍五入到最接近的整数时,您将知道用户按下了哪个键。所以如果宽度是 50,你做 94 / 50 = 1.88,四舍五入到 2,你就有了第二个键。

并且您应该将getX/getY变量存储在您的活动中,以便当您检测到下一个事件时,您可以知道发生了什么。因此,如果你ACTION_DOWN在第二个键上得到一个,然后你得到一个ACTION_MOVE并且你计算它实际上已经在第三个键上,你知道用户已经按下第二个键,然后滑到第三个键。所以你停止播放第二个键的声音并开始播放第三个键的声音。

我希望这是有道理的,并且这不是一种过于原始和愚蠢的方法。:)

于 2013-04-23T13:16:07.823 回答