Android Animation:这一次让你彻底了解 Android Frame Animation「建议收藏」

Android Animation:这一次让你彻底了解 Android Frame Animation「建议收藏」Android Animation:这一次让你彻底了解 Android Frame Animation

大家好,又见面了,我是你们的朋友全栈君。

1. 什么是 FrameAnimation?

通过一定顺序展示一系列的图像而形成的动画叫帧动画。

Creates an animation by showing a sequence of images in order with an AnimationDrawable

其实我们平时看的电影、电视剧都是由一帧一帧的画面组成的:

所以从某种意义上说,电影和电视剧也是帧动画,只不过电影、电视剧较长而且有声音。

2. FrameAnimation 的作用是什么?

从上面的定义可知,帧动画的主要作用是按照一定的顺序展示一系列图片。

3. 如何使用 FrameAnimation?

FrameAnimation 创建方式有两种:

  1. XML
  2. CODE

3.1 通过 XML 创建 FrameAnimation

3.1.1 语法
<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
    android:oneshot=["true" | "false"] >
    <item
        android:drawable="@[package:]drawable/drawable_resource_name"
        android:duration="integer" />
</animation-list>
复制代码
3.1.1.2. 属性详解
属性 含义 取值范围
xmlns:android 声明 XML 布局文件属性命名空间 schemas.android.com/apk/res/and…
android:oneshot 是否只播放一次 true 仅播放一次,false 一直循环播放(默认 false)
android:drawable FrameAnimation 中每一帧的图片 Drawable 资源
android:duration FrameAnimation 中每一帧图片持续时间 必须大于等于 0,否则程序将报错
3.1.1.3. 示例
<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/people_001" android:duration="20" />
    <item android:drawable="@drawable/people_002" android:duration="20" />
    <item android:drawable="@drawable/people_003" android:duration="20" />
    <item android:drawable="@drawable/people_004" android:duration="20" />
    <item android:drawable="@drawable/people_005" android:duration="20" />
    <item android:drawable="@drawable/people_006" android:duration="20" />
    <item android:drawable="@drawable/people_007" android:duration="20" />
    <item android:drawable="@drawable/people_008" android:duration="20" />
    <item android:drawable="@drawable/people_009" android:duration="20" />
    <item android:drawable="@drawable/people_010" android:duration="20" />
    <item android:drawable="@drawable/people_011" android:duration="20" />
    <item android:drawable="@drawable/people_012" android:duration="20" />
    <item android:drawable="@drawable/people_013" android:duration="20" />
    <item android:drawable="@drawable/people_014" android:duration="20" />
    <item android:drawable="@drawable/people_015" android:duration="20" />
    <item android:drawable="@drawable/people_016" android:duration="20" />
    <item android:drawable="@drawable/people_018" android:duration="20" />
    <item android:drawable="@drawable/people_019" android:duration="20" />
    <item android:drawable="@drawable/people_020" android:duration="20" />
    <item android:drawable="@drawable/people_021" android:duration="20" />
    <item android:drawable="@drawable/people_022" android:duration="20" />
    <item android:drawable="@drawable/people_023" android:duration="20" />
    <item android:drawable="@drawable/people_024" android:duration="20" />
    <item android:drawable="@drawable/people_025" android:duration="20" />
    <item android:drawable="@drawable/people_026" android:duration="20" />
    <item android:drawable="@drawable/people_027" android:duration="20" />
    <item android:drawable="@drawable/people_028" android:duration="20" />
    <item android:drawable="@drawable/people_029" android:duration="20" />
    <item android:drawable="@drawable/people_030" android:duration="20" />
</animation-list>
复制代码

最终效果如下:

3.2 通过 CODE 创建 FrameAnimation

