在開始实例解说之前,先引用官方文档中的一段话:

Frame动画是一系列图片依照一定的顺序展示的过程,和放电影的机制非常相似。我们称为逐帧动画。Frame动画能够被定义在XML文件里,也能够全然编码实现。

假设被定义在XML文件里,我们能够放置在/res下的anim或drawable文件夹中(/res/[anim | drawable]/filename.xml),文件名称能够作为资源ID在代码中引用;假设由全然由编码实现,我们须要使用到AnimationDrawable对象。

假设是将动画定义在XML文件里的话,语法例如以下:

<?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>
  1. 配置图片资源文件
  2. 在activity中实现frame动画
实例:
执行效果:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvemhhb3lhemhpMjEyOQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">


步骤

把图片放到res/drawable文件夹下

分别取名为:a1.png,a2.png,a3.png,a4.png。a5.png。a6.png。

在res/anim文件夹下创建一个XML配置文件

我们能够将frame.xml文件放置于drawable或anim文件夹,官方文档上是放到了drawable中了,大家能够依据喜好来放置,放在这两个文件夹都是能够执行的。
<?xml version="1.0" encoding="utf-8"?>  

 <!--
根标签为animation-list
当中oneshot代表着是否仅仅展示一遍。设置为false会不停的循环播放动画
根标签下,通过item标签对动画中的每个图片进行声明
android:duration 表示展示所用的该图片的时间长度
-->
<animation-list xmlns:android="http://schemas.android.com/apk/res/android" android:oneshot="false">
<item android:drawable="@drawable/a1" android:duration="1000"></item>
<item android:drawable="@drawable/a2" android:duration="1000"></item>
<item android:drawable="@drawable/a3" android:duration="1000"></item>
<item android:drawable="@drawable/a4" android:duration="1000"></item>
<item android:drawable="@drawable/a5" android:duration="1000"></item>
<item android:drawable="@drawable/a6" android:duration="1000"></item>
</animation-list>
  • animation-list:动画的总标签。这里面放着帧动画 <item>标签

    • oneshot代表着是否仅仅展示一遍

      • true 则表示动画仅仅播发一次
      • false会不停的循环播放动画
  • item:记录着每一帧的信息,对动画中的每个图片进行声明
    • android:drawable="@drawable/a"表示这一帧用的图片为"a"。以下以此类推。
    • android:duration="1000" 表示这一帧持续1000毫秒。能够依据这个值来调节动画播放的速度

在res/layout文件夹下创建layout配置文件activity_main.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity" >     <ImageView
        android:id="@+id/imageView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true" />     <Button
        android:id="@+id/btn_begin"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/imageView1"
        android:layout_marginTop="30dp"
        android:layout_toRightOf="@+id/btn_codeBegin"
        android:onClick="click"
        android:text="開始" />     <Button
        android:id="@+id/btn_stop"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBottom="@+id/btn_begin"
        android:layout_marginRight="15dp"
        android:onClick="click"
        android:text="停止" />     <RadioGroup
        android:id="@+id/rg_num"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/btn_stop"
        android:orientation="horizontal" >         <RadioButton
            android:id="@+id/rb_one"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:checked="true"
            android:text="单次播放" />         <RadioButton
            android:id="@+id/rb_more"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="循环播放" />
    </RadioGroup>     <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/rg_num"
        android:text="拖动进度条改动透明度(0 - 255)之间" />     <SeekBar
        android:id="@+id/sb_alpha"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@+id/textView1" />     <Button
        android:id="@+id/btn_codeBegin"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBottom="@+id/btn_stop"
        android:layout_marginRight="15dp"
        android:layout_toRightOf="@+id/btn_stop"
        android:text="代码_启动"
        android:onClick="click" /> </RelativeLayout>

Activity代码

package com.example.lession13_frame;

