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. 一天搞定CSS: overflow--14

    overflow:针对超出父级的内容如何显示 代码演示 <!DOCTYPE html> <html> <head> <meta charset="U ...

  2. Java之线程同步练习

    1.有一张银行卡:*属性:name,money(账户余额)* 多线程操作同一张银行卡: 金额:x(每次存钱取钱的数额,取钱时x为负数,存钱时x为整数) 定义一个add方法:用于存取钱,参数为x,即每次 ...

  3. Javascript事件模型(二):Javascript事件的父元素和子元素

    DOM事件标准定义了两种事件流,分别是捕获和冒泡.默认情况下,事件使用冒泡事件流,不使用捕获事件流.你可以指定使用捕获事件流,方法是在注册事件时传入useCapture参数,将这个参数设为true. ...

  4. (转)C++——std::string类的引用计数

    1.概念 Scott Meyers在<More Effective C++>中举了个例子,不知你是否还记得?在你还在上学的时候,你的父母要你不要看电视,而去复习功课,于是你把自己关在房间里 ...

  5. java控件之树形结构JTree

    import javax.swing.JFrame; import javax.swing.JTree; import javax.swing.event.TreeSelectionEvent; im ...

  6. php面向对象3

    类的定义 基本定义 class 类名{ 访问修饰符 成员属性; 访问修饰符 成员方法; } 说明: ①类一定要class关键词修饰 ②类名的规范说明,使用大驼峰法 ③php 中,类名不区分大小写.但是 ...

  7. vue 高德地图之玩转周边

    前言:在之前的博客中,有成功引入高德地图,这是以前的地址  vue 调用高德地图. 因为一些需求,需要使用到地图的周边功能. 完整的项目代码请查看  我的github 一 .先看要实现的结果,参考了链 ...

  8. RMAN备份与恢复(一)--认识RMAN

    RMAN(Recovery Manager)是Oracle恢复管理器的简称,是集数据库备份(backup).修复(restore)和恢复(recover)于一体的工具.接下来了解一下RMAN中的几个重 ...

  9. .NET ORM框架 SqlSuagr4.0 功能详解与实践【开源】

    SqlSugar 4.0 ORM框架的优势 为了未来能够更好的支持多库分布式的存储,并行计算等功能,将SqlSugar3.x全部重写,现有的架构可以轻松扩展多库. 源码下载: https://gith ...

  10. [转] 传说中的WCF

    这个解决方案中包含两个项目,一个叫Server,另一个叫Client,天生一对. 1.启动VS 2010,推荐用2010以上版本(2012 RC版也行),因为越高版本越好用,最好Express的,不要 ...