3.2.1 语法
AnimationDrawable drawable = new AnimationDrawable();
drawable.setOneShot(boolean oneShot);
drawable.addFrame(Drawable frame, int duration);
...
ImageView.setBackground(drawable);
drawable.start();
drawable.stop();
复制代码
3.2.2 示例
AnimationDrawable mAnimationDrawable = new AnimationDrawable();
mAnimationDrawable.setOneShot(false);
mAnimationDrawable.addFrame(getResources().getDrawable(R.drawable.people_001),getResources().getInteger(R.integer.integer_twenty));
mAnimationDrawable.addFrame(getResources().getDrawable(R.drawable.people_002),getResources().getInteger(R.integer.integer_twenty));
mAnimationDrawable.addFrame(getResources().getDrawable(R.drawable.people_003),getResources().getInteger(R.integer.integer_twenty));
mAnimationDrawable.addFrame(getResources().getDrawable(R.drawable.people_004),getResources().getInteger(R.integer.integer_twenty));
mAnimationDrawable.addFrame(getResources().getDrawable(R.drawable.people_005),getResources().getInteger(R.integer.integer_twenty));
mAnimationDrawable.addFrame(getResources().getDrawable(R.drawable.people_006),getResources().getInteger(R.integer.integer_twenty));
mAnimationDrawable.addFrame(getResources().getDrawable(R.drawable.people_007),getResources().getInteger(R.integer.integer_twenty));
mAnimationDrawable.addFrame(getResources().getDrawable(R.drawable.people_008),getResources().getInteger(R.integer.integer_twenty));
mAnimationDrawable.addFrame(getResources().getDrawable(R.drawable.people_009),getResources().getInteger(R.integer.integer_twenty));
mAnimationDrawable.addFrame(getResources().getDrawable(R.drawable.people_010),getResources().getInteger(R.integer.integer_twenty));
mAnimationDrawable.addFrame(getResources().getDrawable(R.drawable.people_011),getResources().getInteger(R.integer.integer_twenty));
mAnimationDrawable.addFrame(getResources().getDrawable(R.drawable.people_012),getResources().getInteger(R.integer.integer_twenty));
mAnimationDrawable.addFrame(getResources().getDrawable(R.drawable.people_013),getResources().getInteger(R.integer.integer_twenty));
mAnimationDrawable.addFrame(getResources().getDrawable(R.drawable.people_014),getResources().getInteger(R.integer.integer_twenty));
mAnimationDrawable.addFrame(getResources().getDrawable(R.drawable.people_015),getResources().getInteger(R.integer.integer_twenty));
mAnimationDrawable.addFrame(getResources().getDrawable(R.drawable.people_016),getResources().getInteger(R.integer.integer_twenty));
mAnimationDrawable.addFrame(getResources().getDrawable(R.drawable.people_017),getResources().getInteger(R.integer.integer_twenty));
mAnimationDrawable.addFrame(getResources().getDrawable(R.drawable.people_018),getResources().getInteger(R.integer.integer_twenty));
mAnimationDrawable.addFrame(getResources().getDrawable(R.drawable.people_019),getResources().getInteger(R.integer.integer_twenty));
mAnimationDrawable.addFrame(getResources().getDrawable(R.drawable.people_020),getResources().getInteger(R.integer.integer_twenty));
mAnimationDrawable.addFrame(getResources().getDrawable(R.drawable.people_021),getResources().getInteger(R.integer.integer_twenty));
mAnimationDrawable.addFrame(getResources().getDrawable(R.drawable.people_022),getResources().getInteger(R.integer.integer_twenty));
mAnimationDrawable.addFrame(getResources().getDrawable(R.drawable.people_023),getResources().getInteger(R.integer.integer_twenty));
mAnimationDrawable.addFrame(getResources().getDrawable(R.drawable.people_024),getResources().getInteger(R.integer.integer_twenty));
mAnimationDrawable.addFrame(getResources().getDrawable(R.drawable.people_025),getResources().getInteger(R.integer.integer_twenty));
mAnimationDrawable.addFrame(getResources().getDrawable(R.drawable.people_026),getResources().getInteger(R.integer.integer_twenty));
mAnimationDrawable.addFrame(getResources().getDrawable(R.drawable.people_027),getResources().getInteger(R.integer.integer_twenty));
mAnimationDrawable.addFrame(getResources().getDrawable(R.drawable.people_028),getResources().getInteger(R.integer.integer_twenty));
mAnimationDrawable.addFrame(getResources().getDrawable(R.drawable.people_029),getResources().getInteger(R.integer.integer_twenty));
mAnimationDrawable.addFrame(getResources().getDrawable(R.drawable.people_030),getResources().getInteger(R.integer.integer_twenty));
mTarget.setBackground(mAnimationDrawable);
mAnimationDrawable.start();
复制代码

最终效果如下:

4. 应用实例

早些时候,很多软件的等待对话框都是通过 FrameAnimation + Dialog 实现的,最经典的例子当属大众点评,不过昨晚再去看的时候,发现大众点评早已“面目全非”,那我们自己动手写一个吧。

//1. 自定义 Dialog

//1.1 Dialog 布局文件
<?xml version="1.0" encoding="utf-8"?>
<ImageView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/custom_dialog_target"
    android:layout_width="@dimen/avatar_background_size_xx"
    android:layout_height="@dimen/avatar_background_size_xx"
    android:background="@drawable/people_walk" />
    
//1.2 Dialog 类
public class CustomDialog extends Dialog {


    public CustomDialog(Context context) {
        super(context, R.style.CustomDialog);
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.dialog_custom);
    }

}

//2. 应用自定义 Dialog

