AndroID的动画大致分为三种 ,分别是 逐帧动画 ,补间动画 ,属性动画
二.逐帧动画逐帧动画的工作原理很简单,其实就是将一个完整的动画拆分成一张张单独的图片,然后再将它们连贯起来进行播放,类似于动画片的工作原理。
步骤:
示例代码,第一步,创建Drawable文件:
<?xml version="1.0" enCoding="utf-8"?><animation-List xmlns:androID="http://schemas.androID.com/apk/res/androID" androID:oneshot="false"> <item androID:drawable="@drawable/image1" androID:duration="500"/> <item androID:drawable="@drawable/image2" androID:duration="500"/> <item androID:drawable="@drawable/image3" androID:duration="500"/></animation-List>
说明:
androID:oneshot=“false”: 表示是否重复播放动画,还是只播放一次;每个item都有Drawable和duration属性,Drawable表示我们要播放的图片;duration表示这张图播放的时间;示例代码,第二步,用AnimationDrawable播放动画:
button = findVIEwByID(R.ID.button); button.setBackgroundResource(R.drawable.frame_animation);//把Drawable设置为button的背景 AnimationDrawable drawable = (AnimationDrawable) button.getBackground();//拿到这个我们定义的Drawable,实际也就是AnimationDrawabledrawable.start();//开启动画
**注意:**在使用帧动画是应该尽量避免使用过多尺寸较大的图片,否则容易引起OOM
我们只需要拿到一个vIEw,设定它开始和结束的位置,中间的vIEw会自动由系统补齐,而不需要帧动画每一幅图都是提前准备好的。
补间动画是AndroID一开始就提供的比较原始的动画,主要支持四种效果:平移、缩放、旋转、透明度变化(渐变) 四种基本效果,我们可以再这四种基础效果的基础上,选择其中的几种进行组合。
VIEw动画的四种基本效果对应了四个Animation的子类,如下:
第一步创建动画的xml文件
<?xml version="1.0" enCoding="utf-8"?><translate xmlns:androID="http://schemas.androID.com/apk/res/androID" androID:fromXDelta="100" //水平开始点的坐标 androID:fromYDelta="0" androID:toXDelta="0" //水平结束点的坐标 androID:toYDelta="0"/>
缩放动画<?xml version="1.0" enCoding="utf-8"?><scale xmlns:androID="http://schemas.androID.com/apk/res/androID" androID:duration="1000" //动画的时间间隔 androID:fromXScale="0.0" //水平缩放的起始值 androID:fromYScale="0.0" androID:pivotX="50%" //pivotX和pivotY表示以缩放中心的位置。 androID:pivotY="50%" androID:toXScale="1.0" //水平方向缩放的结束值 androID:toYScale="1.0"/>
旋转动画<?xml version="1.0" enCoding="utf-8"?><rotate xmlns:androID="http://schemas.androID.com/apk/res/androID" androID:fromDegree="0" //开始旋转的角度 androID:toDegree="1800" // androID:pivotX = "50%" androID:pivotY="50%" androID:duration = "3000"/>
渐变动画<?xml version="1.0" enCoding="utf-8"?><Alpha xmlns:androID="http://schemas.androID.com/apk/res/androID" androID:duration="1000" //动画的持续时间 androID:fromAlpha="1.0" //透明度的起始值 androID:fillAfter = true //动画结束之后VIEw是否停留在结束位置 androID:interpolator="@androID:anim/accelerate_decelerate_interpolator" androID:toAlpha="0.0" //透明度的结束值 />
注意点:
interpolator表示动画插值器, 可以控制动画的变化速率, 比如前200ms很慢,中间600ms很快,最后200ms又很慢。
pivot 这个属性主要是在translate 和 scale 动画中,这两种动画都牵扯到vIEw 的“物理位置“发生变化,所以需要一个参考点。 而pivotX和pivotY就共同决定了这个点;它的值可以是float或者是百分比数值。
以 pivotX 为例,说明其取不同的值的含义:
** 第二步,使用**
Animation animation = AnimationUtils.loadAnimation(this, R.anim.filename);textVIEw.startAnimation(animation);
** 也可用代码完成不借助xml文件**
AlphaAnimation AlphaAnimation = new AlphaAnimation(0,1); AlphaAnimation.setDuration(2000); //设置动画的监听 AlphaAnimation.setAnimationListener(new Animation.AnimationListener() { @OverrIDe public voID onAnimationStart(Animation animation) { } @OverrIDe public voID onAnimationEnd(Animation animation) { Animation animation1= AnimationUtils.loadAnimation(MainActivity.this, R.anim.filename); textVIEw.startAnimation(animation1); } @OverrIDe public voID onAnimationRepeat(Animation animation) { } }); textVIEw.startAnimation(AlphaAnimation);
嵌套使用我们可以使用AnimationSet把VIEw动画的平移、缩放、旋转、渐变都揉在一起,也是既能通过代码实现,也可以通过xml实现
xml实现:
<?xml version="1.0" enCoding="utf-8"?><set xmlns:androID="http://schemas.androID.com/apk/res/androID" androID:interpolator="@androID:anim/accelerate_decelerate_interpolator" > <scale androID:duration="3000" androID:fromXScale="0.0" androID:fromYScale="0.0" androID:pivotX="50%" androID:pivotY="50%" androID:toXScale="1.0" androID:toYScale="1.0"/> <Alpha androID:duration="3000" androID:fromAlpha="1.0" androID:toAlpha="0.5" /> <rotate androID:fromdegrees="0" androID:todegrees="720" androID:pivotX = "50%" androID:pivotY="50%" androID:duration = "3000" /> <translate androID:fromXDelta="0" androID:toXDelta="100" androID:fromYDelta="0" androID:toYDelta="100" /></set>
代码实现:
AnimationSet setAnimation = new AnimationSet(true); // 特别说明以下情况 // 因为在下面的旋转动画设置了无限循环(RepeatCount = INFINITE) // 所以动画不会结束,而是无限循环 // 所以组合动画的下面两行设置是无效的, 以后设置的为准 setAnimation.setRepeatMode(Animation.RESTART); setAnimation.setRepeatCount(1);// 设置了循环一次,但无效 // 旋转动画 Animation rotate = new RotateAnimation(0,360,Animation.relative_TO_SELF,0.5f,Animation.relative_TO_SELF,0.5f); rotate.setDuration(1000); rotate.setRepeatMode(Animation.RESTART); rotate.setRepeatCount(Animation.INFINITE); // 平移动画 Animation translate = new TranslateAnimation(TranslateAnimation.relative_TO_PARENT,-0.5f, TranslateAnimation.relative_TO_PARENT,0.5f, TranslateAnimation.relative_TO_SELF,0 ,TranslateAnimation.relative_TO_SELF,0); translate.setDuration(10000); // 透明度动画 Animation Alpha = new AlphaAnimation(1,0); Alpha.setDuration(3000); Alpha.setStartOffset(7000); // 缩放动画 Animation scale1 = new ScaleAnimation(1,0.5f,1,0.5f,Animation.relative_TO_SELF,0.5f,Animation.relative_TO_SELF,0.5f); scale1.setDuration(1000); scale1.setStartOffset(4000); // 将创建的子动画添加到组合动画里 setAnimation.addAnimation(Alpha); setAnimation.addAnimation(rotate); setAnimation.addAnimation(translate); setAnimation.addAnimation(scale1); // 使用 mbutton.startAnimation(setAnimation);
VIEw动画的特殊使用场景1.LayoutAnimationLayoutAnimation作用于VIEwGroup,为VIEwGroup指定一个动画,然后,当它的子元素出场时都会具有这种效果。这种效果常被用于ListVIEw,有的ListVIEw的每个item都以一定的动画形式出现,用到的就是LayoutAnimation。
使用步骤:
第一步: 定义LayoutAnimation的xml文件;
// res/anim/anim_layout.xml<layoutAnimation xmlns:androID="http://schemas.androID.com/apk/res/androID" androID:delay="0.5" //每个子元素开始动画的时间延迟 androID:animationorder="normal" /* 子元素动画的顺序,有三个值 normal(顺序显示) reverse(逆向显示) random(随机播放入场动画) */ androID:animation="@anim/anim_item"/>
第二步: 指定具体的入场动画;
// res/anim/anim_item.xml<?xml version="1.0" enCoding="utf-8"?><set xmlns:androID="http://schemas.androID.com/apk/res/androID" androID:duration="300" androID:interpolator="@androID:anim/accelerate_interpolator" androID:shareInterpolator="true" > <Alpha androID:fromAlpha="0.0" androID:toAlpha="1.0" /> <translate androID:fromXDelta="500" androID:toXDelta="0" /></set>
第三步: 为VIEwGroup指定androID:layoutAnimation属性;
<ListVIEw androID:ID="@+ID/List" androID:layout_wIDth="match_parent" androID:layout_height="match_parent" androID:layoutAnimation="@anim/anim_layout" androID:background="#fff4f7f9" androID:cachecolorHint="#00000000" androID:divIDer="#dddbdb" androID:divIDerHeight="1.0px" androID:ListSelector="@androID:color/transparent" />
单用代码实现:
ListVIEw ListVIEw = (ListVIEw) layout.findVIEwByID(R.ID.List);Animation animation = AnimationUtils.loadAnimation(this,R.anim.anim_item);LayoutAnimationController controller = new LayoutAnimationController(animation);controller.setDelay(0.5f);controller.setorder(LayoutAnimationController.ORDER_norMAL);ListVIEw.setLayoutAnimation(controller);
2.Activity的切换效果Activity有默认的切换效果,但是我们可以定制,主要用到overrIDePendingTransition(int enteranima, int exitAnima)这个方法:
当启动一个Activity时
Intent intent = new Intent(this,TestActivity.class);startActivity(intent);overrIDePendingTransition(R.anim.enter_anim,R.anim.exit_anim);
当Activity退出时:
@OverrIDe public voID finish() { super.finish(); overrIDePendingTransition(R.anim.enter_anim,R.anim.exit_anim); }
注意:
overrIDePendingTransition这个方法必须位于startActivity或者finish后面,否则动画会没有效果。
Fragment的切换效果:可以使用FragmentTransaction的setCustomAnimation方法添加切换动画。
以上是内存溢出为你收集整理的Android 动画深入分析(一)——逐帧动画,补间动画全部内容,希望文章能够帮你解决Android 动画深入分析(一)——逐帧动画,补间动画所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)