android动画(一)——帧动画

一个月没写点东西,最近闲下来打算回顾一下android动画的知识,俗话说温故而知新,就算是简单的东西也要反复的记忆,才能够不会遗忘,废话不多说了,回顾一下常用的动画类型。

常用动画类型

  • 帧动画
    帧动画,顾名思义就是把一系列图片像放电影一样连续的播放,那就要求图片衔接有紧凑感,哈哈。可以跟美工“好好聊聊”了。
  • 补间动画
    补间动画,实现动画的效果是通过对view进行一些图形变换,如平移,旋转,缩放大小,透明度改变。view形式改变,自身的事件并未改变(此处稍后会列举实例去解释)
  • 属性动画
    属性动画,“属性”,看到这两个字应该就能理解到view的变化对自身固有属性产生了影响,与补间动画不同的是,view形式改变,自身的事件也发生改变(如果该view添加了点击事件,那么触发点击事件的位置应该是在view变化后的最终位置)

动画实例分析

  • 帧动画FrameAnimation
    这里我们拿一个项目中常用的例子来演示,为了增加用户体验,通常在网络加载过程中,我们会给用户显示一个loading的动画以示友好,那好,我们就用帧动画来实现这个效果。

首先,我们准备好一组动画loading要用的图片 loading_animlist.xml



<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
                android:oneshot="false">
    <item
        android:drawable="@drawable/loading_01"
        android:duration="150"/>
    <item
        android:drawable="@drawable/loading_02"
        android:duration="150"/>
    <item
        android:drawable="@drawable/loading_03"
        android:duration="150"/>
    <item
        android:drawable="@drawable/loading_04"
        android:duration="150"/>
    <item
        android:drawable="@drawable/loading_05"
        android:duration="150"/>
    <item
        android:drawable="@drawable/loading_06"
        android:duration="150"/>
    <item
        android:drawable="@drawable/loading_07"
        android:duration="150"/>
animation-list>

这里要注意的是,animation-list这个tag只有在drawable文件下的xml中才能使用,duration是该帧图片所用的时间毫秒数

其次,需要给这组图片准备一个播放的载体,我们用imageview,这里我是直接在mainactivity的xml中放了一个图片


<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center"
    tools:context="com.smart.melo.frameanimation.MainActivity">

    <ImageView
        android:id="@+id/iv_load"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/loading_animlist"/>
LinearLayout>

最后,在MainActivy的onCreate()方法中启动该动画

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mImageView = (ImageView) findViewById(R.id.iv_load);
        mImageView.setImageResource(R.drawable.loading_animlist);
        AnimationDrawable animationDrawable = (AnimationDrawable) mImageView.getDrawable();
        animationDrawable.start();

    }

这样就完了么???
你会发现为什么动画不会动,而是静止的呢,如果有经验的朋友会发现,此时window还没初始化完成,那么帧动画是是没有找到该window的,(这里如果用过popupwindow的朋友会知道的),那有什么方法能够解决呢?android系统其实给我们提供了一个onWindowFocusChanged()的方法用来判断是否window初始化完成,那改代码吧,添加这个方法

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mImageView = (ImageView) findViewById(R.id.iv_load);

    }

    @Override
    public void onWindowFocusChanged(boolean hasFocus) {
        super.onWindowFocusChanged(hasFocus);
        mImageView.setImageResource(R.drawable.loading_animlist);
        AnimationDrawable animationDrawable = (AnimationDrawable) mImageView.getDrawable();
        animationDrawable.start();
    }

android动画(一)——帧动画_第1张图片


另外还有的常用方法

        //停止动画
        animationDrawable.stop();
        //动画是否正在播放
        animationDrawable.isRunning();
        //设置是否循环播放
        animationDrawable.setOneShot(true);
        //添加一张图片,并设置持续时间
        animationDrawable.addFrame(getResources().getDrawable(R.drawable.loading_01),200);
        //获取某一帧图片
        animationDrawable.getFrame(0);

注意

帧动画适用图片比较少的情况,如果图片数量庞大,很容易会oom,不但如此,ui会很卡,体验不好,所以帧动画既简单实用,又需要注意细节。

你可能感兴趣的:(【AndroidUi功能】)