Android

时间:2017-03-21 16:42:06

标签: android css xml android-layout android-button

我正在为Android制作钢琴应用程序。使用xml,我制作了两个矩形按钮,一个白键和一个黑键。我需要黑键与普通钢琴重叠两个白键。

我有两个不同的状态(按下和未按下),我在其中创建了两个不同的可绘制xml文件。按下黑键,它工作正常。但是当我按下白键时,新的可绘制形状与黑键重叠。

正常

Normal

White Pressed

White Pressed

据我所知,默认情况下,黑键位于其他两个白键之上,因为我在XML中最后定义了它。也许是因为我在按下按钮时访问了一个新的可绘制文件作为按钮的来源,它是否在顶部绘制了视图?反正有没有阻止这个?我已经为下面的每个XML文件提供了代码。谢谢你的帮助!

主XML:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"      android:layout_width="match_parent"
android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin"
android:background="#ffcccccc"
android:gravity="top|center"
tools:context=".MainActivity">
<Button
    android:layout_width="45dp"
    android:layout_height="150dp"
    android:layout_marginTop="100dp"
    android:background="@drawable/wselector"
    android:id="@+id/button1"


    />

<Button
    android:layout_width="45dp"
    android:layout_height="150dp"
    android:layout_marginTop="100dp"
    android:background="@drawable/wselector"
    android:id="@+id/button2"
    android:layout_toRightOf="@id/button1"

    />
<Button
    android:layout_width="40dp"
    android:layout_height="100dp"
    android:layout_marginTop="100dp"
    android:background="@drawable/selector"
    android:id="@+id/button3"
    android:layout_toRightOf="@id/button1"
    android:layout_marginLeft="-20dp"
    android:onClick="soundmmm"
    />

选择器XML:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true" android:drawable="@drawable/wpressed"
    android:paddingTop="10sp"></item>
<item android:drawable="@drawable/wnormal" android:layout_marginTop="50dp">
</item>
</selector>

未压缩的XML:

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/shadow" />

<item android:bottom="@dimen/layer_padding">
    <shape android:shape="rectangle">
        <corners android:radius="@dimen/corner_radius" />
        <solid android:color="#ffffffff"/>
    </shape>
</item>
</layer-list>

按下XML:

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item>
    <shape android:shape="rectangle">
        <solid android:color="#00000000"/>
    </shape>
</item>
<item android:top="@dimen/layer_padding">
    <shape android:shape="rectangle">
        <corners android:radius="@dimen/corner_radius" />
        <solid android:color="#ffffffff" />
    </shape>
</item>
</layer-list>

2 个答案:

答案 0 :(得分:0)

取每个Button并将其包裹在FrameLayout中,如下所示:

    <FrameLayout
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_toRightOf="@id/button1">

    <Button
        android:id="@+id/button2"
        android:layout_width="45dp"
        android:layout_height="150dp"
        android:layout_marginTop="100dp"
        android:background="@drawable/wselector"
        android:onClick="soundmmm" />
</FrameLayout>

(这只是右侧白键的演示。)Android应尊重FrameLayout的布局顺序,并将白键图像保留在黑键后面。

此解决方案的缺点是它会使您的布局复杂化。如果你能找到一个避免额外布局的解决方案,我会选择它;否则,这应该适合你。

答案 1 :(得分:0)

机器人:stateListAnimator =&#34; @空&#34;

Don't bring button to foreground on click

这对我有用。事实证明它根本与按钮状态无关,而是默认的Android按钮动画。