import android.app.Activity;
import android.graphics.drawable.AnimationDrawable;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.view.View;
import android.widget.ImageView;
import android.widget.RadioGroup;
import android.widget.RadioGroup.OnCheckedChangeListener;
import android.widget.SeekBar;
import android.widget.SeekBar.OnSeekBarChangeListener;
import android.widget.Toast; public class SplashActivity extends Activity { private ImageView imageView;
private AnimationDrawable animationDrawable;
private RadioGroup rgNum;
private SeekBar sbalpha; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 帧动画
imageView = (ImageView) findViewById(R.id.imageView1);
rgNum = (RadioGroup) this.findViewById(R.id.rg_num);
sbalpha = (SeekBar) this.findViewById(R.id.sb_alpha); // 第一种方式实现的动画
/*
* animationDrawable = (AnimationDrawable)
* getResources().getDrawable(R.anim.framebyframe);
* imageView.setBackgroundDrawable(animationDrawable);
*/ // 另外一种方式实现的动画
// 设置背景资源
imageView.setBackgroundResource(R.anim.framebyframe);
animationDrawable = (AnimationDrawable) imageView.getBackground(); // animationDrawable.setOneShot(false);是否循环播放
// animationDrawable.stop();停止播放
// animationDrawable.isRunning();//是否播放
// animationDrawable.getNumberOfFrames();//播放帧
// animationDrawable.getFrame(index); 返回制定索引的 Drawable对象
// animationDrawable.getDuration(i);停留的时间 rgNum.setOnCheckedChangeListener(new OnCheckedChangeListener() { @Override
public void onCheckedChanged(RadioGroup group, int checkedId) {
// TODO Auto-generated method stub
if (checkedId == R.id.rb_one) {
// 设置单次播放
animationDrawable.setOneShot(true);
} else if (checkedId == R.id.rb_more) {
// 设置循环播放
animationDrawable.setOneShot(false);
}
// 设置播放后又一次启动
animationDrawable.stop();
animationDrawable.start();
}
});
// 监听的进度条改动透明度
sbalpha.setOnSeekBarChangeListener(new OnSeekBarChangeListener() { @Override
public void onStopTrackingTouch(SeekBar seekBar) {
} @Override
public void onStartTrackingTouch(SeekBar seekBar) {
} @Override
public void onProgressChanged(SeekBar seekBar, int progress,
boolean fromUser) {
// TODO Auto-generated method stub
// 设置动画Alpha值
animationDrawable.setAlpha(progress);
// 通知imageView 刷新屏幕
imageView.postInvalidate();
}
});
} public void click(View v) {
int id = v.getId();
switch (id) {
case R.id.btn_begin:
animationDrawable.start();
break;
case R.id.btn_stop:
animationDrawable.stop();
break; case R.id.btn_codeBegin:
Toast.makeText(getApplicationContext(), "------------------", 0)
.show();
// 全然编码实现的动画效果
for (int i = 1; i <= 6; i++) {
// 依据资源名称和文件夹获取R.java中相应的资源ID
int picId = getResources().getIdentifier("a" + i, "drawable",
getPackageName());
// 依据资源ID获取到Drawable对象
Drawable drawable = getResources().getDrawable(picId);
// 将此帧加入到AnimationDrawable中
animationDrawable.addFrame(drawable, 300);
}
animationDrawable.setOneShot(false); // 设置为loop
imageView.setBackgroundDrawable(animationDrawable); // 将动画设置为ImageView背景
animationDrawable.start(); // 開始动画 break; default:
break;
}
}
}



AnimationDrawable 就是用来控制这个帧动画,这个类中提供了非常多方法。

  • animationDrawable.start(); 開始这个动画
  • animationDrawable.stop(); 结束这个动画
  • animationDrawable.setAlpha(100);设置动画的透明度, 取值范围(0 - 255)
  • animationDrawable.setOneShot(true); 设置单次播放
  • animationDrawable.setOneShot(false); 设置循环播放
  • animationDrawable.isRunning(); 推断动画是否正在播放
  • animationDrawable.getNumberOfFrames(); 得到动画的帧数。
拖动进度条设置Alpha值的时候 一定要使用     imageView.postInvalidate(); 方法来通知UI线程重绘屏幕中的imageView  否则会看不到透明的效果 。


纯代码实现:
//全然编码实现的动画效果
for (int i = 1; i <= 6; i++) {
//依据资源名称和文件夹获取R.java中相应的资源ID
int picId = getResources().getIdentifier("a" + i, "drawable", getPackageName());
//依据资源ID获取到Drawable对象
Drawable drawable = getResources().getDrawable(picId);
//将此帧加入到AnimationDrawable中
animationDrawable.addFrame(drawable, 300);
}
animationDrawable.setOneShot(false); //设置为loop
imageView.setBackgroundDrawable(animationDrawable); //将动画设置为ImageView背景
animationDrawable.start(); //開始动画 break;

