Android 自定义帧动画
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 自定义帧动画的更多相关文章
- Android 自定义波浪动画 --"让进度浪起来~"
原文链接:http://www.jianshu.com/p/0e25a10cb9f5 一款效果不错的动画,实现也挺简单的,推荐阅读学习~ -- 由 傻小孩b 分享 waveview <Andro ...
- Android使用帧动画内存溢出解决方法
Android使用帧动画内存溢出解决方法https://blog.csdn.net/daitu_liang/article/details/52336015https://blog.csdn.net/ ...
- Android 逐帧动画
原理: 逐帧动画是最简单的一种动画.原理就是把几张图片连续显示出来,以达到动画的效果.就相当于下面这种手绘翻页动画啦~ 实现: 1.需要建立一个animation-list来设置静态图片资源.持续时间 ...
- Android实现帧动画,以及出场时的动画
最近有个小需求,在数据上传的时候加一个上传的动画,然后就寻思着自己写一个帧动画 上传开始的时候调用动画,上传结束通知容器将其删除(这个方法应该不会太耗内存),然后吐槽下gif图片还是我自己一帧一帧从p ...
- android 通过帧动画方式播放Gif动画
注意:经过本人测试,这个方法很耗内存, 图片一多就崩了.慎用 <1>用工具(photoshop或者FireWorks)将GIF动画图片分解成多个GIF静态图片,然后保存在res\drawa ...
- Android 逐帧动画isRunning 一直返回true的问题
AnimationDrawabl主要通过xml实现逐帧动画,SDK实例如下: An AnimationDrawable defined in XML consists of a single < ...
- Android中帧动画的创建
帧动画,实质上就是快速播放多张连接效果的图片,现在一般可用于下拉刷新时候的headView 实现步骤: 1.首先应该准备一组连接效果的图片 2.在res>drawable目录下创建xml文件,将 ...
- Android 杂谈---帧动画
Android中的动画有 帧动画 属性动画 补间动画 大体思路 1.需要定义存放每一帧的xml文件,放在drawable文件夹下 设置图片路径和duration,以及shot属性,false---&g ...
- Android 逐帧动画( Drawable 动画),这一篇就够了
前言 作为 Android 最常见的两种动画形式,逐帧动画( Drawable 动画),有着极其广泛的应用,它的原理与早起的电影以及 GIF 类似,就是把一张的图,按顺序快速切换,这样一来看上去就好像 ...
随机推荐
- 记一次利用AutoMapper优化项目中数据层到业务层的数据传递过程。
目前项目中获取到DataSet数据后用下面这种方式复制数据. List<AgreementDoc> list = new List<AgreementDoc>(); ].Row ...
- JVM-6.即时编译器
一.即时编译器 二.运行模式 三.基本原理 四.编译优化技术 五.Java与C/C++的编译器对比 六.参考 一.即时编译器 1.在部分虚拟机(如Hotspot.IBM J9)中,Java ...
- 创建的docker容器时间显示错误/date错误/时区错误
前几天在测试应用的功能时,发现存入数据库中的数据create_time或者update_time字段总是错误,其他数据都是正常的,只有关于时间的字段是错误的. 进入linux服务器中查看,也没有任何的 ...
- javascript痛点之二作用域链
1.执行环境(执行上下文) 先看段代码 var a = 10; var b = 20; function cc(){ var c = 30; alert("b="+b); } cc ...
- vscode中使用markdown
vscode中使用markdown vscode 是微软推出一款轻量级的文本编辑工具,类似于sublime,由于其拥有丰富的插件,安装使用也非常简单,所以深受广大程序员的喜爱. markdown 是一 ...
- Dojo初探之1:AMD规范,编写符合AMD规范(异步模块加载机制)的模块化JS(其中dojo采用1.11.2版本)
一.AMD规范探索 1.AMD规范(即异步模块加载机制) 我们在接触js的时候,一般都是通过各种function来定义一些方法,让它们帮我们做一些事情,一个js可以包含很多个js,而这些functio ...
- UIButton图片文字控件位置自定义(图片居右文字居左、图片居中文字居中、图片居左文字消失等)
在开发中经常会碰到需要对按钮中的图片文字位置做调整的需求.第一种方式是通过设置按钮中图片文字的偏移量.通过方法setTitleEdgeInsets和setImageEdgeInsets实现 代码如下: ...
- SQL之trigger(触发器)
先来看一小段程序 有如下三张表: 帐户(编号,姓名,余额,建立日期,储蓄所编号) 储蓄所(编号,名称,地址,人数,所属城市) 借贷(帐户,借贷类型,金额,日期) create trigger tri_ ...
- 什么是Css Hack?ie6,7,8的hack分别是什么?
针对不同的浏览器写不同的CSS code的过程,就是CSS hack. 示例如下: 1 2 3 4 5 6 7 8 9 10 11 12 #test { width:300px; heig ...
- C#开发移动应用系列(3.使用照相机扫描二维码+各种基础知识)
前言 上篇文章地址: C#开发移动应用系列(1.环境搭建) C#开发移动应用系列(2.使用WebView搭建WebApp应用) 今天我们来讲一下如何使用Camera来调用照相机扫描二维码. (Tips ...