精华内容
下载资源
问答
  • 颗星星和零依赖,这个库为 web 和移动浏览器提供了简单的滚动动画,以动画的方式显示滚动中的内容。它支持多种简洁的效果类型,甚至允许你使用自然语言定义动画。这里有一个简短的 SitePoint教程 。 9. Hover ...

    作者:Jonathan Saring

    译者:前端小智

    来源:medium

    .

    为了保证的可读性,本文采用意译而非直译。

    1.Three.js

    超过46K的星星,这个流行的库提供了非常多的3D显示功能,以一种直观的方式使用 WebGL。这个库提供了<canvas><svg>、CSS3D 和 WebGL渲染器,让咱们在设备和浏览器之间创建丰富的交互体验。该库于2010年4月首次推出,目前仍有近1000名贡献者在开发中。

    2. Anime.js

    超过20K的星星,Anime 是一个 JS 动画库,可以处理CSS属性,单个CSS转换,SVG 或任 何 DOM 属性以及 JS 对象。 此库允许咱们链接多个动画属性,将多个实例同步,创建时间轴等。

    3.Mo.js

    超过 14K 星星,是一个用于 Web 的动态图形工具带,具有简单的声明 API,跨设备兼容性和超过1500个单元测试。 咱们可以在 DOMESVG DOME周围移动东西或创建唯一的 mo.js 对象。虽然文档有些稀缺,但是示例很丰富,这里有CSS技巧的介绍。


    说到后台学习

    clipboard.png


    4. Velocity

    超过 15k 星星,Velocity是一个快速的 JS 动画引擎,拥有与jQuery$.animate() 相同的API。它具有彩色动画、转换、循环、画架、SVG支持和滚动。这里Velocity的高性能引擎的分解,这里是使用该库的 SVG 动画的介绍。

    5. Popmotion

    超过 14K 星星,这个动画库大小只有 11 kb。它允许开发人员从动作创建动画和交互,这些动作是可以启动和停止,可以使用 CSS、SVG、React、three 创建,js 和任何接受数字作为输入的 API。

    6. Vivus

    超过 10k 星星,Vivus是一个零依赖的 JS 类,可以让你为SVG制作动画,让它们具有被绘制的外观。 咱们可以使用许多可用动画之一,或创建自定义脚本来绘制SVG。 查看Vivus-instant获取实际示例,亲自动动手练习一下。

    7. GreenSock JS

    GSAP 是一个JS 库,用于创建高性能、零依赖、跨浏览器动画,据称在超过400万个网站上使用。GSAP是灵活的,可以与 React、Vue、Angular 和 vanilla JS 协同工作。GSDevtools 还可以帮助使用 GSAP 构建dubug 动画。

    8. Scroll Reveal

    拥有15K颗星星和零依赖,这个库为 web 和移动浏览器提供了简单的滚动动画,以动画的方式显示滚动中的内容。它支持多种简洁的效果类型,甚至允许你使用自然语言定义动画。这里有一个简短的 SitePoint教程

    9. Hover (CSS)

    超过 20k 星星,Hover 提供了CSS3支持的悬停效果集合,可应用于链接、按钮、徽标、SVG、特色图像等,在CSS、Sass和LESS中可用。您=可以复制和粘贴希望在自己的样式表中使用的效果,或者引用样式。

    10. Kute.js

    一个完全成熟的原生 JS 动画引擎,具有跨浏览器动画的基本功能。 重点是代码质量,灵活性,性能和大小(核心引擎17k 和 gzipped 5.5k) - 这是一个演。 该库也是可扩展的,因此你可以添加自己的功能。

    11. Typed.js

    超过 7k 星星,这个库基允许你以选定的速度为字符串创建打字动画。 你还可以在页面上放置 HTML div 并从中读取以允许搜索引擎和禁用 JS 的用户访问,由Slack和其他人使用,这个库既流行又非常有用。


    原文:https://blog.bitsrc.io/11-javascript-animation-libraries-for-2018-9d7ac93a2c59

    展开全文
  • UIImageView做动画的坑

    千次阅读 2019-05-06 13:36:23
    设置多张图片然后调用startanimatin即可做动画. 然而在做后台音频播放的时候有时候这个动画是不起作用的.而且据我写的通知的调用顺序来看.最后调用的确实是startanimating没错. 解决方案. 有个isanimating属性检测...

    animationimages是一个数组.设置多张图片然后调用startanimatin即可做动画.

    然而在做后台音频播放的时候有时候这个动画是不起作用的.而且据我写的通知的调用顺序来看.最后调用的确实是startanimating没错.

    解决方案.

    有个isanimating属性检测是否是在动画.在你要调动画的方法里头检测一下.如果当前"正在动画"(可能表现上是暂停的).就先让动画停止,然后再startanimaing

    - (void)beginAnimation {
    	if (self.isAnimating) {
    		/// 先暂停再结束是因为有可能属性表现的是正在动画,但是实际上是没做动画.直接调用startAnimation是不会做动画的
    		[self stopAnimation];
    		[self startAnimation];
    	} else {
    		[self startAnimation];
    	}	
    }
    
    - (void)endAnimation {
    	if (!self.isAnimating) {
    		/// 先开始再结束是因为有可能属性表现的是没做动画,但是实际上是正在动画.直接调用stopAnimation是不会停止做动画的
    		[self startAnimation];
    		[self stopAnimation];
    	} else {
    		[self startAnimation];
    	}	
    }
    
    

    仔细想想水果还是挺坑的.

    展开全文
  • unity2D动画-角色切片做动画写在前面的话开发环境与准备用角色切片做动画终于可以Key动画了2DAnimation插件做动画总结 写在前面的话 这个不算教程的教程主要是让组里的美术与策划们看的,会写的十分基础与详细,为...

    写在前面的话


    更新
    建议有复杂2D动画需求的话用spine更好一些,2D Animation插件也进行了更新迭代,这里的介绍算是抛砖引玉了


    这个不算教程的教程主要是让组里的美术与策划们看的,会写的十分基础与详细,为节约看客的时间,大神请绕道!!!
    本教程分两部:
    1.用普通的角色切片,直接Key动画,适合用在机械性的人物与动作(如机器人,甲虫等)
    2.基于2D Animation插件做骨骼动画(绑定骨骼,刷权重,调动画),这个插件貌似是unity2018的新功能,具体什么时候加进unity中的并没有深究,低版本的如果没有这个插件也可以商店下载Unity Anima2D这个插件也能完成功能.

    开发环境与准备

    开发环境:unity2018.2.5f1
    准备图片:(图片都需要加水印请谅解,相信找个合适的图片难不倒大家的)


    (图1)
    在这里插入图片描述
    (图2)

    假如说美术给的图是这样的
    在这里插入图片描述
    那么需要把图处理成程序可用的,这样的图片(并不是说肢体都分成小图不能用,而是需要优化DrawCall)
    在这里插入图片描述
    上图中IronMan这张图在程序里是一种资源(texture),这里面真正要用到的是它下面的小图片,叫做精灵(sprite).
    把小图拼成大图的方法有多种,因为我们程序里面用了TexturePacker这个插件,所以这里也用这个插件处理,
    假设这里我们终于做完了准备工作!
    新建一个IronMan文件夹,这个人物的所有资源就放在这个文件夹下面了,
    因为需要两种实现动画的方式所以我的资源准备好以后就成了这样
    在这里插入图片描述

    用角色切片做动画

    这里用的都是(图2)
    在这里插入图片描述
    点击SpriteEditor,进入精灵编辑面板
    在这里插入图片描述

    上图中的小蓝点,是精灵的中心点,每个精灵都要设置好,精灵的旋转就是以这个点为旋转点.不然调动作的时候会出问题!!!
    下一步,在Hierarchy面板空白处右键-CreateEmpty(创建空物体,改好名字,这里是IronMan)
    在这里插入图片描述

    然后在IronMan物体下右键-2DObject-Sprite创建精灵物体,为精灵物体赋上需要的图片,正确命名各个部件的名称,最终拼成想要的人物,如下图
    在这里插入图片描述
    在这里插入图片描述
    这里层级关系有两个要注意点(层级关系可以设置SpriteRender下面的OrderInLayer参数)
    1.人物层级关系处理的时候,比如大臂带动小臂,小臂带动手,那么大臂是小臂的父物体,小臂是手的父物体.
    2.上图中IronMan_Rig是整个角色,一般来说这个位置会在人物的中心(tips,这个物体的精灵我一般在编辑的时候会放一个角色的参考图,然后设置一下透明度,做肢体拼接的参考,使用完以后再把SpriteRenderer这个组件去掉)
    但是我们多数时候的需求是人物的基准点是脚下而不是中心(这个基准点必须要确定好,不然游戏中人物的位置没办法摆放),这样就需要再加一个父物体IronMan如上图那样设置,把人物的基准位置移到脚下
    这里完成之后不要忘了把你辛辛苦苦拼接起来的小人儿保存成个prefab,保存过后就算你在面板上删掉也能找回来了(创建prefab很简单,选中IronMan,拖到相应的资源文件夹下就好了,成功以后prefab看起来是个蓝色的正方体,面板上的物体变成蓝色)如下图
    在这里插入图片描述

    终于可以Key动画了

    选中IronMan_Rig这个物体,直接按快捷键Ctrl+6,打开Animation编辑面板,点击Create会让你创建一个动画片段,这里我们就新建一个Idle动画,保存路径就和资源路径一样好了,完成后会看见这个界面

    在这里插入图片描述
    讲一下这个模块:
    Preview – 预览,这个选项在你移动timeline的时候自动会勾选上,
    红点 – 是否自动录制,选中以后timeline会变成红色,属性面板中会参与动画的属性也会变成红色,默认是藏蓝色
    一堆箭头 – 不解释了,不懂的话随便点点就知道
    动画片段 – 上图中的Idle按钮,这里点开以后可以切换动画片段和创建新的动画片段,这些片段都是针对这个物体的
    samples – 每秒多少帧,默认60,这个一般不用变
    AddProperty – 添加属性,就是把将要做动画的属性放进里面,属性有很多都能做动画,(这里建议开启自动录制,timeline选择非第一帧的地方直接操作hierarchy(层级)面板,摆pose,它会自动添加你更改的属性,并在第一帧补全当前的属性信息的关键帧)
    Curves – 曲线面板,调动画节奏用的,里面的关键帧对应外面的关键帧,主要用作调中间帧的动画节奏
    timeline – 上面的0:00 0:05 0:10 冒号前面是"秒",冒号后面是"帧",不要理解错了,冒号后面可不是毫秒
    key帧之后,timeline每个关键帧都会有个小菱形表示,选中(支持多选)可以拖动,复制,粘贴等
    具体操作
    点击小红点,就开始自动录制了(timeline与属性面板中被改变的属性会有个暗红色的底),我们在30帧的位置开始创建关键帧,编辑器会在第一帧的位置自动创建一个当前动作信息的关键帧,我编辑出来的关键帧如下图:
    第一个关键帧,自动生成的,startPose
    在这里插入图片描述
    第二个关键帧,人物稍微站起来了一点,胳膊稍微夹起来一点
    在这里插入图片描述

    在这里插入图片描述
    动画面板,第60帧是复制第一帧得到的,这样就得到一个Idle动画了,
    编辑的更生动一些,身体上升动画前移一些,让人物站起来时更有些力度,胳膊与手部动画相对于身体上升动画,稍作延迟,(动画运动原理,别问我怎么知道的,哈哈),
    关键帧就变成下面这样了
    在这里插入图片描述
    动画效果如下
    在这里插入图片描述
    如果注意观察就会发现,脚是会踩进去的,像是站在棉花上面一样,这个BUG很难调好,需要用到IK动画才会变得简单,现在这种简陋的做法肯定是不支持的IK的,只能慢慢调了.这里就不做了.
    到这里所有的整个动作都完成了,千万别忘了最后一步!!!
    点击Apply保存下你做的东西,成功保存后,你所有的操作都会被保存进这个prefab中了,(不放心是否应用成功的话,把prefab拖过来看看你的最新改动在不在就好了)
    在这里插入图片描述
    这个角色切片做动画的到此结束.

    2DAnimation插件做动画

    先导入2DAnimation插件
    window-PackageManager,调出下面面板.In Project是已经导入项目中的插件,All是所有的
    在这里插入图片描述
    导入2D Animation和 2DIK这两个插件(点击上图蓝色的View documentation 可进入官方档,里面也有工具使用方式
    这里还有另外一份文档
    https://forum.unity.com/threads/2d-animation-preview-packages.521778/
    demo by GitHub:
    https://github.com/Unity-Technologies/2d-animation-samples)

    点击图1,同样点击SpriteEditor进入图片编辑模式

    在这里插入图片描述
    BoneEditor是绑骨骼,SkinWeightsAndGeometryEditor是蒙皮(就是改变骨骼控制的范围)
    选择BoneEditor进行骨骼编辑
    使用右下角的Tools进行编辑,基本上使用前两个工具就可以完成了,后面的四个工具有兴趣可以自己试一下,都很简单,(注意我专门在脚下多加了一小段骨骼,这个骨骼就顺着父骨骼的方向就可以,等下加IK控制器要用到它)
    骨骼要正确命名
    在这里插入图片描述
    我们点击apply应用一下,再切换到SkinWeightsAndGeometryEditor,创建一下蒙皮
    在这里插入图片描述
    上面一排按钮,
    Geometry模式下,是把图片切片,可以理解成3D建模中的建模吧,这里遵循够用就是最优的原则,不要创建过多的顶点和三角形,会对游戏性能有影响,一般是关节处生成较多的三角形,蒙皮过后会得到更平滑的形变效果,肢体部分基本不会发生形变的就要少点三角形,以免产生过多的形变.
    Geomete是个下拉框这是我上图中用的参数信息,
    outlineDetail就是边缘细节精细程度,数值越大越精细,
    alphaTolerance是剔除透明区域的精确度
    subdivide,细分程度,直接影响到三角形数量的多少
    选好后再点击cenerate按钮就能看效果了,可以多调调数值试试
    在这里插入图片描述
    上图中我的人物左手由于与身体贴的很近所以没有很好地剔除透明区域
    这时候我们就可以用这些功能修补一下在这里插入图片描述
    Selection - 选择模式
    CreateVertex - 增加顶点
    CreateEdge - 增加线段(把顶点连起来)
    splitEdge - 在线上加点
    修补完成后的效果
    在这里插入图片描述

    点击Weights,菜单栏出现变化,
    在这里插入图片描述
    点击Auto就出现上面的效果,每个骨骼控制的区域都用相应的颜色标出来了,这时候你可以移动骨骼,看看骨骼的影响范围,
    WeightEditor-Brush标签页中可以刷权重,比较麻烦,正常情况下如果你的网格与骨骼设置的合理,就不会出太大问题,毕竟2D的权重影响范围还是很直观的.如果出现不如意的情况,建议先优化骨骼与网格,最后还不行的话再来刷权重.如上图中,设置好了骨骼与网格,两只小臂的权重已经完全受小臂骨骼的影响,
    Apply保存,出来准备做动画啦!!!

    如图创建物体,有个父物体IronMan1,仍然为了把角色中心定位在脚底下,
    在这里插入图片描述

    在属性面板上添加SpriteSkin脚本,点击CreateBones按钮,会直接生成一套刚才编辑好的骨骼,
    这时候打开动画面板,就可以编辑动画了,不过这里面还有个好用的IK动画没说呢,
    在属性面板中再添加一个脚本IKManager2D
    在这里插入图片描述

    Weight - 指的是骨骼受IK影响的程度.0是不影响
    Restore Default Pose - 恢复默认动作
    IKSolvers点加号出现上面的弹窗,三种IK模式
    Chain(CCD)Chain(FABRIK)这两个放在一起说,两个比较像,区别是会FABRIK把关节角度变成反方向,而CCD不会,
    Limb默认只能选前两个关节,跟CCD差不多,
    在这里插入图片描述
    上面的选项点了之后都会自动创建一个对应的管理器,
    我们用CCD,就拿CCD来说创建出来的东西如下图
    在这里插入图片描述
    这里面 Target就是末端骨骼了,Effector这是个控制器,点击下面CreateEffector创建(位置就是Target骨骼的位置,记得之前说脚部多创建出来一小段骨骼吗,作用就在这里,不然控制器的位置在Target骨骼的根部,并不是尾部,不方便做动画)
    ChainLength就是影响的范围.会依次寻找骨骼的父骨骼
    最后,不要忘记保存prefab
    下面是用这套插件做的GIF,这次脚部不会乱动了
    在这里插入图片描述

    总结

    推荐用2DAnimation插件做动画
    优点:
    1.美术工作量小,
    2.动画柔和,做软材质的角色最合适(比如上面机器人的肘部,会自动弯折,很生动)
    3.有IK可以使用,
    缺点:
    由于有了蒙皮,并且肢体并没有被拆分,所以做机械性的刚体属性的角色不能完成.(比如上面的机器人,用了这个后,我并没有让上臂动,因为上臂与身体重合,会带动身体产生形变)
    角色切片这种动画模式Key帧麻烦,组装角色也比较麻烦,美术工作量大,
    但是,类似于刚体动画,2DAnimation插件难以完成的,只能用这个方式

    END

    展开全文
  • 对RecyclerView Item做动画

    千次阅读 2016-07-01 01:40:43
    对RecyclerView Item做动画对RecyclerView Item做动画,刚刚开始研究的时候一些坑,在这里把一些设计思路分享出去添加动态位移,静态位移,缩放等动画,保证了动画状态的平滑衔接效果图: 我的Github,Demo下载...
    
    
    
    
    

    对RecyclerView Item做动画

    对RecyclerView Item做动画,刚刚开始研究的时候一些坑,在这里把一些设计思路分享出去

    添加动态位移,静态位移,缩放等动画,保证了动画状态的平滑衔接

    效果图:





    我的Github,Demo下载

    RecyclerView,ListView这些具有Item复用性的View,想要对其Item做动画,需要注意以下几点:

    1,如果要一点击,让所有Item做动画的效果。例如,上图的编辑和取消,这样的动态动画。可以对所有ViewHolder中的View直接做动画。
    但是需要在onBindViewHolder方法中对复用的item做静态动画,保证动画状态的平滑衔接。



    2,每一个Item的特有属性,例如,上图checkbox的选中状态,都需要把状态字段放到对应的Java bean中, 并在onBindViewHolder方法从java bean取出状态值,设置到view里。


    首先,对一些细节进行分析:

    如何设计一个自定义View,来让他可以自己移动,做动画起来?



    1,首先,创建一个View,他是RecyclerView Item的根布局:

    
            public class SlideRelativeLayout extends RelativeLayout {
                public static final String TAG = SlideRelativeLayout.class.getSimpleName();
                private CheckBox mCheckBox;
                private RelativeLayout mContentSlide;
                private int mOffset;
    
            public SlideRelativeLayout(Context context) {
                super(context);
            }
    
            public SlideRelativeLayout(Context context, AttributeSet attrs) {
                super(context, attrs);
            }
    
            public SlideRelativeLayout(Context context, AttributeSet attrs, int defStyleAttr) {
                super(context, attrs, defStyleAttr);
            }
    
            @Override
            protected void onFinishInflate() {
                super.onFinishInflate();
                mCheckBox = (CheckBox) findViewById(R.id.item_checkbox);
                mContentSlide = (RelativeLayout) findViewById(R.id.item_content_rl);
                setOffset(35);
            }
    
            public void setOffset(int offset) {
                mOffset = (int) (getContext().getResources().getDisplayMetrics().density * offset + 0.5f);
            }
    
            @TargetApi(Build.VERSION_CODES.HONEYCOMB)
            public void openAnimation() {
                ValueAnimator valueAnimator = new ValueAnimator();
                valueAnimator.setIntValues(0, 1);
                valueAnimator.setDuration(300);
                valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
                    @TargetApi(Build.VERSION_CODES.HONEYCOMB_MR1)
                    @Override
                    public void onAnimationUpdate(ValueAnimator valueAnimator) {
                        float fraction = valueAnimator.getAnimatedFraction();
                        int endX = (int) (-mOffset * fraction);
                        doAnimationSet(endX, fraction);
                    }
                });
                valueAnimator.start();
            }
    
            @TargetApi(Build.VERSION_CODES.HONEYCOMB)
            public void closeAnimation() {
                ValueAnimator valueAnimator = new ValueAnimator();
                valueAnimator.setIntValues(0, 1);
                valueAnimator.setDuration(150);
                valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
    
                    @TargetApi(Build.VERSION_CODES.HONEYCOMB_MR1)
                    @Override
                    public void onAnimationUpdate(ValueAnimator valueAnimator) {
                        float fraction = valueAnimator.getAnimatedFraction();
                        int endX = (int) (-mOffset * (1 - fraction));
                        doAnimationSet(endX, (1 - fraction));
                    }
                });
                valueAnimator.start();
            }
    
            @TargetApi(Build.VERSION_CODES.HONEYCOMB)
            private void doAnimationSet(int dx, float fraction) {
                mContentSlide.scrollTo(dx, 0);
                mCheckBox.setScaleX(fraction);
                mCheckBox.setScaleY(fraction);
                mCheckBox.setAlpha(fraction * 255);
            }
    
            public void open() {
                mContentSlide.scrollTo(-mOffset, 0);
            }
    
            public void close() {
                mContentSlide.scrollTo(0, 0);
            }
        }
    
    



    这里,在View树创建完毕之后找到我们需要做动画的子View:

    
            @Override
            protected void onFinishInflate() {
                super.onFinishInflate();
                mCheckBox = (CheckBox) findViewById(R.id.item_checkbox);
                mContentSlide = (RelativeLayout) findViewById(R.id.item_content_rl);
                setOffset(35);
            }
    
    



    然后,设计4个方法,分别为:动态的打开动画,动态的关闭动画,静态的打开动画,静态的关闭动画。

    
            @TargetApi(Build.VERSION_CODES.HONEYCOMB)
            public void openAnimation() {
                ValueAnimator valueAnimator = new ValueAnimator();
                valueAnimator.setIntValues(0, 1);
                valueAnimator.setDuration(300);
                valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
                    @TargetApi(Build.VERSION_CODES.HONEYCOMB_MR1)
                    @Override
                    public void onAnimationUpdate(ValueAnimator valueAnimator) {
                        float fraction = valueAnimator.getAnimatedFraction();
                        int endX = (int) (-mOffset * fraction);
                        doAnimationSet(endX, fraction);
                    }
                });
                valueAnimator.start();
            }
    
            @TargetApi(Build.VERSION_CODES.HONEYCOMB)
            public void closeAnimation() {
                ValueAnimator valueAnimator = new ValueAnimator();
                valueAnimator.setIntValues(0, 1);
                valueAnimator.setDuration(150);
                valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
    
                    @TargetApi(Build.VERSION_CODES.HONEYCOMB_MR1)
                    @Override
                    public void onAnimationUpdate(ValueAnimator valueAnimator) {
                        float fraction = valueAnimator.getAnimatedFraction();
                        int endX = (int) (-mOffset * (1 - fraction));
                        doAnimationSet(endX, (1 - fraction));
                    }
                });
                valueAnimator.start();
            }
    
            @TargetApi(Build.VERSION_CODES.HONEYCOMB)
            private void doAnimationSet(int dx, float fraction) {
                mContentSlide.scrollTo(dx, 0);
                mCheckBox.setScaleX(fraction);
                mCheckBox.setScaleY(fraction);
                mCheckBox.setAlpha(fraction * 255);
            }
    
            public void open() {
                mContentSlide.scrollTo(-mOffset, 0);
            }
    
            public void close() {
                mContentSlide.scrollTo(0, 0);
            }
    
            @TargetApi(Build.VERSION_CODES.HONEYCOMB)
            private void doAnimationSet(int dx, float fraction) {
                mContentSlide.scrollTo(dx, 0);
                mCheckBox.setScaleX(fraction);
                mCheckBox.setScaleY(fraction);
                mCheckBox.setAlpha(fraction * 255);
            }
    
    



    对子View做动画我采取的策略是:使用属性动画,在每一贞动画里获取到对应的值,对子View做相应的动画,例如:动态的打开动画。

    onAnimationUpdate方法,显示每一贞动画都会回调一次

    
    
            @TargetApi(Build.VERSION_CODES.HONEYCOMB)
            public void openAnimation() {
                ValueAnimator valueAnimator = new ValueAnimator();
                valueAnimator.setIntValues(0, 1);
                valueAnimator.setDuration(300);
                valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
                    @TargetApi(Build.VERSION_CODES.HONEYCOMB_MR1)
                    @Override
                    public void onAnimationUpdate(ValueAnimator valueAnimator) {
                        float fraction = valueAnimator.getAnimatedFraction();
                        int endX = (int) (-mOffset * fraction);
                        doAnimationSet(endX, fraction);
                    }
                });
                valueAnimator.start();
            }
    
            @TargetApi(Build.VERSION_CODES.HONEYCOMB)
            private void doAnimationSet(int dx, float fraction) {
                mContentSlide.scrollTo(dx, 0);
                mCheckBox.setScaleX(fraction);
                mCheckBox.setScaleY(fraction);
                mCheckBox.setAlpha(fraction * 255);
            }
    


    这样RecylerView 带有动态动画和静态动画的View就设计好了。


    2,在bind方法中使用静态动画,动态动画对外提供方法调用:

    
            private class SlideViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
    
                private SlideRelativeLayout mSlideRelativeLayout;
                private CheckBox mCheckBox;
                private ItemBean mItemBean;
    
                public SlideViewHolder(View itemView) {
                    super(itemView);
                    mSlideRelativeLayout = (SlideRelativeLayout) itemView.findViewById(R.id.item_root);
                    mCheckBox = (CheckBox) itemView.findViewById(R.id.item_checkbox);
                    itemView.setOnClickListener(this);
                }
    
                public void bind(ItemBean itemBean) {
                    mItemBean = itemBean;
                    mCheckBox.setChecked(itemBean.isChecked());
                    switch (mState) {
                        case NORMAL:
                            mSlideRelativeLayout.close();
                            break;
    
                        case SLIDE:
                            mSlideRelativeLayout.open();
                            break;
                    }
                }
    
                public void openItemAnimation() {
                    mSlideRelativeLayout.openAnimation();
                }
    
                public void closeItemAnimation() {
                    mSlideRelativeLayout.closeAnimation();
                }
    



    可以看到静态动画在bind里调用,打开或者关闭是由mState变量决定的。而动态的滑动需要手动调用,那怎么来使用这些动画呢?

    动态动画的使用方法:存储所有创建出来的ViewHolder,统一调用动态动画方法。并设置mState变量值,防止滑动时动画不能平滑衔接.

    
            private List<SlideViewHolder> mSlideViewHolders = new ArrayList<>();
    
            public void openItemAnimation() {
                mState = SLIDE;//
                for (SlideViewHolder holder : mSlideViewHolders) {
                    holder.openItemAnimation();
                }
            }
    
            public void closeItemAnimation() {
                mState = NORMAL;
                for (SlideViewHolder holder : mSlideViewHolders) {
                    holder.closeItemAnimation();
                }
            }
    
    


    而外面又是这样调用的:

    
            private void editItems() {
                if ("编辑".equals(mRightTV.getText().toString())) {
                    mRightTV.setText("取消");
                    mSlideAdapter.openItemAnimation();
                } else if ("取消".equals(mRightTV.getText().toString())) {
                    mRightTV.setText("编辑");
                    mSlideAdapter.closeItemAnimation();
                }
            }
    


    总体就是:点击按钮 – 变量ViewHolder集合做动态动画,并设置mState变量 – 手机滑动屏幕走bind方法又是根据mState做静态动画

    动画从而平滑的衔接起来

    再来看一次效果图:


    动态动画起先,设置状态值,引导处理正确的静态动画,RecyclerView item的动画处理是不是变简单了。



    还有,对item的特殊数据需要在对应的java bean里设置值,在bind方法取值设置到item中去。

    分析就到这里了,小程序一枚。

    我的Github

    2016年7月01日 1:16:33


    展开全文
  • paraView做动画(终极教程)

    千次阅读 2020-01-03 16:07:29
    paraView做动画(终极教程) 前几天有网友问怎么将计算结果输出成动画,我想可以分以下几个步骤 1)计算结果case文件夹中,输入paraFoam打开后处理软件paraview,并作后处理作出你想要的效果。关于paraview怎么用?...
  • Flash骨骼绑定做动画

    千次阅读 2015-07-18 16:59:43
    用骨骼工具制作小人动画 先将小人的人体部件画出来 再将部件组装起来。 将人全选,设为影片剪辑。 双击小人。...然后动画就跟做动画补间一样,插入关键帧就右键,插入姿势。就可以做自己想要的动作。
  • Android使用XML做动画UI

    千次阅读 2013-07-11 20:42:22
    做动画可以通过XML或Android代码。本教程中,介绍使用XML来做动画。在这里,介绍基本的动画,如淡入,淡出,旋转等。 效果: http://www.56.com/u82/v_OTM4MDk5MTk.html 第一步: 创建anim文件夹放置动画xml文件 在...
  • 一、用setTimeout做动画时每帧动画时间间隔设置为多少合适? 因为目前大多数电脑显示器的刷新频率是60HZ,大多数浏览器都会对页面重绘操作加以限制,使其不超过显示器的重绘频率;因为即使超过那个频率用户体验也...
  • Cocos2d-x 3.x plist+png 做动画

    千次阅读 2014-09-28 22:15:56
    Cocos2d-x 3.x ,plist+png 做动画,TexturePacker应用,开场动画
  • WPF在做动画效果时,storyboard的targetname该怎么用。
  • 译者:Haley_WongiOS 10 带来了一大票有意思的新特性,像 UIViewPropertyAnimator,它是一个改善动画处理的全新的类。 这个视图属性动画完全颠覆了我们已经习惯的流程,能够为动画逻辑添加更精细的控制。一个简单的...
  • 突发奇想,突然想给toobar上面的那个扫一扫标志做个动画,这样子明显一些, ...但是真的开始做了,才发现原来跟平常的view做动画 有点不一样。 首先是我的menu xml文件 xmlns:app="http://schemas.android.com/a
  • flash做动画教程(基础篇)

    万次阅读 2018-11-01 15:41:02
    一定要在点击落石层,在时间轴上选一个时间(落石落到后的位置的时间) 创建补间动画,记住如果创建补间动画以后,线是虚线那么操作有误,只有实线才是操作 最后、去掉引导线, 关闭眼睛 } ...
  • 这样做动画交互,一点都不费力!

    千次阅读 2019-01-09 12:02:05
    **导语:**Lottie是Airbnb开源的一个面向 iOS、Android、React Native 的动画库,可实现非常复杂的动画,使用也及其简单,极大释放人力,值得一试。 一、简介 Lottie 是Airbnb开源的一个面向 iOS、Android、React ...
  • three.js学习笔记 用Tween.js做动画

    千次阅读 2016-01-06 19:44:47
    我们可以通过Tween.js控制我们的camera(相机)进行漫游或是控制物体或是粒子进行补间动画的操作。  添加补间动画  1.定义要控制的属性 var option = { px: camera.position.x, pz: camera.position.z }; 我们...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 319,826
精华内容 127,930
关键字:

做动画