Sogou Android animation Trilogy Animation LayoutAnimation & View

label AndroidanimationLayout animationFrame animation
334 people read comment(0) Collection report
Classification:

Reproduced please indicate the source:Http://prog3.com/sbdm/blog/crazy1235/article/details/50612827

This article on the AndroidTween animationandFrame animationas well asLayout moveDraw a summary.


Tween animation

Tween animation, also known as inter animation. Through the view position, size, transparency, changes in the angle to achieve animation effects.

The base class is Animation. We usually use its direct subclassRotateAnimation,TranslateAnimation,ScaleAnimation,AlphaAnimation.

Animations can be defined by XML.Res/anim/xxxAnd then passAnimationUtilsClass to load; also can be set through the full code.


XML syntax introduction

<? Version= XML "1" encoding= "UTF-8"?
<Set Xmlns:android="Http://schemas.android.com/apk/res/android"
    Android:interpolator="@[package:]anim/interpolator_resource"
    Android:shareInterpolator=[true"|"False">]
    <Alpha
        Android:fromAlpha="Float"
        Android:toAlpha="Float">
    <Scale
        Android:fromXScale="Float"
        Android:toXScale="Float"
        Android:fromYScale="Float"
        Android:toYScale="Float"
        Android:pivotX="Float"
        Android:pivotY="Float">
    <Translate
        Android:fromXDelta="Float"
        Android:toXDelta="Float"
        Android:fromYDelta="Float"
        Android:toYDelta="Float">
    <Rotate
        Android:fromDegrees="Float"
        Android:toDegrees="Float"
        Android:pivotX="Float"
        Android:pivotY="Float">
    <Set>
...
    < /Set>
< /Set>

Picture name

The Animation class defines the initial values for many constants and variables, such as:

Public Static Final IntINFINITE = -One;

Public Static Final IntRESTART =One;

Public Static Final IntREVERSE =Two;

Mainly used in its sub category as wellAnimationListener:

Public Static Interface AnimationListener{
        / * *
* the animation starts when the callback
*
*@paramThe started animation. animation
* /
        VoidOnAnimationStart (animation Animation);
        / * *
* at the end of the animation callback. However, when the number of animation to set the number of times for INFINITE, the method will not callback.
*
*@paramThe animation which reached its animation end.
* /
        VoidOnAnimationEnd (animation Animation);
        / * *
* the callback when the animation is repeated.
*
*@paramThe animation which was repeated. animation
* /
        VoidOnAnimationRepeat (animation Animation);
}

Add the listener can do more operations on animation.


Interpolation - Interpolator

Prior to the introduction of animation, have to talk about the "interpolation"". Interpolation means that when playing the animation, changing the rate of play, you can make the animation faster, or more and more slowly, and so on.

Commonly used is about nine interpolation:

Baseinterpolator subclass ID Resource describe
AccelerateInterpolator @android:anim/accelerate_interpolator Accelerating change (start slow, faster)
DecelerateInterpolator @android:anim/decelerate_interpolator Deceleration change (start fast, more and more slowly)
acceleratedecelerateinterpolator Android的:“_人物/加快decelerate _插补器 先加速后减速(中间速度最快)
linearinterpolator Android的:“_人物/直线插补器 线性均匀变化
overshootinterpolator Android的:“人物/调_插补器 超出结尾的临界值,然后在缓慢回到结束值
anticipateinterpolator Android的:“人物/期望_插补器 先向相反的方向改变一点,然后在加速播放
anticipateovershootinterpolator Android的:“人物/ anitcipate _调_插补器 先向相反的方向改变一点,然后在加速播放至超出结束值一点,然后在缓慢回到结束值
bounceinterpolator Android的:“人物/反弹_插补器 动画快结束的时候,模拟球落地的回弹效果
cycleinterpolator Android的:“插补器周期_人物/ 动画循环播放指定的次数

自定义interpolator

一般来说,官方api给的这几个插值器就够实用了.不过还可以自定义interpolator.可以简单的对系统的插值器进行一些参数值的修改:

<?XML版本=“1.0”encoding=“UTF-8”?>
interpolatorname xmlns:Android=“http:/ / / / / schemas.android.com APK Android。”
    Android _:属性名称=“价值”/>

这里推荐大家一个第三方的interpolator库:

http:/ / / / easeinterpolator github.com喜陈


公共xml属性及对应的方法

属性名称 对应的方法 描述
Android的:时间 setduration(长) 动画持续的时间长度(单位是miliseconds)
Android的:插补器 setinterpolator(内插) 设置动画播放时的插值器
Android的:repeatcount setrepeatcount(int) 设置动画播放重复次数
Android的:repeatmode setrepeatmode(int) 设置动画重复的方式(当repeat count>0时才有效)”反向(2)或“重新启动(1)“
Android的:startoffset setstartoffset(长) 设置动画开始播放的延迟时间
Android的:fillafter setfillafter(布尔) 设置为true时,视图会停留在动画结束的状态。
Android的:fillbefore setfillbefore(布尔) 默认值是true,视图会停留在动画开始的状态
Android的:fillenable setfillenable(布尔) 默认值是false.如果是true,动画将会应用fillbefore值;否则,fillbefore的值会被忽略,transformation会在动画结束的时候被应用。
Android的:detachwallpaper setdetachwallpaper(布尔) 默认值是false.如果为true,并且动画窗体有一个壁纸的话,那么动画只会应用给window,墙纸是静态不动的
Android的:zadjustment setzadjustment(int) 允许在动画播放期间,调整播放内容在z轴方向的顺序。”(1)或“正常“(0)或“自底向上(1)“

Android的:::zadjustment允许在动画播放期间,调整播放内容在z轴方向的顺序

  • 正在播放的动画内容保持当前的z轴顺序,正常(0):
  • 顶:(1)在动画播放期间,强制把当前播放的内容放到其他内容的上面;
  • (1):在动画播放期间底,强制把当前播放的内容放到其他内容之下

scaleanimation–缩放动画

xml属性名称 描述
Android的:fromxscale 动画起始时,1.0表示放大x轴坐标的伸缩尺寸.0.0表示收缩到没有.1.0表示正常没伸缩.>。<1.0表示收缩。
Android的:toxscale 动画结束时x轴坐标的伸缩尺寸
Android的:fromyscale 动画起始时y轴坐标的伸缩尺寸
Android的:toyscale 动画结束时y轴坐标的伸缩尺寸
Android的:pivotx 缩放动画作用点在x轴方向上的位置.android:表示绝对定位pivotx =“50”,相对于零点偏移50–> animation.absolute Android:pivotx =“50%”–> animation.relate表示相对控件本身_到_自Android:pivotx =“P表示相对控件的父控件50%”–> animation.relate _ _到父
Android的:pivoty 缩放动画作用点在y轴方向上的位置
xml定义缩放动画
<?XML版本=“1.0”encoding=“UTF-8”?>
量表 xmlns:Android=“http:/ / / / / schemas.android.com APK Android。”
    Android的:背景=“蓝”色_光”
    Android的:时间=“1000”
    Android的:fillafter=“假”
    Android的:fillbefore=“真正的”
    Android的:fromxscale=“1”
    Android的:fromyscale=“1”
    Android的:插补器=“Android的人物/加快_ decelerate _插补器”
    Android的:pivotx=“50%”
    安卓:pivoty=“50%”
    安卓:repeatcount=“1”
    安卓:repeatmode=“重新启动”
    安卓:startOffset=“500”
    安卓:toxscale=“0”
    安卓:toyscale=“0”
    安卓:zadjustment=“底”/ >

然后通过animationutils类装载动画,进行应用。

动画scaleanimation = animationutilsloadanimation。(这,是。动画规模_anim)
targetivstartanimation。(scaleanimation)
代码定义缩放动画
scaleanimation scaleanimation =新的scaleanimation(1.0f通道1.0f通道,animation.relative_to_self,通道,animation.relative_to_self,通道);
scaleanimation setDuration(。一千);
scaleanimation setinterpolator(。新的overshootinterpolator());
scaleanimation setfillafter(。真正的);
targetiv startanimation(scaleanimation);

scaleanimation有4个构造方法。

公共 scaleanimation(上下文语境,attributeset attrs){ }
公共 scaleanimation从,弓形虫,fromy,玩具){ }
公共 scaleanimation从,弓形虫,fromy,玩具,pivotX,pivoty){ }
公共 scaleanimation从,弓形虫,fromy,玩具,intpivotxtype,pivotxvalue,intpivotytype,pivotyvalue){ }

