博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android 自定义帧动画
阅读量:6534 次
发布时间:2019-06-24

本文共 3661 字,大约阅读时间需要 12 分钟。

Android 自定义帧动画

Android L ; Android Studio

帧动画

和gif图片类似,顺序播放准本好的图片文件;图片资源在xml文件中配置好

将图片按照预定的顺序一张张切换,即成动画

Android 帧动画例子

可以把动画放进子线程中启动,也可以在主线程直接启动动画

主线程更容易控制动画的启停;
子线程需要关注线程的状态,不好控制动画

主线程的UI不能放进子线程去设置;即子线程不能直接修改主UI;

屏幕旋转后,activity重启;动画也就停止了;
在 AndroidManifest.xml 设置 configChanges 即可

动画资源

图片资源来自Android L Launcher3 res

图片全部放在 res/drawable 里面

配置文件 transition_stack.xml

oneshot="false" 动画会一直循环播放下去

......

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;@Overrideprotected 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用于启动子线程,可以先判断子线程的状态,再决定是否启动

转载地址:http://awkdo.baihongyu.com/

你可能感兴趣的文章
-----二叉树的遍历-------
查看>>
ACM北大暑期课培训第一天
查看>>
Scanner类中输入int数据,再输入String数据不正常的
查看>>
F. Multicolored Markers(数学思维)
查看>>
Python中cPickle
查看>>
Centos7安装搜狗输入法
查看>>
nodjs html 转 pdf
查看>>
再看BP神经网络
查看>>
SQL学习——基本语法
查看>>
SQL学习——数据类型
查看>>
Content Assist not available at the current location
查看>>
java同学毕业后学习之路建议
查看>>
Python字典
查看>>
ofstream 的中文目录问题
查看>>
Android存储方式之SQLite的使用
查看>>
springcloud ribbon 客户端负载均衡用法
查看>>
洛谷P1287 盒子与球 数学
查看>>
自定义starter
查看>>
服务计算与服务生态系统 第二章测验题答案
查看>>
Bootstrap vs Foundation如何选择靠谱前端框架
查看>>