Android学习之逐帧动画
2023-03-14 10:26:15 时间
动画分为逐帧动画(Frame)、补间动画(Tween) 和属性动画。
1、逐帧动画
通常采用XML资源文件进行定义,如下:
android:oneshot 设置是否循环播放动画,false为循环播放为默认的设置,xml文件定义帧动画资源,在程序中用一个ImageView就可以显示该动画了。
需要指出的是AnimationDrawable代表的动画默认是不播放的,需要在程序中启动,调用start() 和 stop() .
<?xml version="1.0" encoding="utf-8"?> <!-- 指定动画循环播放 --> <animation-list xmlns:android="http://schemas.android.com/apk/res/android" android:oneshot="false"> <!-- 添加多个帧 --> <item android:drawable="@drawable/fat_po_f01" android:duration="60" /> <item android:drawable="@drawable/fat_po_f02" android:duration="60" /> <item android:drawable="@drawable/fat_po_f03" android:duration="60" /> <item android:drawable="@drawable/fat_po_f04" android:duration="60" /> <item android:drawable="@drawable/fat_po_f05" android:duration="60" /> </animation-list>
子弹爆炸效果实例
import java.lang.reflect.Field; import android.app.Activity; import android.content.Context; import android.graphics.Canvas; import android.graphics.drawable.AnimationDrawable; import android.media.MediaPlayer; import android.os.Bundle; import android.view.MotionEvent; import android.view.View; import android.view.View.OnTouchListener; import android.widget.FrameLayout; import android.widget.ImageView; public class Blast extends Activity { private MyView myView; private AnimationDrawable anim; private MediaPlayer bomb; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // 使用FrameLayout布局管理器,它允许组件自己控制位置 FrameLayout frame = new FrameLayout(this); setContentView(frame); // 设置使用背景 frame.setBackgroundResource(R.drawable.back); // 加载音效 bomb = MediaPlayer.create(this, R.raw.bomb); myView = new MyView(this); // 设置myView用于显示blast动画 myView.setBackgroundResource(R.anim.blast); // 设置myView默认为隐藏 myView.setVisibility(View.INVISIBLE); // 获取动画对象 anim = (AnimationDrawable) myView.getBackground(); frame.addView(myView); frame.setOnTouchListener(new OnTouchListener() { public boolean onTouch(View source, MotionEvent event) { // 只处理按下事件(避免每次产生两个动画效果) if (event.getAction() == MotionEvent.ACTION_DOWN) { // 先停止动画播放 anim.stop(); float x = event.getX(); float y = event.getY(); // 控制myView的显示位置 myView.setLocation((int) y - 40, (int) x - 20); myView.setVisibility(View.VISIBLE); // 启动动画 anim.start(); // 播放音效 bomb.start(); } return false; } }); } // 定义一个自定义View,该自定义View用于播放“爆炸”效果 class MyView extends ImageView { public MyView(Context context) { super(context); } // 定义一个方法,该方法用于控制MyView的显示位置 public void setLocation(int top, int left) { this.setFrame(left, top, left + 40, top + 40); } // 重写该方法,控制如果动画播放到最后一帧时,隐藏该View protected void onDraw(Canvas canvas) { try { Field field = AnimationDrawable.class.getDeclaredField("mCurFrame"); field.setAccessible(true); // 获取anim动画的当前帧 int curFrame = field.getInt(anim); // 如果已经到了最后一帧 if (curFrame == anim.getNumberOfFrames() - 1) { // 让该View隐藏 setVisibility(View.INVISIBLE); } } catch (Exception e) { } super.onDraw(canvas); } } }blast.xml
<?xml version="1.0" encoding="utf-8"?> <!-- 定义动画只播放一次,不循环 --> <animation-list xmlns:android="http://schemas.android.com/apk/res/android" android:oneshot="true" > <item android:drawable="@drawable/bom_f01" android:duration="80" /> <item android:drawable="@drawable/bom_f02" android:duration="80" /> <item android:drawable="@drawable/bom_f03" android:duration="80" /> <item android:drawable="@drawable/bom_f04" android:duration="80" /> <item android:drawable="@drawable/bom_f05" android:duration="80" /> <item android:drawable="@drawable/bom_f06" android:duration="80" /> <item android:drawable="@drawable/bom_f07" android:duration="80" /> <item android:drawable="@drawable/bom_f08" android:duration="80" /> <item android:drawable="@drawable/bom_f09" android:duration="80" /> <item android:drawable="@drawable/bom_f10" android:duration="80" /> <item android:drawable="@drawable/bom_f11" android:duration="80" /> <item android:drawable="@drawable/bom_f12" android:duration="80" /> <item android:drawable="@drawable/bom_f13" android:duration="80" /> <item android:drawable="@drawable/bom_f14" android:duration="80" /> <item android:drawable="@drawable/bom_f15" android:duration="80" /> <item android:drawable="@drawable/bom_f16" android:duration="80" /> <item android:drawable="@drawable/bom_f16" android:duration="80" /> <item android:drawable="@drawable/bom_f17" android:duration="80" /> <item android:drawable="@drawable/bom_f18" android:duration="80" /> <item android:drawable="@drawable/bom_f19" android:duration="80" /> <item android:drawable="@drawable/bom_f20" android:duration="80" /> <item android:drawable="@drawable/bom_f21" android:duration="80" /> <item android:drawable="@drawable/bom_f22" android:duration="80" /> <item android:drawable="@drawable/bom_f23" android:duration="80" /> <item android:drawable="@drawable/bom_f24" android:duration="80" /> <item android:drawable="@drawable/bom_f25" android:duration="80" /> <item android:drawable="@drawable/bom_f26" android:duration="80" /> <item android:drawable="@drawable/bom_f27" android:duration="80" /> </animation-list>
相关文章
- LibreOffice 7.5 发布:漂亮的新应用图标和酷炫功能
- elementary OS 7 发布
- Windows 应用兼容层 Wine 8.1 发布:默认启用“Windows 10”前缀
- 微软正测试新功能:当 Windows 11 有新的小组件可用时会提醒通知
- 解析分布式存储选型和应用九个典型问题
- ClickHouse在自助行为分析场景的实践应用
- Chrome DevTools 远程调试安卓网页的原理
- Uni-app + Vue3 页面如何跳转及传参?
- 微软证实系统还原点会损坏 Windows 11 22H2 版本应用程序
- 巧用 Transition 实现短视频 APP 点赞动画
- 初学者试试,HarmonyOS应用开发者基础认证
- 媒体实测微软 Windows 开发工具包 2023:存在不兼容 HDR 显示器、某些应用无法运行等问题
- 快速了解Navigator API SetAppBadge
- 微软 Windows 11 Dev 预览版 Build 25276 发布,应用兼容问题对话框 UI 改进
- 基于Next.js、Prisma、Postgres和Fastfy构建全栈APP
- 开始菜单搜索框变圆角,微软 Windows 11 Beta 预览版 22621.1095 和 22623.1095 发布
- 2022-2023 十大应用开发趋势
- 观远数据发布业内首部《移动BI白皮书》,深入业务数字化场景重新定义移动BI
- Windows 10 学院:不借助第三方工具如何卸载 Windows 10 预装应用
- 正处高质量发展期,我国大数据产业突破1.3万亿元