详解Android动画之Frame Animation

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout

xmlns:android=“http://schemas.android.com/apk/res/android”

android:orientation=“vertical”

android:layout_width=“fill_parent”

android:layout_height=“fill_parent”>

<ImageView

android:id=“@+id/frame_image”

android:layout_width=“fill_parent”

android:layout_height=“fill_parent”

android:layout_weight=“1”/>

<Button

android:layout_width=“fill_parent”

android:layout_height=“wrap_content”

android:text=“stopFrame”

android:onClick=“stopFrame”/>

<Button

android:layout_width=“fill_parent”

android:layout_height=“wrap_content”

android:text=“runFrame”

android:onClick=“runFrame”/>

我们定义了一个ImageView作为动画的载体,然后定义了两个按钮,分别是停止和启动动画。

接下来介绍一下如何通过加载动画定义文件来实现动画的效果。我们首先会这样写:

[java] view plain copy print ?

  1. package com.scott.anim;

  2. import android.app.Activity;

  3. import android.graphics.drawable.AnimationDrawable;

  4. import android.graphics.drawable.Drawable;

  5. import android.os.Bundle;

  6. import android.view.View;

  7. import android.widget.ImageView;

  8. public class FrameActivity extends Activity {

  9. private ImageView image;

  10. @Override

  11. protected void onCreate(Bundle savedInstanceState) {

  12. super.onCreate(savedInstanceState);

  13. setContentView(R.layout.frame);

  14. image = (ImageView) findViewById(R.id.frame_image);

  15. image.setBackgroundResource(R.anim.frame);

  16. AnimationDrawable anim = (AnimationDrawable) image.getBackground();

  17. anim.start();

  18. }

  19. }

package com.scott.anim;

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;

public class FrameActivity extends Activity {

private ImageView image;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.frame);

image = (ImageView) findViewById(R.id.frame_image);

image.setBackgroundResource(R.anim.frame);

AnimationDrawable anim = (AnimationDrawable) image.getBackground();

anim.start();

}

}

看似十分完美,跟官方文档上写的一样,然而当我们运行这个程序时会发现,它只停留在第一帧,并没有出现我们期望的动画,也许你会失望的说一句:“Why?”,然后你把相应的代码放在一个按钮的点击事件中,动画就顺利执行了,再移回到onCreate中,还是没效果,这个时候估计你会气急败坏的吼一句:“What the fuck!”。但是,什么原因呢?如何解决呢?

出现这种现象是因为当我们在onCreate中调用AnimationDrawable的start方法时,窗口Window对象还没有完全初始化,AnimationDrawable不能完全追加到窗口Window对象中,那么该怎么办呢?我们需要把这段代码放在onWindowFocusChanged方法中,当Activity展示给用户时,onWindowFocusChanged方法就会被调用,我们正是在这个时候实现我们的动画效果。当然,onWindowFocusChanged是在onCreate之后被调用的,如图:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

然后我们需要重写一下代码:

[java] view plain copy print ?

  1. package com.scott.anim;

  2. import android.app.Activity;

  3. import android.graphics.drawable.AnimationDrawable;

  4. import android.graphics.drawable.Drawable;

  5. import android.os.Bundle;

  6. import android.view.View;

  7. import android.widget.ImageView;

  8. public class FrameActivity extends Activity {

  9. private ImageView image;

  10. @Override

  11. protected void onCreate(Bundle savedInstanceState) {

  12. super.onCreate(savedInstanceState);

  13. setContentView(R.layout.frame);

  14. image = (ImageView) findViewById(R.id.frame_image);

  15. }

  16. @Override

  17. public void onWindowFocusChanged(boolean hasFocus) {

  18. super.onWindowFocusChanged(hasFocus);

  19. image.setBackgroundResource(R.anim.frame);

  20. AnimationDrawable anim = (AnimationDrawable) image.getBackground();

  21. anim.start();

  22. }

  23. }

package com.scott.anim;

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;

public class FrameActivity extends Activity {

private ImageView image;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.frame);

image = (ImageView) findViewById(R.id.frame_image);

}

@Override

public void onWindowFocusChanged(boolean hasFocus) {

super.onWindowFocusChanged(hasFocus);

image.setBackgroundResource(R.anim.frame);

AnimationDrawable anim = (AnimationDrawable) image.getBackground();

anim.start();

}

}

运行一下,动画就可以正常显示了。

如果在有些场合,我们需要用纯代码方式实现一个动画,我们可以这样写:

[java] view plain copy print ?

  1. AnimationDrawable anim = new AnimationDrawable();

  2. for (int i = 1; i <= 4; i++) {

  3. int id = getResources().getIdentifier(“f” + i, “drawable”, getPackageName());

  4. Drawable drawable = getResources().getDrawable(id);

  5. anim.addFrame(drawable, 300);

  6. }

  7. anim.setOneShot(false);

  8. image.setBackgroundDrawable(anim);

  9. anim.start();

AnimationDrawable anim = new AnimationDrawable();

for (int i = 1; i <= 4; i++) {

int id = getResources().getIdentifier(“f” + i, “drawable”, getPackageName());

Drawable drawable = getResources().getDrawable(id);

anim.addFrame(drawable, 300);

}

anim.setOneShot(false);

image.setBackgroundDrawable(anim);

anim.start();

完整的FrameActivity.java代码如下:

[java] view plain copy print ?

  1. package com.scott.anim;

  2. import android.app.Activity;

  3. import android.graphics.drawable.AnimationDrawable;

  4. import android.graphics.drawable.Drawable;

  5. import android.os.Bundle;

  6. import android.view.View;

  7. import android.widget.ImageView;

  8. public class FrameActivity extends Activity {

最后

**一个零基础的新人,我认为坚持是最最重要的。**我的很多朋友都找我来学习过,我也很用心的教他们,可是不到一个月就坚持不下来了。我认为他们坚持不下来有两点主要原因:

他们打算入行不是因为兴趣,而是因为所谓的IT行业工资高,或者说完全对未来没有任何规划。

刚开始学的时候确实很枯燥,这确实对你是个考验,所以说坚持下来也很不容易,但是如果你有兴趣就不会认为这是累,不会认为这很枯燥,总之还是贵在坚持。

技术提升遇到瓶颈了?缺高级Android进阶视频学习提升自己吗?还有大量大厂面试题为你面试做准备!

提升自己去挑战一下BAT面试难关吧

对于很多Android工程师而言,想要提升技能,往往是自己摸索成长,不成体系的学习效果低效漫长且无助。整理的这些知识图谱希望对Android开发的朋友们有所参考以及少走弯路,本文的重点是你有没有收获与成长,其余的都不重要,希望读者们能谨记这一点。

不论遇到什么困难,都不应该成为我们放弃的理由!

如果有什么疑问的可以直接私我,我尽自己最大力量帮助你!

最后祝各位新人都能坚持下来,学有所成。

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

低效漫长且无助**。整理的这些知识图谱希望对Android开发的朋友们有所参考以及少走弯路,本文的重点是你有没有收获与成长,其余的都不重要,希望读者们能谨记这一点。

不论遇到什么困难,都不应该成为我们放弃的理由!

如果有什么疑问的可以直接私我,我尽自己最大力量帮助你!

最后祝各位新人都能坚持下来,学有所成。

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值