第一个构造用于从资源文件中加载资源。我们主要用后三个。后面三个构造的区别就在设置变换中轴点与否。不指定pivotxtype和pivotytype的话,默认采用绝对形式,pivoty pivotX与的值都是相对于(0,0)左上角偏移的。

pivotxtype可设置的参数有三种:绝对、relate_to_self、relate_to_parent。

  • 绝对表示当前设置的pivotX和pivoty值是绝对值,相对于左上角偏移。比如:Android:pibotx =“50”
  • relate_to_self表示设置的pivotX和pivoty是相对值。比如:Android:pivotX =“50%”表示X方向中轴点在正中间。取值范围是[ 100% ] 0% ~
  • relate_to_parent也是表示相对值,是相对于该视图的父控件而言。比如:Android:pivotX =“50% P”表示X方向中轴点是其父控件的中间位置。取值范围是[ 100% ] 0% ~

效果如下:

Write the picture here.


rotateanimation–旋转动画

XML属性名称 描述
安卓:初始度数 动画起始的角度(可正可负)
安卓:todegrees 动画终止的角度(可正可负)
安卓:pivotX 旋转作用点在X轴方向上的位置。Android:pivotX =“50”表示绝对定位,相对于零点偏移50安卓:pivotX =“50%”表示相对控件本身Android:=“50% P”表示相对控件的父控件pivotX
安卓:pivoty 旋转作用点在Y轴方向上的位置
XML中设置旋转动画
<?xml version=“1”encoding=“utf-8”?>
<旋转 xmlns:Android=“http://schemas.android.com/apk/res/android”
    安卓:持续时间=“2500”
    安卓:fillafter=“真”
    安卓:初始度数=“20”
    安卓:插补器=“@安卓:动画/ overshoot_interpolator”
    安卓:pivotX=“50%”
    安卓:pivoty=“50%”
    安卓:todegrees=“320”/ >
