Android 自定义帧动画

Android L ; Android Studio

帧动画

和gif图片类似,顺序播放准本好的图片文件;图片资源在xml文件中配置好
将图片按照预定的顺序一张张切换,即成动画

Android 帧动画例子

可以把动画放进子线程中启动,也可以在主线程直接启动动画
主线程更容易控制动画的启停;
子线程需要关注线程的状态,不好控制动画

主线程的UI不能放进子线程去设置;即子线程不能直接修改主UI;
屏幕旋转后,activity重启;动画也就停止了;
在 AndroidManifest.xml 设置 configChanges 即可

<activity
    android:name=".MainActivity"
    android:configChanges="orientation|keyboardHidden|screenSize"
    android:label="@string/app_name"
    android:theme="@style/AppTheme.NoActionBar" >
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />

        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>

动画资源

图片资源来自Android L Launcher3 res
图片全部放在 res/drawable 里面

配置文件 transition_stack.xml
oneshot="false" 动画会一直循环播放下去

<animation-list
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/transition_stack" android:oneshot="false">
    <item android:drawable="@drawable/stack_00000" android:duration="30" />
    <item android:drawable="@drawable/stack_00001" android:duration="30" />
......
</animation-list>

Java代码

  • 1.取得ImageView
  • 2.为ImageView设置背景资源文件
  • 3.把ImageView的背景赋给动画AnimationDrawable

    public class MainActivity extends AppCompatActivity {
    private ImageView mTransitionIcon;
    private ImageView mStackIcon;
    private AnimationDrawable frameAnimation;
    private AnimationDrawable stackAnimation;
    private Thread stackThread;
    private Button stopButton;
    public boolean action = false;
    
    private TextView tvState;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
        tvState = (TextView) findViewById(R.id.tv_state);
    
        stopButton = (Button) findViewById(R.id.btn_stop);
        Button btn1 = (Button) findViewById(R.id.btn1);
        Button btn2 = (Button) findViewById(R.id.btn2);
    
        /*************************************************
         * AnimationDrawable extends DrawableContainer
         *************************************************/
         // 1.取得ImageView
        mTransitionIcon = (ImageView) findViewById(R.id.settings_transition_image);
        // 2.为ImageView设置背景资源文件
        mTransitionIcon.setBackgroundResource(R.drawable.transition_none);
        // 3.把ImageView的背景赋给动画AnimationDrawable
        frameAnimation = (AnimationDrawable) mTransitionIcon.getBackground();
    
        mStackIcon = (ImageView) findViewById(R.id.transition_stack);
        mStackIcon.setBackgroundResource(R.drawable.transition_stack);
        stackAnimation = (AnimationDrawable) mStackIcon.getBackground();
        stackThread = new Thread() {
            @Override
            public void run() {
                stackAnimation.start();// 子线程中开始动画
            }
        };
    
        btn1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                action = !action;// 主线程中控制动画启动与停止
                if (action) {
                    frameAnimation.start(); // 启动(重启)动画
                } else {
                    frameAnimation.stop(); // 停止动画
                }
            }
        });
    
        btn2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (stackThread.getState() == (Thread.State.NEW))
                    stackThread.start();// 放到子线程中开启动画
            }// 先查询子线程状态再启动,避免Thread报错导致app退出
        });
    
        stopButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String s = "";// 用于显示状态
                s = action ? "action! " + stackThread.getState().toString() :
                        "stop!" + stackThread.getState().toString();
                tvState.setText(s);
            }
        });
    }
    }

    Thread 类

    状态一览:

    /**
     * A representation of a thread's state. A given thread may only be in one
     * state at a time.
     */
    public enum State {
        /**
         * The thread has been created, but has never been started.
         */
        NEW,
        /**
         * The thread may be run.
         */
        RUNNABLE,
        /**
         * The thread is blocked and waiting for a lock.
         */
        BLOCKED,
        /**
         * The thread is waiting.
         */
        WAITING,
        /**
         * The thread is waiting for a specified amount of time.
         */
        TIMED_WAITING,
        /**
         * The thread has been terminated.
         */
        TERMINATED
    }

    一个Button用于启动子线程,可以先判断子线程的状态,再决定是否启动

