Android 无聊分享Day01

733 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

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.阴影是绘制于父控件上的,所以需要留出间隙

\