代码中设置旋转动画
rotateanimation rotateanimation =新的rotateanimation(0.0f550.0f,animation.relative_to_self,0.3f,animation.relative_to_self,0.3f);
rotateanimation setDuration(。一千五百);
rotateanimation setinterpolator(。新的overshootinterpolator());
rotateanimation setfillafter(。真正的);
targetiv startanimation(rotateanimation);

效果图如下:

Write the picture here.


translateanimation–平移动画

XML属性名称 描述
安卓:fromxdelta 平移动画起始位置X轴坐标
安卓:toxdelta 平移动画结束位置X轴坐标
安卓:fromydelta 平移动画起始位置Y轴坐标
安卓:toydelta 平移动画结束位置Y轴坐标
XML中设置平移动画:
<?xml version=“1”encoding=“utf-8”?>
<翻译 xmlns:Android=“http://schemas.android.com/apk/res/android”
    安卓:持续时间=“1000”
    安卓:fromxdelta=“0”
    安卓:fromydelta=“0”
    安卓:插补器=“@安卓:动画/ anticipate_overshoot_interpolator”
    安卓:toxdelta=“50%便士”
    安卓:toydelta=“50%便士”/ >
代码中设置平移动画
translateanimation translateanimation =新translateanimation(二百
translateanimation。setDuration一千
translateanimationsetinterpolator。(新anticipateovershootinterpolator())
targetivstartanimation。(translateanimation)

Write the picture here.


alphaanimation–渐变动画

XML属性名称 描述
安卓:fromalpha 动画开始时操作对象的alpha值
Android的:toalpha 动画终止时操作对象的alpha值
xml中设置渐变动画:
<?XML版本=“1.0”encoding=“UTF-8”?>
阿尔法 xmlns:Android=“http:/ / / / / schemas.android.com APK Android。”
    Android的:时间=“1000”
    Android的:fromalpha=“1.0”
    Android的:插补器=“Android的人物_ /线性插补器”
    Android的:repeatcount=“1”
    Android的:repeatmode=“反向”
    Android的:toalpha=“0”/>
代码中设置渐变动画:
alphaanimation alphaanimation alphaanimation(=新1.0F,0.2f);;;;;;;
alphaanimation.setduration1500;;;;;;;
alphaanimation.setinterpolator(新acceleratedecelerateinterpolator());;;;;;;
alphaanimation.setrepeatmode(动画.reverse;;;;;;;
alphaanimation.setrepeatcount1;;;;;;;
targetiv.startanimation(alphaanimation);;;;;;;

Write the picture here.


animationset–动画集合

上面都是一个个的单独的动画,我们可以将很多个单独的动画组合到一起成为一个集合。

动画集合也可以在xml中设置.需要用标签包括其他简单的动画.比上述公共动画属性多了一个android:shareinterpolator =“布尔”,表示是否对子动画设置相同的插值器。

xml中设置set动画集合
<?XML版本=“1.0”encoding=“UTF-8”?>
 xmlns:Android=“http:/ / / / / schemas.android.com APK Android。”
    Android的:fillafter=“真正的”
    Android的:shareinterpolator=“假”>
    阿尔法
        Android的:时间=“1500”
        Android的:fillafter=“真正的”
        Android的:fromalpha=“1.0”
        Android的:插补器=“Android的人物/加快_插补器”
        Android的:toalpha=“0.2”/>
    量表
        Android的:时间=“1000”
        Android的:fromxscale=“0.8”
        Android的:fromyscale=“0.8”
        Android的:插补器=“Android的人物_ /线性插补器”
        Android的:pivotx=“60%”
        Android的:pivoty=“20%”
        Android的:startoffset=“1500”
        Android的:toxscale=“0.3”
        Android的:toyscale=“0.5”/>
    翻译
        Android的:时间=“1000”
        Android的:fromxdelta=“0”
        Android的:fromydelta=“0”
        Android的:插补器=“Android的人物/反弹_插补器”
        Android的:startoffset=“2500”
        Android的:toxdelta=“200”
        Android的:toydelta=“200”/>
    旋转
        Android的:时间=“1000”
        Android的:fromdegrees=“50”
        Android的:插补器=“Android的人物/期望_调_插补器”
        Android的:pivotx=“50 %的P”
        Android的:pivoty=“50 %的P”
        Android的:startoffset=“3”
        Android的:todegrees=“360”/>
</>


我们来看一个现象:
设置了上面的set动画之后,开始运行的时候,会发现渐变动画开始运行的时候,会先变小,旋转一个角度,然后才开始动画.仔细分析xml代码之后,发现是在动画开始的时候,把scale和rotate中的初始状态给应用了.这时候想起了android:fillbefore属性。
然后在scale、rotate动画里添加了android fillbefore =“假”:属性之后,发现还是不好使.查看animation类的源码发现,fillbefore必须在设置fillenable =“true”的时候才神效.并且fillbefore的默认值是true,所以才会出现上述情况.

再次修改之后,代码如下:

<?XML版本=“1.0”encoding=“UTF-8”?>
 xmlns:Android=“http:/ / / / / schemas.android.com APK Android。”
    Android的:fillafter=“真正的”
    Android的:shareinterpolator=“假”>
    阿尔法
        Android的:时间=“1500”
        Android的:fillafter=“真正的”
        Android的:fromalpha=“1.0”
        Android的:插补器=“Android的人物/加快_插补器”
        Android的:toalpha=“0.2”/>
    量表
        Android的:时间=“1000”
        Android的:fillbefore=“假”
        Android的:fillenabled=“真正的”
        Android的:fromxscale=“0.8”
        Android的:fromyscale=“0.8”
        Android的:插补器=“Android的人物_ /线性插补器”
        Android的:pivotx=“60%”
        Android的:pivoty=“20%”
        Android的:startoffset=“1500”
        Android的:toxscale=“0.3”
        Android的:toyscale=“0.5”/>
    翻译
        Android的:时间=“1000”
        Android的:fromxdelta=“0”
        Android的:fromydelta=“0”
        Android的:插补器=“Android的人物/反弹_插补器”
        Android的:startoffset=“2500”
        Android的:toxdelta=“200”
        Android的:toydelta=“200”/>
    旋转
        Android的:时间=“1000”
        Android的:fillbefore=“假”
        Android的:fillenabled=“真正的”
        Android的:fromdegrees=“50”
        Android的:插补器=“Android的人物/期望_调_插补器”
        Android的:pivotx=“50 %的P”
        Android的:pivoty=“50 %的P”
        Android的:startoffset=“3”
        Android的:todegrees=“360”/>
</>

效果如下:

Write the picture here.


frame动画

Frame animation is a picture of a frame of a frame to play out the display effect, similar to the GIF picture. Frame animation is very simple, just need to each frame of the corresponding image in order to add in, and then set the display of each frame length, and then set the animation for the view control, play on the line.

XML set frame animation:
<? Version= XML "1" encoding= "UTF-8"?
<Animation-list Xmlns:android="Http://schemas.android.com/apk/res/android"
    Android:oneshot="False">
    <Item
        Android:drawable="@drawable/person1"
        Android:duration="100">
    <Item
        Android:drawable="@drawable/person2"
        Android:duration="100">
    <Item
        Android:drawable="@drawable/person3"
        Android:duration="100">
    <Ite
        Android:drawable="@drawable/person4"
        Android:duration="100">
    <Item
        Android:drawable="@drawable/person5"
        Android:duration="100">
    <Item
        Android:drawable="@drawable/person6"
        Android:duration="100">
    <Item
        Android:drawable="@drawable/person7"
        Android:duration="100">

< /Animation-list>

Set animation to ImageView:

TargetIv.setBackgroundResource(R.drawable.frame_anim);
AnimationDrawable AnimationDrawable = (AnimationDrawable) targetIv.getBackground();
AnimationDrawable.start();
Frame animation in the code
AnimationDrawable AnimationDrawable = AnimationDrawable new ();
AnimationDrawable.setOneShot(false);
AnimationDrawable.addFrame(getResources) ().getDrawable(R.drawable.person1),Two hundred);
AnimationDrawable.addFrame(getResources) ().getDrawable(R.drawable.person2),Two hundred);
AnimationDrawable.addFrame(getResources) ().getDrawable(R.drawable.person3),Two hundred);
AnimationDrawable.addFrame(getResources) ().getDrawable(R.drawable.person4),Two hundred);
AnimationDrawable.addFrame(getResources) ().getDrawable(R.drawable.person5),Two hundred);
TargetIv.setImageDrawable(animationDrawable);
AnimationDrawable.start();

