androidAndroid 学习资源Android知识

那些年一起学过的Android动画(一)

2016-08-26  本文已影响517人  Mapleslong

Android动画有三大类(视图动画、帧动画、属性动画【3.0引进】)

为了就是让人机交互更加友好,(讲的高大上一点更容易被关注!)

合理的使用动画能让用户获得更加愉悦的使用体验!你懂的很愉悦!

动画分类

android已经写好了一些动画可以方便的使用例如『透明度』『旋转』『缩放』『位移』

1.视图动画(View Animation)



   //透明动画  其他动画同理 换一下参数给指定的view启动动画就实现了
    AlphaAnimation aa=new AlphaAnimation(0f,1f);
    aa.setDuration(2000);
    view.startAnimation(aa);
    
    在此我不一一赘述代码。。因为我懒,而且推荐大家自己看看里面的属性,会懂得更多
    释放你的求知欲吧!!
    

动画还需要监听一些事情比如开始、结束、是否重复等等

aa.setAnimationListener(new Animation.AnimationListener() {
            @Override
            public void onAnimationStart(Animation animation) {
                
            }

            @Override
            public void onAnimationEnd(Animation animation) {

            }

            @Override
            public void onAnimationRepeat(Animation animation) {

            }
        });

1.X 接下来我们在介绍中提到AnimationSet


<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <alpha
        android:fromAlpha="0.3"
        android:toAlpha="0.5"></alpha>

    <rotate
        android:fromDegrees="0"
        android:pivotX="50%"
        android:pivotY="50%"
        android:toDegrees="180"/>
    <scale
        android:fromXScale="0.5"
        android:fromYScale="0.5"
        android:pivotX="50%"
        android:pivotY="50%"
        android:toXScale="1"
        android:toYScale="1"/>
    <translate
        android:fromXDelta="50%"
        android:fromYDelta="50%"
        android:toXDelta="100%"
        android:toYDelta="100%"/>
</set>

使用AnimationUtils.loadAnimation(this,R.anim.sad)加载

(吐槽一下我打样子输入法无限给我杨紫你说这么黑好么!!!)


AnimationSet set=new AnimationSet(true);
        set.addAnimation(aa);//加进去就好了 注意内存小心OOM 和内存泄露
        set.setFillAfter(true);//保持结束动画的样子,setFillBefore你懂的
        set.setDuration(5000);
        view.startAnimation(set);


 

2.帧动画(Frame Animation)


度娘说

结论就是 动画标准是一秒24帧,也就是24张画面组成一秒。电视播放标准是25帧每秒。

网络图片素材

用AS的在drawable中新建一个xml

<?xml version="1.0" encoding="utf-8"?>
 <animation-list
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:oneshot="true"
        >
    <!--
    根标签为animation-list,其中oneshot代表着是否只展示一遍,设置为false会不停的循环播放动画
    根标签下,通过item标签对动画中的每一个图片进行声明
    android:duration 表示展示所用的该图片的时间长度
 -->

    <item android:drawable="@drawable/icon1" android:duration="150"></item>
        <item android:drawable="@drawable/icon2" android:duration="150"></item>
        <item android:drawable="@drawable/icon3" android:duration="150"></item>
        <item android:drawable="@drawable/icon4" android:duration="150"></item>
        <item android:drawable="@drawable/icon5" android:duration="150"></item>
        <item android:drawable="@drawable/icon6" android:duration="150"></item>
    </animation-list>
    
    
    在activity中用一下即可
    
        view.setImageResource(R.drawable.icon);
        AnimationDrawable ad = (AnimationDrawable) view.getDrawable();
        ad.start();
        
        当然你可以手动添加图片帧
        ad.addFrame(@NonNull Drawable frame, int duration)
        

3.属性动画(Property Animation)


 AnimatorSet animatorSet = new AnimatorSet();///创建属性动画集
        animatorSet.playTogether(///“playTogether”表示所有的子动画同时运作
                ObjectAnimator.ofFloat(view, "rotationX", 0, 360),
                ObjectAnimator.ofFloat(view, "rotationY", 0, 180),
                ObjectAnimator.ofFloat(view, "rotation", 0, -90),
                ObjectAnimator.ofFloat(view, "translationX", 0, 90),
                ObjectAnimator.ofFloat(view, "translationY", 0, 90),
                ObjectAnimator.ofFloat(view, "scaleX", 1, 1.5f),
                ObjectAnimator.ofFloat(view, "scaleY", 1, 0.5f),
                ObjectAnimator.ofFloat(view, "alpha", 1, 0.25f, 1)
        );
        animatorSet.setDuration(5 * 1000).start();

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:ordering="sequentially">
    <objectAnimator
        android:duration="3000"
        android:propertyName="rotationX"
        android:repeatCount="infinite"
        android:repeatMode="reverse"
        android:startOffset="0"
        android:valueFrom="0"
        android:valueTo="360"
        android:valueType="intType" />


</set>

    AnimatorSet set = (AnimatorSet)             AnimatorInflater.loadAnimator(getApplicationContext(), R.animator.property_animator);
    set.setTarget(mView);//设置一下要动的目标View
    set.start();


一般监听有
ObjectAnimator.ofArgb().addListener(new Animator.AnimatorListener() {
            @Override
            public void onAnimationStart(Animator animation) {
                //动画开始
            }

            @Override
            public void onAnimationEnd(Animator animation) {
                //动画结束
            }

            @Override
            public void onAnimationCancel(Animator animation) {
                //动画取消
            }

            @Override
            public void onAnimationRepeat(Animator animation) {
                //重复动画
            }
        });

        ObjectAnimator.ofFloat(view, "alpha", 1, 0.25f, 1).addUpdateListener(new ValueAnimator
                .AnimatorUpdateListener() {
            @Override
            public void onAnimationUpdate(ValueAnimator animation) {
                //动画值更新通过 animation.getAnimatedValue()取得
                //这个更新值能让我们做一些规律动画
            }
        });
        
        

总结


Animation 是针对视图外观的动画实现,动画被应用时外观改变但视图的触发点不会发生变化,还是在原来定义的位置。

Animator是针对视图属性的动画实现,动画被应用时对象属性产生变化,最终导致视图外观变化。

有问题可以来我博客或者简书反馈,谢谢大家的停留在这里时间

上一篇 下一篇

猜你喜欢

热点阅读