栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

动画与过渡(七)、为ViewGroup添加入场动画,LayoutAnimation使用概述

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

动画与过渡(七)、为ViewGroup添加入场动画,LayoutAnimation使用概述

Android动画与概述主要涵盖了以下内容:

  • 动画与过渡(一)、视图动画概述与使用
  • 动画与过渡(二)、视图动画进阶:对Animation进行定义扩展
  • 动画与过渡(三)、插值器和估值器概述与使用
  • 动画与过渡(四)、使用Layout、offset、layoutParam实现位移动画
  • 动画与过渡(五)、使用scrollTo、scrollBy、Scroller实现滚动动画
  • 动画与过渡(六)、使用ViewDragHelper实现平滑拖动动画
  • 动画与过渡(七)、为ViewGroup添加入场动画,LayoutAnimation使用概述
  • 动画与过渡(八)、为Viewgroup提供删除、新增平滑动画效果,LayoutTransition使用概述
  • 动画与过渡(九)、Svg动画使用概述,Vector Drawable使用,三方SVGA框架使用
  • 动画与过渡(十)、Property Animation动画使用概述
  • 动画与过渡(十一)、使用Fling动画移动视图,FlingAnimation动画使用概述
  • 动画与过渡(十二)、使用物理弹簧动画为视图添加动画,SpringAnimation动画使用概述
  • 动画与过渡(十三)、视图、Activity过渡转场动画使用概述
  • 动画与过渡(十四)、Lottie动画使用概述
  • 动画与过渡实战(十五)、仿今日头条栏目拖动排序效果
  • 动画与过渡实战(十六)、仿IOS侧滑删除效果
  • 动画与过渡实战(十七)、仿探探卡片翻牌效果

本篇文章来一点好玩的效果。还记得之前的视图动画效果吗?之前我们控制的效果,都是针对单个视图,如果想要对一组视图使用相同的动画效果,这个时候,就需要使用到LayoutAnimationController了。

LayoutAnimationController介绍:

Android Developer LayoutAnimationController docment

  • LayoutAnimationController用于为一个layout里面的控件,或者是一个ViewGroup里面的控件设置动画效果(即整个布局)
  • 每一个控件都有相同的动画效果
  • 这些控件的动画效果可在不同的时间显示出来

LayoutAnimationController的使用非常简单

xml直接使用


然后将定义好的动画配置到ViewGroup的布局中即可。



        

代码中配置使用

val layoutAnimationController =
                LayoutAnimationController(LayoutAnimationHelper.getAnimationSetFromRight())
 layoutAnimationController.delay= 0.1F
 layoutAnimationController.order = LayoutAnimationController.ORDER_NORMAL

 llViewGroupContainer.layoutAnimation = layoutAnimationController
 llViewGroupContainer.scheduleLayoutAnimation()
public static AnimationSet getAnimationSetFromRight() {
    AnimationSet animationSet = new AnimationSet(true);
    TranslateAnimation translateX1 = new TranslateAnimation(RELATIVE_TO_SELF, 1.0f, RELATIVE_TO_SELF, -0.1f,
            RELATIVE_TO_SELF, 0, RELATIVE_TO_SELF, 0);
    translateX1.setDuration(300);
    translateX1.setInterpolator(new DecelerateInterpolator());
    translateX1.setStartOffset(0);

    TranslateAnimation translateX2 = new TranslateAnimation(RELATIVE_TO_SELF, -0.1f, RELATIVE_TO_SELF, 0.1f,
            RELATIVE_TO_SELF, 0, RELATIVE_TO_SELF, 0);
    translateX2.setStartOffset(300);
    translateX2.setInterpolator(new DecelerateInterpolator());
    translateX2.setDuration(50);

    TranslateAnimation translateX3 = new TranslateAnimation(RELATIVE_TO_SELF, 0.1f, RELATIVE_TO_SELF, 0f,
            RELATIVE_TO_SELF, 0, RELATIVE_TO_SELF, 0);
    translateX3.setStartOffset(350);
    translateX3.setInterpolator(new DecelerateInterpolator());
    translateX3.setDuration(50);

    AlphaAnimation alphaAnimation = new AlphaAnimation(0.5f, 1.0f);
    alphaAnimation.setDuration(400);
    alphaAnimation.setInterpolator(new AccelerateDecelerateInterpolator());


    animationSet.addAnimation(translateX1);
    animationSet.addAnimation(translateX2);
    animationSet.addAnimation(translateX3);
    animationSet.addAnimation(alphaAnimation);
    animationSet.setDuration(400);

    return animationSet;
}

下面是效果

为了让大家看的时候更清晰效果,所以视频做了慢放处理,可以看到是有回弹会效果的,还是比较炫酷的。如果是recyclerView,也可以使用LayoutAnimationController来实现类似效果。

//为RecyclerView添加动画
val layoutAnimationController =
    LayoutAnimationController(LayoutAnimationHelper.getAnimationSetFromRight())
layoutAnimationController.delay = 0.1F
layoutAnimationController.order = LayoutAnimationController.ORDER_NORMAL

rvContentList.layoutAnimation = layoutAnimationController

可以看到动画的执行顺序是顺序执行的,ViewGroup和RecyclerView中,都是顺序执行的,但是如果现在是GridView或者RecylcerView#GridLayoutManager方式,我们可能希望沿着对角线方向实现动画效果,而不是一个个来。则需要进行自定义动画的执行方向。LayoutAnimationController动画执行方向修改也很简单,只需要重写ViewGroup#protected void attachLayoutAnimationParameters(View child, LayoutParams params, int index, int count)方法即可。

下面是对于RecycleView#GridLayoutManager实现对角线方向动画效果的代码

public class GridRecyclerView extends RecyclerView {
 
    
    public GridRecyclerView(Context context) { super(context); }
 
    
    public GridRecyclerView(Context context, AttributeSet attrs) { super(context, attrs); }
 
    
    public GridRecyclerView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); }
 
    @Override
    protected void attachLayoutAnimationParameters(View child, ViewGroup.LayoutParams params,
                                                   int index, int count) {
        final LayoutManager layoutManager = getLayoutManager();
        if (getAdapter() != null && layoutManager instanceof GridLayoutManager){
 
            GridLayoutAnimationController.AnimationParameters animationParams =
                    (GridLayoutAnimationController.AnimationParameters) params.layoutAnimationParameters;
 
            if (animationParams == null) {
                // If there are no animation parameters, create new once and attach them to
                // the LayoutParams.
                animationParams = new GridLayoutAnimationController.AnimationParameters();
                params.layoutAnimationParameters = animationParams;
            }
 
            // Next we are updating the parameters
 
            // Set the number of items in the RecyclerView and the index of this item
            animationParams.count = count;
            animationParams.index = index;
 
            // Calculate the number of columns and rows in the grid
            final int columns = ((GridLayoutManager) layoutManager).getSpanCount();
            animationParams.columnsCount = columns;
            animationParams.rowsCount = count / columns;
 
            // Calculate the column/row position in the grid
            final int invertedIndex = count - 1 - index;
            animationParams.column = columns - 1 - (invertedIndex % columns);
            animationParams.row = animationParams.rowsCount - 1 - invertedIndex / columns;
 
        } else {
            // Proceed as normal if using another type of LayoutManager
            super.attachLayoutAnimationParameters(child, params, index, count);
        }
    }
}

使用上和之前使用没有任何区别。下面来看下效果。动画执行顺序还是区别很明显的。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/459696.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号