本文已参与「新人创作礼」活动,一起开启掘金创作之路。
1、Visibility平滑过渡
setTransitionVisibility
// 可惜的是这个属性需要在Q及其以上才能使用
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q){
View.setTransitionVisibility(@Visibility);
}
2、Alpha平滑过渡
setTransitionAlpha
//同样的也只能在Q及其以上才能使用
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q){
View.setTransitionAlpha(float);
}
3、ViewGroup -> ChildViews平滑过渡
animateLayoutChanges
ViewGroup的属性,在布局中声明
android:animateLayoutChanges="true"
分析代码可知,本质上就是添加了LayoutTransition对象
//
case R.styleable.ViewGroup_animateLayoutChanges:
boolean animateLayoutChanges = a.getBoolean(attr, false);
if (animateLayoutChanges) {
setLayoutTransition(new LayoutTransition());
}
break;
对于LayoutTransition的官方解释如下⬇️,可见添加或从ViewGroup中移除子视图都会受到LayoutTransition的控制,实际上visibility的改变也是会触发的
/**
* Sets the LayoutTransition object for this ViewGroup. If the LayoutTransition object is
* not null, changes in layout which occur because of children being added to or removed from
* the ViewGroup will be animated according to the animations defined in that LayoutTransition
* object. By default, the transition object is null (so layout changes are not animated).
*
* <p>Replacing a non-null transition will cause that previous transition to be
* canceled, if it is currently running, to restore this container to
* its correct post-transition state.</p>
*
* @param transition The LayoutTransition object that will animated changes in layout. A value
* of <code>null</code> means no transition will run on layout changes.
* @attr ref android.R.styleable#ViewGroup_animateLayoutChanges
*/
public void setLayoutTransition(LayoutTransition transition) {
if (mTransition != null) {
LayoutTransition previousTransition = mTransition;
previousTransition.cancel();
previousTransition.removeTransitionListener(mLayoutTransitionListener);
}
mTransition = transition;
if (mTransition != null) {
mTransition.addTransitionListener(mLayoutTransitionListener);
}
}
那么如果你想在ChildViews的变化的时候也有过渡动画(比如TextView文字宽度的变化),你可以做如下操作
//ViewGroup应该是其父布局
ViewGroup.getLayoutTransition().enableTransitionType(LayoutTransition.CHANGING);
4、Elevation属性
elevation
android:elevation="int"
这个属性你可能不陌生,一般会用来实现阴影的效果,用一句话来解释就是给View添加了Z轴(所以阴影是正投影的模糊效果)
/**
* The visual z position of this view, in pixels. This is equivalent to the
* {@link #setTranslationZ(float) translationZ} property plus the current
* {@link #getElevation() elevation} property.
*
* @return The visual z position of this view, in pixels.
*/
@ViewDebug.ExportedProperty(category = "drawing")
public float getZ() {
return getElevation() + getTranslationZ();
}
可以看到Z值由elevation、tanslationZ两个值影响,所以从空间上来看,Z值越大View就会越上层,也会导致View会覆盖在Z值比它小的其余View上(这个效果是并不能影响不同父控件中的View的层级,是相对于同一父控件的)
PS:值得注意的是Elevation有可能会失效
1.View必须设置了背景色,且不能为透明(透明的怎么会有阴影呢)
2.阴影是绘制于父控件上的,所以需要留出间隙
\