Android 自定义帧动画的更多相关文章

  1. Android 自定义波浪动画 --"让进度浪起来~"

    原文链接:http://www.jianshu.com/p/0e25a10cb9f5 一款效果不错的动画,实现也挺简单的,推荐阅读学习~ -- 由 傻小孩b 分享 waveview <Andro ...

  2. Android使用帧动画内存溢出解决方法

    Android使用帧动画内存溢出解决方法https://blog.csdn.net/daitu_liang/article/details/52336015https://blog.csdn.net/ ...

  3. Android 逐帧动画

    原理: 逐帧动画是最简单的一种动画.原理就是把几张图片连续显示出来,以达到动画的效果.就相当于下面这种手绘翻页动画啦~ 实现: 1.需要建立一个animation-list来设置静态图片资源.持续时间 ...

  4. Android实现帧动画,以及出场时的动画

    最近有个小需求,在数据上传的时候加一个上传的动画,然后就寻思着自己写一个帧动画 上传开始的时候调用动画,上传结束通知容器将其删除(这个方法应该不会太耗内存),然后吐槽下gif图片还是我自己一帧一帧从p ...

  5. android 通过帧动画方式播放Gif动画

    注意:经过本人测试,这个方法很耗内存, 图片一多就崩了.慎用 <1>用工具(photoshop或者FireWorks)将GIF动画图片分解成多个GIF静态图片,然后保存在res\drawa ...

  6. Android 逐帧动画isRunning 一直返回true的问题

    AnimationDrawabl主要通过xml实现逐帧动画,SDK实例如下: An AnimationDrawable defined in XML consists of a single < ...

  7. Android中帧动画的创建

    帧动画,实质上就是快速播放多张连接效果的图片,现在一般可用于下拉刷新时候的headView 实现步骤: 1.首先应该准备一组连接效果的图片 2.在res>drawable目录下创建xml文件,将 ...

  8. Android 杂谈---帧动画

    Android中的动画有 帧动画 属性动画 补间动画 大体思路 1.需要定义存放每一帧的xml文件,放在drawable文件夹下 设置图片路径和duration,以及shot属性,false---&g ...

  9. Android 逐帧动画( Drawable 动画),这一篇就够了

    前言 作为 Android 最常见的两种动画形式,逐帧动画( Drawable 动画),有着极其广泛的应用,它的原理与早起的电影以及 GIF 类似,就是把一张的图,按顺序快速切换,这样一来看上去就好像 ...

随机推荐

  1. mailto调用本地默认客户端发邮件

    下面介绍如何利用 Mailto功能: 实现 Mailto的基本html代码: <a href="mailto:123@qq.com">点击这里发邮件!</a> ...

  2. 记一次调试串口设备Bug的经历

    最近花了差不多1天的时间在折腾一个Bug,该Bug的表象如下: 这个Bug还特别独特,在开发电脑中无提示,在终端用户那里每次使用软件的时候都报这个.仔细思考了一下最近在源码中新添加的功能,没发现有啥特 ...

  3. 一道C语言安全编码题目

    1.前言 最近在网上看到一道C语言题目,用C语言实现一个函数,给定一个int类型的整数,函数输出逆序的整数,例如输入123,则输出字符串"321",,输入-123,则输出字符串&q ...

  4. Eclipse 下的 Maven的安装及配置

    http://jingyan.baidu.com/article/295430f136e8e00c7e0050b9.html

  5. MySQL left join操作中 on与where放置条件的区别

    优先级 两者放置相同条件,之所以可能会导致结果集不同,就是因为优先级.on的优先级是高于where的. 1 1 首先明确两个概念: LEFT JOIN 关键字会从左表 (table_name1) 那里 ...

  6. javascript对象转换,动态属性取值

    $(document).ready(function(){ var exceptionMsg = '${exception.message }'; var exceptionstr = ''; //j ...

  7. 实现AOP功能的封装与配置的小框架

    内容 java基础巩固笔记 - 实现AOP功能的封装与配置的小框架 设计(目录): XXX = java.util.ArrayList中 代码 Advice接口 MyAdvice类 BeanFacto ...

  8. 【Android Developers Training】 31. 序言:共享简单数据

    注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...

  9. Spring 加载静态资源

    <mvc:default-servlet-handler/> JSP 中通过标签加载js文件或者link标签加载css文件等静态资源时要在springmvc的xml文件中配置以上设置请求就 ...

  10. Docker-compose 多个Docker容器管理:以MYSQL和Wordpress为例

    搬砖的陈大师版权所有,转载请注明:http://www.lenggirl.com/tool/docker-compose.html Docker-compose 多个Docker容器管理:以MYSQL ...