//2.1 Activity 布局文件
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/tween_animation_root_container"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:animateLayoutChanges="true"
    android:background="@color/white">

    <Button
        android:id="@+id/frame_animation_target"
        android:layout_width="@dimen/avatar_background_size_xx"
        android:layout_height="@dimen/avatar_background_size_xx"
        android:layout_centerInParent="true"
        android:background="@drawable/selector_button_common"
        android:text="@string/dialog"
        android:textSize="@dimen/medium_font" />

</RelativeLayout>

//2.2 Activity 类
public class FrameAnimationApplicationActivity extends AppCompatActivity implements View.OnClickListener, Dialog.OnShowListener, Dialog.OnDismissListener {

    private Button mTarget;
    private Dialog mDialog;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_frame_animation_application);
        initView();
        initData();
    }

    private void initView(){
        mTarget = findViewById(R.id.frame_animation_target);
        mTarget.setOnClickListener(this);
    }

    private void initData(){

    }

    @Override
    public void onClick(View v) {
        showDialog();
    }

    private void showDialog(){
        mDialog = new CustomDialog(this);
        mDialog.setOnShowListener(this);
        mDialog.setOnDismissListener(this);
        mDialog.show();

    }

    @Override
    public void onDismiss(DialogInterface dialog) {
        ImageView target = mDialog.findViewById(R.id.custom_dialog_target);
        AnimationDrawable animationDrawable = (AnimationDrawable)target.getBackground();
        animationDrawable.stop();
        mTarget.setVisibility(View.VISIBLE);
    }

    @Override
    public void onShow(DialogInterface dialog) {
        ImageView target = mDialog.findViewById(R.id.custom_dialog_target);
        AnimationDrawable animationDrawable = (AnimationDrawable)target.getBackground();
        animationDrawable.start();
        mTarget.setVisibility(View.GONE);
    }
    
}
复制代码

最终效果如下:

我在这里只是抛砖引玉,FrameAnimation 的更多有意思的用法还要靠小伙伴发挥自己的想象力去想。

5. 参考文献

  1. Animation resources
  2. AnimationDrawable

转载于:https://juejin.im/post/5c86e91ee51d453c887b6797

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/106937.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 计算立方体,圆柱,圆锥体积的小程序是啥_计算圆柱体体积的程序

    计算立方体,圆柱,圆锥体积的小程序是啥_计算圆柱体体积的程序#include<iostream>#include<cmath>usingnamespacestd;voidvolume_square();//立方体体积函数声明voidvolume_cylinder();//圆柱体积函数声明voidvolume_cone();//圆锥体积函数声明intmain(){intchoice=-1;…

  • js数组添加数据和删除数据

    js数组添加数据和删除数据1.栈方法(1).push():向Array的末尾添加若干元素;(2).pop()函数:删除数组中的最后一个数据vararr=[1,2,3,4];arr.push(6,7,8);//push压栈向数组末尾添加元素console.log(arr);//arr=[1,2,3,4,6,7,8];vararr1…

  • 软件工程项目_软件工程对象模型图

    软件工程项目_软件工程对象模型图软件工程中应用的几种图辨析:系统流程图、数据流图、数据字典、实体联系图、状态转换图、层次方框图、Warnier图、IPO图、层次图、HIPO图、结构图、程序流程图、盒图、PAD图、判定表、判定树、Jackson图、流图、甘特图、工程网络图我们先将这几种图按照软件工程中的阶段分类~接下来看一下这些图都长什么样子~1.系统流程图2.数据流图3.数据字典4.E-R图5.状态转换图:6…

  • 常见电容器图片_电容分类图片-各种电容器图片[通俗易懂]

    常见电容器图片_电容分类图片-各种电容器图片[通俗易懂]《电容分类图片-各种电容器图片》由会员分享,可在线阅读,更多相关《电容分类图片-各种电容器图片(7页珍藏版)》请在人人文库网上搜索。1、电容分类图片-各种电容器图片第1幅图1胆电容。图2灯具电容器。图3MKPH电容。图4MET电容。图5,10PEI电容,图6,胆贴片电容。图7MPE电容。图8贴片电容。图11轴向电解电容器。图12MPP电容第2幅图1PPN电容。图2PET电容…

  • 软件设计规格说明书案例(软件需求规格说明书范文)

    软件设计规格说明书转载于:https://www.cnblogs.com/miemieda123/p/9117368.html

  • W3C标准的理解_标准的概念是什么

    W3C标准的理解_标准的概念是什么1.W3C是什么?W3C:万维网联盟(WorldWideWebConsortium),其定义了网页有三部分组成:结构(Structure)、表现(Presentation)、行为(Behavior),分别对应三个标:(1)结构标准主要包括:XHTML、XML等。(2)表现标准主要包括:CSS等。(3)行为标准主要包括:W3CDOM、ECMAScript等。2.标准内容(1)需要声明(DOCTYPE)…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号