我试图使用RelativeLayout在一个Button上放置一个
ImageView.这是我的xml:
<RelativeLayout android:layout_width="0dip" android:layout_height="match_parent" android:layout_margin="10dp" android:layout_weight="0.50" > <Button android:id="@+id/btnFindDaysInBetween" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@color/blue_500" android:text="@string/dt_text_days" /> <ImageView android:id="@+id/imageview_find_days_in_between" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerInParent="true" android:contentDescription="@string/empty" android:src="@drawable/ic_check_circle_white" /> </RelativeLayout>
这是图片截图:
您可以看到,ImageView的src图像是不可见的.但是,如果我将背面的按钮更改为ImageView,则可以看到顶部ImageView的图像.请参考下面..
更改xml:
<RelativeLayout android:layout_width="0dip" android:layout_height="match_parent" android:layout_margin="10dp" android:layout_weight="0.50" > <!-- <Button android:id="@+id/btnFindDaysInBetween" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@color/blue_500" android:text="@string/dt_text_days" /> --> <ImageView android:id="@+id/imageview_find_days" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_centerInParent="true" android:contentDescription="@string/empty" android:src="@drawable/ic_send_black" /> <ImageView android:id="@+id/imageview_find_days_in_between" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerInParent="true" android:contentDescription="@string/empty" android:src="@drawable/ic_check_circle_white" /> </RelativeLayout>
更改了xml的屏幕截图:
在第一个布局中我做错了什么?
解决方法
原因其实很简单. :)我们在2D中陷入了思考,我们忽略了高程 – 在Z.
你的第一个布局没有错. Button只是具有比ImageView更高的高程 – 高达1dp.因此,无论你如何安排这两种观点,Button都会上升.
有点证明:
一个按钮,默认情况下获取Widget.Material.Button样式:
<!-- Bordered ink button --> <style name="Widget.Material.Button"> <item name="background">@drawable/btn_default_material</item> <item name="textAppearance">?attr/textAppearanceButton</item> <item name="minHeight">48dip</item> <item name="minWidth">88dip</item> <item name="stateListAnimator">@anim/button_state_list_anim_material</item> <item name="focusable">true</item> <item name="clickable">true</item> <item name="gravity">center_vertical|center_horizontal</item> </style>
引入此高程的属性是android:stateListAnimator. StateListAnimator类似于StateListDrawable,并提供状态更改动画.完整的xml在这里:Link.但是这是按钮的基本状态:
<!-- base state --> <item android:state_enabled="true"> <set> <objectAnimator android:propertyName="translationZ" android:duration="@integer/button_pressed_animation_duration" android:valueTo="0" android:startDelay="@integer/button_pressed_animation_delay" android:valueType="floatType"/> <objectAnimator android:propertyName="elevation" android:duration="0" android:valueTo="@dimen/button_elevation_material" android:valueType="floatType" /> </set> </item>
您可以看到,按钮的高程值设置为@ dimen / button_elevation_material:
<dimen name="button_elevation_material">1dp</dimen>
这就是ImageView最终在Button后面.
那么,我们该怎么办?
一个直接的解决方案是将ImageView的高程设置为相同的量 – 1dp.
另一种解决方案,需要一些工作,是删除Button的高程,而不是改变ImageView的.基于默认的StateListAnimator,我们可以创建我们自己的 – 并删除高程.然后,在您的res / values-v21 / styles.xml中,定义从Widget.Material.Button继承的样式:
<style name="MyDepressedButtonStyle" parent="android:Widget.Material.Button"> <item name="android:stateListAnimator">@anim/customized_state_animator</item> </style>
现在,在您的按钮上设置此样式:
<Button style="@style/MyDepressedButtonStyle" .... .... />
编辑:
其实我们可以直接应用定制的StateListAnimator:
<Button android:stateListAnimator="@anim/customized_state_animator" .... .... />
没有必要走风景线路!