如何在使用attr / selectableItemBackground作为背景时修改纹波颜色?
我看过一些SO问题,他们提供了一些可能的方法来实现我想要的。 例如:
-
在styles.xml中使用
colorControlHighlight
属性。这是我的styles-v21.xml:
<style name="SelectableItemBackground"> <item name="android:colorControlHighlight">#5677FC</item> <item name="android:background">?attr/selectableItemBackground</item> </style>
和我的小工具:
<TextView android:id="@+id/tv_take_photo_as_bt" android:layout_width="280dp" android:layout_height="48dp" android:text="@string/act_take_photo" style="@style/SelectableItemBackground"/>
它不起作用。 我也尝试添加
parent="Theme.AppCompat
”SelectableItemBackground“风格,或更改为colorControlHighlight(no android: prefix)"
,或更改?android:attr/selectableItemBackground
,都没有用。 -
在布局中使用
backgroundTint
属性。所以我在我的
TextView
添加了android:backgroundTint="#5677FC"
。 仍然无用。 然后我试图改变android:backgroundTintMode
到src_in
和src_atop
,他们从来没有区别。
那么,当我使用?attr/selectableItemBackground
作为背景时,如何更改波纹颜色。 我只专注于棒棒糖及以上。 先谢谢你!
最后,我find了解决scheme:而不是直接在主题SelectableItemBackground
中使用android:colorControlHighlight
,我应该写另一种风格:
<style name="SelectableItemTheme"> <item name="colorControlHighlight">@color/ripple_color</item> </style>
然后:
<style name="SelectableItemBackground"> <item name="android:theme">@style/SelectableItemTheme</item> <item name="android:background">?attr/selectableItemBackground</item> </style>
最后在layout.xml中添加style="@style/SelectableItemBackground"
到View
。
在2016/8/26更新之后N发布之后,我发现有时候我们不能使用这种方法为某种View
(例如CardView
)设置纹波颜色。 现在我强烈build议使用RippleDrawable
开发人员,也可以在xml中声明。 这里是一个例子:
当用户触摸/点击一个CardView
上面的API21时,我想显示一个涟漪效应,当然在棒棒糖之前应该有另一种反馈。 所以我应该写:
<android.support.v7.widget.CardView android:layout_width="wrap_content" android:layout_height="wrap_content" android:foreground="@drawable/selectable_item_background"/>
和drawable
文件夹中的selectable_item_background
:
<selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_pressed="false" android:drawable="@android:color/transparent" /> <item android:drawable="@color/color_clicked" /> </selector>
drawable-v21
文件夹中的selectable_item_background
:
<selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:drawable="@drawable/ripple_black" /> </selector>
最后, drawable
(或drawable-v21
)文件夹中的ripple_black
:
<ripple xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:color="@color/color_clicked" tools:ignore="NewApi" /> <!--you can remove this line if it's in v21 folder-->
而已。 对于其他视图,也许你应该使用android:background="@drawable/selectable_item_background"
。 不要忘记设置一个OnClickListener
, OnTouchListener
或类似的东西,否则波纹不会显示。
harrane和stream亭是正确的。 接受的答案不是最好的方法。 让我在代码中显示如何更改pre-Lollipop版本和更高版本的波纹颜色
-
你的AppTheme应该inheritance任何AppCompat主题,并且包含colorControlHighlight属性(没有'android:'前缀)
<!-- Application theme. --> <style name="AppTheme" parent="@style/Theme.AppCompat.Light.NoActionBar"> <item name="colorControlHighlight">#40ffffff</item> </style>
-
你的视图应该包含clickable =“true”,背景应该是“?attr / selectableItemBackgroundBorderless”或者“?attr / selectableItemBackground”:
<LinearLayout ... android:clickable="true" android:background="?attr/selectableItemBackgroundBorderless"/>
注意:如果你的父视图有白色背景,你将不会看到波纹效果,因为它是白色的。 更改不同颜色的colorControlHighlight值
另外,如果您想在不同的活动中使用不同的波纹颜色,则可以在Manifest文件中为每个活动设置个人主题,例如:
<activity android:name="com.myapp.GalleryActivity" android:theme="@style/RedRippleTheme" />
UPD:如果在同一个活动中想要不同的波纹颜色,会怎么样?
您需要在运行时更改每个片段的活动主题的属性。 在片段被自定义样式膨胀之前,只需覆盖它们并应用到当前主题:
在values / styles.xml中
<style name="colorControlHighlight_blue"> <item name="colorControlHighlight">@color/main_blue_alpha26</item> </style>
然后,在onCreateView()
通货膨胀前的片段中:
@Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { getContext().getTheme().applyStyle(R.style.colorControlHighlight_blue, true); //blue ripple color View view = inflater.inflate(R.layout.my_fragment_layout, container, false); return view; }
这种风格只适用于这个片段
UPD 2:请纠正我,如果我错了,但似乎colorControlHighlight属性不适用于布局,如果您将其应用到视图:
<TextView ... colorControlHighlight="#40ffffff"/> <!-- DOESN'T WORK -->
只有在设置为主题时才能使用
被接受的答案是错误的。
正确的使用方法是stream亭在评论中提到的。 使用colorControlHiglight
代替android:colorControlHiglight
来更改AppCompat
的默认colorControlHiglight
*请参阅Theming部分的http://android-developers.blogspot.co.uk/2014/10/appcompat-v21-material-design-for-pre.html *