Write the picture here.


LayoutAnimationController

Animation Tween and Animation Frame are for a single view operation. And LayoutAnimationController canAnimation for a ViewGroup operation, you can let a group of view each view according to certain rules of the display animation.
For example: can be for listView, gridView or recyclerView, the definition of item animation, rather than a very rigid all of a sudden show.

General on the use of layoutAnimation ListView animation, the use of gridLayoutAnimation animation GridView. For RecyclerView, under normal circumstances can only use the layoutAnimation animation, the application of gridLayoutAnimation animation when it will be reported to the wrong. Good for RecyclerView to generate a sub class to do the processing to support gridLayoutAnimation animation.

XML attribute Corresponding method describe
Android:delay SetDelay (float) Delay time of animation
Android:animationOrder SetOrder (int) Child view play animation sequence [normal
Android:interpolator SetInterpolator (Interpolator) setIntepolator (Context, int @InterpolatorRes) Interpolation device
Android:animation LayoutAnimationController (animation) Specifies the animation of child view
XML definition LayoutAnimation
<? Version= XML "1" encoding= "UTF-8"?
<LayoutAnimation Xmlns:android="Http://schemas.android.com/apk/res/android"
    Android:animation="@anim/item_list_anim"
    Android:animationOrder="Normal"
    Android:delay="0.2"
    Android:interpolator="@android:anim/bounce_interpolator">
<? Version= XML "1" encoding= "UTF-8"?
<Set Xmlns:android="Http://schemas.android.com/apk/res/android"
    Android:duration="1000"
    Android:shareInterpolator="True">
    <Alpha
        Android:fromAlpha="0"
        Android:toAlpha="1">
    <Translate
        Android:fromXDelta="-100%"
        Android:toXDelta="0%">
< /Set>
Code in the definition of LayoutAnimation
Public LayoutAnimationController(animation Animation) {
    This(animation,Zero point fiveF);
}
Public LayoutAnimationController(animation Animation,FloatDelay) {
MDelay = delay;
SetAnimation (animation);
}

LayoutAnimationController has three constructors, two of which are commonly used. Delay said that the delay time of each sub view start animation, the default is 0.5f.Delay in seconds.

Animation Animation = AnimationUtils.loadAnimation(this, R.anim.item_list_anim);
LayoutAnimationController LayoutAnimationController = LayoutAnimationController new (animation);
LayoutAnimationController.setInterpolator(AccelerateInterpolator new ());
LayoutAnimationController.setDelay(Zero point fiveF);
LayoutAnimationControllersetorder。(LayoutAnimationController命令_random)
recyclerviewsetlayoutanimation。(LayoutAnimationController)

Write the picture here.


gridlayoutanimationcontroller

gridlayoutanimationcontroller是LayoutAnimationController的子类针对GridView做动画操作。

XML属性 对应的方法 描述
安卓:延迟 setdelay(浮动) 动画播放的延迟时间
安卓:columndelay setcolumndelay(浮动) 列播放动画的延迟时间
安卓:rowdelay setrowdelay(浮动) 行播放动画的延迟时间
安卓:animationorder setorder(int) 子观播放动画的顺序[正常
安卓:动画 LayoutAnimationController(动画) 指定子观的动画
XML中定义
  <GridView控件
        安卓:身份证=“@ +身份证/ test_grid_view”
        安卓:layout_width=“match_parent”
        安卓:layout_height=“wrap_content”
        安卓:ColumnWidth=“60dp”
        安卓:重力=“中心”
        安卓:horizontalspacing=“10dp”
        安卓:layoutanimation=“@动画/ grid_layout_anim”
        安卓:numcolumns=“3”
        安卓:衬垫=“10dp”
        安卓:滚动条=“没有”
        安卓:stretchmode=“ColumnWidth”
        安卓:verticalspacing=“10dp”/ >
<?xml version=“1”encoding=“utf-8”?>
<gridlayoutanimation xmlns:Android=“http://schemas.android.com/apk/res/android”
    安卓:动画=“@动画/ item_anim_alpha”
    安卓:columndelay=“0.5”
    安卓:方向=“bottom_to_top | right_to_left”
    安卓:directionpriority=“行”/ >
<?xml version=“1”encoding=“utf-8”?>
<阿尔法 xmlns:Android=“http://schemas.android.com/apk/res/android”
    安卓:持续时间=“500”
    安卓:fromalpha=“0”
    安卓:插补器=“@安卓:动画/ accelerate_interpolator”
    安卓:toalpha=“1”/ >
代码中设置

同样是使用一个动画构造出gridlayoutanimation对象,然后设置各种参数,最后设置此动画GridView即可。

动画= animationutilsloadanimation。(这,是。动画.件商品_anim_alpha)
gridlayoutanimationcontroller gridlayoutanimationcontroller =新gridlayoutanimationcontroller(动画)
gridlayoutanimationcontrollersetdirection。(gridlayoutanimationcontroller方向_bottom_to_top | gridlayoutanimationcontroller方向_right_to_left)
gridlayoutanimationcontrollersetdirectionpriority。(gridlayoutanimationcontroller优先级_row)
gridrecyclerviewsetlayoutanimation。(gridlayoutanimationcontroller)

效果如下:

Write the picture here.


recyclerview扩展

正常情况下,我们可以对recyclerview使用layoutanimation动画但是如果对RecycleView使用动画的时候出现以下错误:

androidruntime:致命例外:主要
过程: 通用域名格式杰克森港。演示视图,控制:三万零七百七十                                                  
java.lang.classcastexception:安卓视图动画。LayoutAnimationControlleranimationparameters美元不能投到Android视图动画gridlayoutanimationcontroller。animationparameters美元
在安卓视图动画gridlayoutanimationcontroller。getdelayforview。(gridlayoutanimationcontroller爪哇二百九十九)
在安卓视图动画。LayoutAnimationControllergetanimationforview。(LayoutAnimationController爪哇三百二十一)
在安卓视图。ViewGroupbindlayoutanimation。(ViewGroup爪哇三千七百一十七)
在安卓视图。ViewGroupdispatchdraw。(ViewGroup爪哇二千八百九十二)
......

意思就是gridlayoutanimationcontroller animationparameters不能强转成layoutanimationcontroller.animationparameters。

recyclerview的出现本来就是替代的但是它有可以展示出ListView,GridView的效果,但是怎么让recyclerview设置gridlayoutmanager的时候应用gridlayoutanimation动画呢?

我们先来看看GridView怎么实现的?

在GridView源码里面搜索”layoutanimation”关键字发现,只有一个attachlayoutanimationparameters()的函数,里面将layoutanimationparameters强转成gridlayoutanimationcontroller.animationparameters。

“重写”
    受保护的 无效attachlayoutanimationparameters(看孩子,
viewgroup.layoutparams参数,int 指数int 计数){
gridlayoutanimationcontroller.animationparameters animationparams =
(gridlayoutanimationcontroller。animationparameters)params.layoutanimationparameters;
        如果(animationparams = =){
animationparams =新的gridlayoutanimationcontroller。animationparameters();
params.layoutanimationparameters = animationparams;
}
animationparams。计数=计数;
animationparams。指数=指数;
animationparams.columnscount = mnumcolumns;
animationparams.rowscount =计数/ mnumcolumns;
        如果(!mstackfrombottom){
animationparams.column =指数% mnumcolumns;
animationparams.row =指数/ mnumcolumns;
}其他的{
            最后 int倒排索引=计数指数;
animationparams.column = mnumcolumns—-(倒排索引% mnumcolumns);
animationparams.row = animationparams.rowscount—-倒排索引/ mnumcolumns;
}
}

然后就想到去recyclerview中去找attachlayoutanimationparameters()方法,但是没有,其父类ViewGroup里面有此方法:

受保护的 无效attachlayoutanimationparameters(看孩子,
LayoutParams参数,int 指数int 计数){
layoutanimationcontroller.animationparameters animationparams =
params.layoutanimationparameters;
        如果(animationparams = =){
animationparams =新的animationparameters() LayoutAnimationController;
params.layoutanimationparameters = animationparams;
}
animationparams。计数=计数;
animationparams。指数=指数;
}

由此可见recyclerview默认实现了ViewGroup的layoutanimation。我们在recyclerview中将此方法重写一下。不过要将mstackfrombuttom参数的判断去掉

公共  gridrecyclerview 延伸 recyclerview{
    公共 gridrecyclerview(上下文上下文){
        好极了(上下文);
}
    公共 gridrecyclerview(上下文语境,attributeset attrs){
        好极了(上下文属性);
}
    公共 gridrecyclerview(上下文语境,attributeset属性,intdefstyle){
        好极了(上下文属性,defstyle);
}
    “重写”
    公共 无效 setadapter(适配器适配器){
        好极了setadapter(适配器);
}
    “重写”
    公共 无效 setlayoutmanager(布局管理器的布局){
        如果(布局实例gridlayoutmanager){
            好极了setlayoutmanager(布局);
}其他的{
             新的ClassCastException(“你应该只使用gridlayoutmanager作为布局管理器使用时”+。getclass() getsimplename() +。“类”);
}
}
    “重写”
    受保护的 无效 attachlayoutanimationparameters(看孩子,viewgroup.layoutparams参数,int指数,int伯爵){
        如果(getlayoutmanager()!=与getlayoutmanager()实例gridlayoutmanager){
gridlayoutanimationcontroller.animationparameters animationparams =
(gridlayoutanimationcontroller。animationparameters)params.layoutanimationparameters;
            如果(animationparams = =){
animationparams =新的gridlayoutanimationcontroller。animationparameters();
params.layoutanimationparameters = animationparams;
}
            intmnumcolumns =((gridlayoutmanager)getlayoutmanager() getspancount());
animationparams.count =计数;
animationparams.index =指数;
animationparams.columnscount = mnumcolumns;
animationparams.rowscount =计数/ mnumcolumns;
            最后 int倒排索引=计数—•指数;
animationparams.column = mnumcolumns—-(倒排索引% mnumcolumns);
animationparams.row = animationparams.rowscount—-倒排索引/ mnumcolumns;
}其他的{
            好极了。attachlayoutanimationparameters(孩子,参数,指标,计数);
}
}
}

当我们使用gridlayoutmanager的时候,不能使用此属性。

* * * *
* stackfromend不支持gridlayoutmanager。考虑使用
* {@链接# setreverselayout(布尔)}。
*
    “重写”
    公共 无效 setstackfromend布尔stackfromend){
        如果(stackfromend){
             新的UnsupportedOperationException(
                    “gridlayoutmanager不从堆栈的支持。”
+“考虑使用反向布局”);
}
        好极了.setStackFromEnd (False);
}

This is the end of this article blog ~.
Thank you for your support! If there is a mistake, please point out.
Thank you ~.


reference resources

Http://developer.android.com/intl/zh-cn/guide/topics/graphics/view-animation.html
Http://www.cnblogs.com/angeldevil/archive/2011/12/02/2271096.html
Http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2015/0619/3090.html
Http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2015/0915/3462.html? Utm_source=tuicool&utm_medium=referral?

top
One
step on
Zero
Guess you're looking for
View comments
* the above user comments only represent their personal views, does not represent the views or position of the CSDN website
    personal data
    • visit292450 times
    • Integral:Three thousand five hundred and sixty-five
    • Grade
    • Rank:5266th name
    • original82
    • Reproduced:8
    • Translation:1
    • Comments:368
    contact information
    Blog column
    Latest comments
    Quantum statistics