Android ImageButton没有在RelativeLayout中强制执行透明度

时间:2018-03-16 18:13:01

标签: android transparency android-relativelayout android-imagebutton

我正在尝试将两个图像按钮和一些文本放在一行上。以下是布局的XML:

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

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="28dp"
        android:layout_marginTop="5dp"
        android:orientation="horizontal">

        <ImageButton
            android:id="@+id/sectionDelete"
            android:layout_width="35dp"
            android:layout_height="28dp"
            android:layout_alignParentLeft="true"
            android:src="@drawable/button_delete" />

        <TextView
            android:id="@+id/header"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_toRightOf="@+id/sectionDelete"
            android:text="test"
            android:textAllCaps="true"
            android:textColor="@color/navigation_bar"
            android:textSize="16sp"
            android:textStyle="bold" />

        <ImageButton
            android:id="@+id/sectionAdd"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentRight="true"
            android:background="@drawable/button_add" />

    </RelativeLayout>

    <View
        android:id="@+id/line"
        android:layout_marginTop="8dp"
        android:layout_width="match_parent"
        android:layout_height="2dp"
        android:background="@android:color/darker_gray" />

</LinearLayout>
</mycompany>

drawable中每个按钮的选择器XML:

button_delete.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android" >
    <item android:drawable="@drawable/delete_button_pressed"
      android:state_pressed="true" />
    <item android:drawable="@drawable/delete_button"
      android:state_focused="true" />
     <item android:drawable="@drawable/delete_button" />
</selector>

button_add.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android" >
    <item android:drawable="@drawable/button_add_pressed"
      android:state_pressed="true" />
    <item android:drawable="@drawable/button_add_normal"
      android:state_focused="true" />
     <item android:drawable="@drawable/button_add_normal" />
</selector>

在构建器中看起来都很好:

enter image description here

但是在应用程序中,灰色背景会丢失,并且会显示图像边缘(透明),但仅适用于第一张图像:

enter image description here

奇怪的是,第一个图像按钮无法识别图像的透明背景。另外,我需要弄乱RelativeLayout和第一个ImageButton的宽度和高度,以使它接近正确的大小。随着第二,我没有做任何事情。第一张图片没什么特别的。

以下是目录中的图片:

enter image description here

最后一个问题 - 如果空间太长,如何在第二张图像之前进行文本换行?现在它在包装之前写在第二张图片下面:

enter image description here

以下是所有删除图片。似乎有透明的背景,但我远非Gimp专家。还不确定StackOverflow是否保留原始..

enter image description here enter image description here

更新

我已经确认图像是透明的。图像仍然具有白色背景。我还更新了XML,如下所示:

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

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="5dp"
        android:orientation="horizontal">

        <ImageButton
            android:id="@+id/sectionDelete"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentLeft="true"
            android:layout_alignParentStart="true"
            android:background="@drawable/button_delete" />

        <TextView
            android:id="@+id/header"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_toRightOf="@+id/sectionDelete"
            android:layout_toEndOf="@+id/sectionDelete"
            android:layout_toLeftOf="@+id/sectionAdd"
            android:text="test"
            android:textAllCaps="true"
            android:textColor="@color/navigation_bar"
            android:textSize="16sp"
            android:textStyle="bold" />

        <ImageButton
            android:id="@+id/sectionAdd"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentRight="true"
            android:layout_alignParentEnd="true"
            android:background="@drawable/button_add" />

    </RelativeLayout>

    <View
        android:id="@+id/line"
        android:layout_marginTop="8dp"
        android:layout_width="match_parent"
        android:layout_height="2dp"
        android:background="@android:color/darker_gray" />

</LinearLayout>
</mycompany>

4 个答案:

答案 0 :(得分:0)

您应该使用:

    <ImageButton
                android:id="@+id/sectionDelete"
                android:layout_width="35dp"
                android:layout_height="28dp"
                android:layout_alignParentLeft="true"
                android:src="@drawable/button_delete"
                android:background="@android:color/transparent"/>

答案 1 :(得分:0)

使用&#34; @ null&#34;像ImageButton上的背景:

<ImageButton
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    app:srcCompat="@drawable/bkash"
    android:id="@+id/bid1"
    android:layout_alignParentTop="true"
    android:layout_alignParentLeft="true"
    android:layout_alignParentStart="true"
    android:background="@null" />

答案 2 :(得分:0)

您没有将正在使用的实际PNG文件包含在删除按钮的图标中(来自Windows资源管理器的屏幕截图显示磁盘上的此文件还不够),但我几乎可以肯定此文件缺少alpha通道。相反,您希望使用零Alpha通道值设置的每个像素都有白色。

在某个图像编辑器中打开图形并将这些白色像素更改为透明将解决您的问题,但是至于您的布局在构建器中“看起来与设备不同”的原因,这是因为有一个默认主题应用于每个应用程序的系统,您可以在这里阅读更多相关信息:https://developer.android.com/guide/topics/ui/look-and-feel/themes.html

此默认值,操作系统和设备特定的值集确定了应用程序作者未确定的内容。

对于您的设备,其操作系统将应用程序的背景颜色确定为灰色,而构建器则不然。您的建造者选择背景为白色。您的删除按钮的图形从未透明,但在构建器的白色背景上看起来就像是。

要使它看起来像构建器,您需要专门将背景应用于视图的根目录。在这种情况下,它是一个LinearLayout,应该如下所示:

<LinearLayout 
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="#ffffff">

答案 3 :(得分:0)

1)@DimDim有正确的解决方案,如果它不起作用,删除按钮可能在图像中有白色背景,与png查看器交叉检查。

2)为防止文本溢出,请尝试此

<TextView
            android:id="@+id/header"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_toRightOf="@+id/sectionDelete"
            android:layout_toLeftOf="@+id/sectionAdd"
            android:text="test"
            android:textAllCaps="true"
            android:textColor="@color/navigation_bar"
            android:textSize="16sp"
            android:textStyle="bold" />

并将此textview上方的“添加图像”按钮放在XML中,因为此textview需要引用sectionAdd。