赵雅智_android_frame动画的更多相关文章

  1. 赵雅智_Android编码规范

    凝视 导入mycodetemplates.xml统一凝视样式 须要加凝视的地方 类凝视(必加) 方法凝视(必加) 块凝视主要是数据结构和算法的描写叙述(必加) 类成员变量和常量凝视(选择性加入) 单行 ...

  2. 赵雅智_android多线程下载带进度条

    progressBar说明 在某些操作的进度中的可视指示器,为用户呈现操作的进度,还它有一个次要的进度条,用来显示中间进度,如在流媒体播放的缓冲区的进度. 一个进度条也可不确定其进度.在不确定模式下, ...

  3. 赵雅智:android教学大纲

    带下划线为详细内容链接地址.点击后可跳转.希望给大家尽一些微薄之力.眼下还在整理中 教学章节 教学内容 学时安排 备注 1 Android高速入门 2 Android模拟器与常见命令 3 Androi ...

  4. 赵雅智_ContentProvider

    ContentProvider介绍 ContentProvider是不同应用程序之间进行交换数据的标志API 也就是说:一个应用程序通过ContentProvider暴露自己的数据操作接口,那么无论该 ...

  5. 赵雅智_Fragment生命周期

    官网帮助文档链接:  http://developer.android.com/guide/components/fragments.html 主要看两张图.和跑代码 一,Fragment的生命周 w ...

  6. 赵雅智:js知识点汇总

    watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvemhhb3lhemhpMjEyOQ==/font/5a6L5L2T/fontsize/400/fill/I0 ...

  7. 赵雅智_ListView_BaseAdapter

    Android界面中有时候须要显示略微复杂的界面时,就须要我们自己定义一个adapter,而此adapter就要继承BaseAdapter,又一次当中的方法. Android中Adapter类事实上就 ...

  8. 赵雅智_BroadcastReceiver电话监听

    AndroidManifest.xml 注冊广播接收者 加入权限 <?xml version="1.0" encoding="utf-8"?> &l ...

  9. 赵雅智_BroadcastReceiver

    BroadcastReceiver  用于接收程序(包含用户开放的程序和系统内建程序)所发出的Broadcast intent 耗电量 开机启动 窃取别人短信 窃取别人电话 开发: 创建须要启动的Br ...

随机推荐

  1. Leetcode 466.统计重复个数

    统计重复个数 定义由 n 个连接的字符串 s 组成字符串 S,即 S = [s,n].例如,["abc", 3]="abcabcabc". 另一方面,如果我们可 ...

  2. Leetcode 446.等差数列划分II 子序列

    等差数列划分II 子序列 如果一个数列至少有三个元素,并且任意两个相邻元素之差相同,则称该数列为等差数列. 例如,以下数列为等差数列: 1, 3, 5, 7, 9 7, 7, 7, 7 3, -1, ...

  3. 九度oj 题目1470:调整方阵

    题目描述: 输入一个N(N<=10)阶方阵,按照如下方式调整方阵:1.将第一列中最大数所在的行与第一行对调.2.将第二列中从第二行到第N行最大数所在的行与第二行对调. 依此类推...N-1.将第 ...

  4. 谈谈Python中对象拷贝

    你想复制一个对象?因为在Python中,无论你把对象做为参数传递,做为函数返回值,都是引用传递的. 何谓引用传递,我们来看一个C++交换两个数的函数: void swap(int &a, in ...

  5. [LOJ#121]动态图连通性

    [LOJ#121]动态图连通性 试题描述 这是一道模板题. 你要维护一张无向简单图.你被要求加入删除一条边及查询两个点是否连通. 0:加入一条边.保证它不存在. 1:删除一条边.保证它存在. 2:查询 ...

  6. BZOJ3990 [SDOI2015]排序 【搜索】

    题目 小A有一个1-2^N的排列A[1..2^N],他希望将A数组从小到大排序,小A可以执行的操作有N种,每种操作最多可以执行一次,对于所有的i(1<=i<=N),第i中操作为将序列从左到 ...

  7. 处理登录和cookie

    做法 1: 可以一步一步cookies,毫无疑问,这非常麻烦. import requests params = {'',''} r = requests.post('',params) r = re ...

  8. 关于cookie使用的一些问题

    保存cookie后提取出来发现字符串是被编码过的,需要decodeURIComponent进行下解码才可以 设置cookie setCookie(c_name, value, expiredays) ...

  9. 当axios需要传送application/x-www-form-urlencoded格式参数的问题

    我发送出去的数据发现后台接收不到,查找了一下原因,发现需要form-data的数据后台才可以获取到.于是改成了form-data格式,成功了,后台获取到数据了,有点小激动,但是随即发现发送的数据格式出 ...

  10. POJ3067 Japan

    Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 26270   Accepted: 7132 Description Japa ...