Android MapView控件更改背景颜色而不影响其他视觉属性

时间:2012-10-20 07:19:43

标签: android background styles android-mapview

我有一个Android应用程序,它使用带有MapView控件的ImageButton(移动到用户的当前位置)我已添加到右上角。我遇到的问题是ImageButton控件的背景太透明,但用android:background="#BBFFFFFF"更改它会改变背景的大小并删除按下按钮时通常会看到的蓝色“闪光” - 两个品质我希望保留。

我从这样的事情开始:

<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" >

<com.google.android.maps.MapView
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/mapview"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:clickable="true"
android:apiKey="my api key"
/>

<ImageButton android:id="@+id/googlemaps_select_location"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentTop="true"
    android:layout_alignParentRight="true"
    android:layout_marginTop="13dp"
    android:layout_marginRight="13dp"

    android:src="@drawable/device_access_location_found"/> 

</RelativeLayout>

这实现了这样的事情:

ImageButton control with background that is too transparent

然后我补充说:

android:background="#BBFFFFFF"

我明白了:

ImageButton control with more opaque background but other properties affected

请注意,虽然这基本上是我想要的不透明度,但更改背景会影响填充,并且在按下时也不会显示蓝色“闪光”(显然在此问题中未说明)。< / p>

所以我的问题是,如何保持非按下状态下的背景颜色/不透明度,同时保留按钮的其他视觉质量?我简单地阅读了关于Android风格和主题的内容,但是甚至无法弄清楚这个按钮从哪个样式获取其样式/主题,以及如何在保留所有其他视觉功能的同时覆盖背景颜色/不透明度。

2 个答案:

答案 0 :(得分:1)

<强>问题

当您为视图背景指定固定颜色时,您将使用您定义的固定颜色替换视图中的默认背景。

实际上,按钮的背景不是简单的固定颜色。它是颜色或绘图的状态列表,这意味着,根据按钮状态(焦点,选择,按下等),使用不同的背景,导致按下按钮时看到的“闪光”动画。如果用简单的固定颜色替换此状态列表,而不依赖于按钮状态,则会得到固定的背景(即按下按钮时不会改变)。

解决

有一个xml参数可用于更改图像视图的alfa(即透明度),即:

        android:alpha="1"

其中上面的值1可以是介于0和1之间的任何浮点数,最大值为1。 但是,我认为这不是解决您的问题,因为如果我正确理解您的问题,您想要更改背景的alfa而不是图像alfa。无论如何,默认值似乎是1

应该为你工作的一种可能性是定义一个selector作为背景。选择器将根据其状态选择drawable。

示例

<?xml version="1.0" encoding="UTF-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
  <item android:state_pressed="true" android:drawable="@android:color/darker_gray" />
  <item android:drawable="@android:color/white" />
</selector>

将上面的xml文件保存在drawable-xxxx文件夹中,名称为my_selector 在这个例子中,我使用标准的android颜色,但你可以定义自己的颜色。您需要为每种不同的按钮状态分配颜色,以便使用不同的颜色。

然后,您需要将ImageView背景信息定义为您在上面定义的选择器:

<ImageButton
    android:id="@+id/googlemaps_select_location"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentRight="true"
    android:layout_alignParentTop="true"
    android:layout_marginRight="13dp"
    android:layout_marginTop="13dp"
    android:background="@drawable/my_selector"
    android:src="@drawable/device_access_location_found" />

通过上述更改,当按下按钮时,按钮使用的bacground颜色将会改变,并且您可以获得“闪光”效果。

答案 1 :(得分:0)

我最终使用样式来继承Widget.ImageButton的外观,只为我的目的进行了一些小调整:

我的/res/values/styles.xml文件现在看起来像:

<resources>

<style name="AppTheme" parent="android:Theme.Light" />

<style name="my_loc_btn_style" parent="@android:style/Widget.ImageButton">
    <item name="android:layout_marginTop">8dp</item>
    <item name="android:layout_marginRight">8dp</item>
</style>

</resources>

我的布局文件有:

<ImageButton android:id="@+id/googlemaps_select_location"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentTop="true"
    android:layout_alignParentRight="true"
    style="@style/my_loc_btn_style"
    android:src="@drawable/device_access_location_found"/>

这似乎继承了Widget.ImageButton的背景,似乎只是略微透明,这就是我之后的情况,所以我现在根本没有设置透明度。