我正在学习Material Theme,有些东西在低于21的版本中不起作用,如涟漪效果,更改状态栏颜色和主要文本颜色,查看高程......甚至我使用v7库。
对于视图提升,我尝试ViewCompat.setElevation(view, value)
但无效。任何人都知道我为什么以及如何做?
对于涟漪效应,我试图将属性android:background="?android:attr/selectableItemBackground"
放在XML中,但即使不起作用。我想要一种方法,只需一个代码即可在任何版本中工作(无需为21版本和21版本单独编写代码)。有办法做到这一点吗?谁知道怎么做?
由于
答案 0 :(得分:3)
交易是Material Design是一种设计语言,是设计师用来准备一致的UI / UX的概念。它并非100%在任何地方实施。
Android Lollipop实现了一些有助于创建Material Design的东西 - 兼容应用程序。这些包括阴影和涟漪。 Lollipop没有高级的Material Design,比如Floating Action Button,Snackbar,浮动TextView标签等等。这些是作为设计支持库的一部分提供的。你也可以自己创建它们。
阴影和涟漪都可以在较旧的Android版本上实现。例如,可以创建一个动画波纹可绘制,将其用作按钮的背景并使其对触摸事件做出反应。它不可能使它顺利运行,因为这需要在后台线程中运行动画和渲染,后者线程仅在Lollipop和Marshmallow上可用。另一个例子是圆形显示,高程系统(不是阴影,绘图顺序)和CardView的真正圆角。
彩色/半透明状态栏是Lollipop和Marshmallow完全保留的一个例子,因为它是系统的一部分,根本无法向后移植。另一个例子是新的过渡系统。
即使在Lollipop上也不支持某些功能。例如,浮动的EditText的选择工具栏。它仅适用于棉花糖。任何Android版本都不支持SVG图形。 Lollipop和Marshmallow上的矢量图形是一种SVG实现,支持流行的标签和设置。如果您希望在应用中拥有良好的矢量图形,最好使用第三方SVG阅读器和渲染器。
ViewCompat和AppCompat使事情编译。这并不意味着这些东西在Lollipop上会起作用。设计支持库添加了小部件,但大多数小部件不像Lollipop那样工作。例如,CardView并没有真正切角,阴影是用渐变绘制的,状态并不是真正的动画。你提到的两件事就是这样实现的(伪代码):
ViewCompat.setElevation(view, value){
if(Lollipop)
view.setElevation(value);
else
// do nothing
}
和
selectableItemBackground = Lollipop ? new RippleDrawable() : grayColor
在github上分散了大量的Material Design实现。其中一些只实现了一件事,比如RippleDrawable或FAB。其他库为小部件,阴影等提供了相当完整的支持。
Google正致力于设计支持库添加越来越多的小部件。它虽然没有涟漪或阴影,但由于性能和架构方面的困难,可能不会有它们。
我也有自己的图书馆。我对Material Design非常着迷,并且由于缺乏实现而感到沮丧,所以我开始研究自己实现的阴影,涟漪,动画,小部件和其他东西。它是开源的,免费使用,你可以在这里找到它:https://github.com/ZieIony/Carbon
编辑:RippleDrawable
您需要一个RippleDrawable实现。由于源是开放的,这应该很容易。我的实施在这里:https://github.com/ZieIony/Carbon/blob/master/carbon/src/main/java/carbon/drawable/RippleDrawableFroyo.java
然后使用您的颜色和样式创建一个实例。将其设置为背景。
在视图的onTouchEvent中运行RippleDrawable的动画。
使用无边框模式,多个涟漪,图层,可绘制状态和所有内容准备完整的波纹要复杂得多。如果您愿意,您可以在Carbon中找到所有这些(多个涟漪除外)。它不仅是xml,还包括覆盖方法,扩展小部件,布局,属性和样式。
github上有简单的涟漪实现。如果它足够你,你可以下载一个库并使用它。例如,这一个:https://github.com/balysv/material-ripple
如果你想使用从xml中膨胀的涟漪,那么它也是可能的。看看这个图书馆:https://github.com/ozodrukh/RippleDrawable