`

关于Drawable动画效果的实现demo(参考ray的博客例子)

阅读更多
直接上代码把,上面都写了很清楚的注释:
package com.ray.bubble;

import android.app.Activity;
import android.content.Context;
import android.graphics.drawable.AnimationDrawable;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.view.View.OnTouchListener;
import android.widget.FrameLayout;
import android.widget.ImageView;

public class BubbleExplosion extends Activity {
	private FrameLayout parentLayout;
	private ExplosionView customView;
	private AnimationDrawable exa1;

	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		// 设置无标题栏,全屏效果
		requestWindowFeature(Window.FEATURE_NO_TITLE);
		getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
				WindowManager.LayoutParams.FLAG_FULLSCREEN);
		
		// 代码创建一个FrameLayout,设置背景图片
		parentLayout = new FrameLayout(this);
		parentLayout.setBackgroundResource(R.drawable.bg);
		
		// 代码创建一个自定义ImageView,并添加到上面的FrameLayout当中
		// 并且设置这个ImageView有个动画的背景效果,
		// 设置为不可见
		customView = new ExplosionView(this);
		customView.setVisibility(View.INVISIBLE);
		customView.setBackgroundResource(R.anim.explosion);
		
		// 获取动画效果背景的图像
		exa1 = (AnimationDrawable) customView.getBackground();
		
		parentLayout.addView(customView);
		// 设置页面点击监听
		parentLayout.setOnTouchListener(new LayoutListener());
		setContentView(parentLayout);
	}

	class ExplosionView extends ImageView {
		public ExplosionView(Context context) {
			super(context);
		}

		// handle the location of the explosion
		public void setLocation(int top, int left) {
			this.setFrame(left, top, left + 40, top + 40);
		}
	}

	class LayoutListener implements OnTouchListener {
		public boolean onTouch(View v, MotionEvent event) {
			// first u have to stop the animation,or if the animation
			// is starting ,u can start it again!
			customView.setVisibility(View.INVISIBLE);
			 // 如果动画已在运行,则不起效果
			exa1.stop();
			float x = event.getX();
			float y = event.getY();
			// 重新定位ImageView在layout上的坐标位置
			customView.setLocation((int) y - 20, (int) x - 20);
			customView.setVisibility(View.VISIBLE);
			exa1.start();
			return false;
		}

	}
}

还有重要的就是这个anim文件夹中的explosion.xml
<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
    android:oneshot="true">
    <item android:drawable="@drawable/explode1" android:duration="50" />
    <item android:drawable="@drawable/explode2" android:duration="50" />
    <item android:drawable="@drawable/explode3" android:duration="50" />
    <item android:drawable="@drawable/explode4" android:duration="50" />
</animation-list>


附件是图片资源
分享到:
评论
4 楼 java_chaochao 2010-12-22  
不管怎么样动画都演绎两次 - -
3 楼 java_chaochao 2010-12-22  
刚刚是我的代码, bubble0.png 会显示两次, 不知到怎解决这问题 :(
2 楼 java_chaochao 2010-12-22  
package net.tq5.bubbleexplosion;

import android.app.Activity;
import android.content.Context;
import android.graphics.drawable.AnimationDrawable;
import android.os.Bundle;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.view.View.OnTouchListener;
import android.widget.FrameLayout;
import android.widget.ImageView;

public class BubbleExplosionActivity extends Activity {
	public static final String TAG = "BubbleExplosionActivity";
	/** Called when the activity is first created. */
	private FrameLayout parent;
	private ExplosionView customView;
	private AnimationDrawable exal;

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		// set no title;
		requestWindowFeature(Window.FEATURE_NO_TITLE);
		getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
				WindowManager.LayoutParams.FLAG_FULLSCREEN);
		// Create a FrameLayout and set the background;
		parent = new FrameLayout(this);
		parent.setBackgroundResource(R.drawable.bg);

		customView = new ExplosionView(this);
		customView.setVisibility(View.INVISIBLE);
		customView.setBackgroundResource(R.anim.explosion);

		exal = (AnimationDrawable) customView.getBackground();

		parent.addView(customView);
		parent.setOnTouchListener(new LayoutListener());
		setContentView(parent);
	}

	class ExplosionView extends ImageView {
		public ExplosionView(Context context) {
			super(context);
		}

		// handle the location of the Explosion;
		public void setLocation(int left, int top) {
			this.setFrame(left, top, left + 40, top + 40);
		}
	}

	class LayoutListener implements OnTouchListener {
		@Override
		public boolean onTouch(View view, MotionEvent event) {

			// first you stop the animation
			// you can always restart it;

			customView.setVisibility(View.INVISIBLE);
			if (exal.isRunning())
				return false;
//				exal.stop();
			float x = event.getX();
			float y = event.getY();
			Log.i(TAG, "on Touch");
			customView.setLocation((int) x - 20, (int) y - 20);
			customView.setVisibility(View.VISIBLE);
			exal.start();
			return false;
		}

	}
}


<?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/bubble0" android:duration="500" />
    <item android:drawable="@drawable/explode1" android:duration="500" />
    <item android:drawable="@drawable/explode2" android:duration="500" />
    <item android:drawable="@drawable/explode3" android:duration="500" />
    <item android:drawable="@drawable/explode4" android:duration="500" />
    <item android:drawable="@drawable/explode5" android:duration="500" />
</animation-list>
1 楼 java_chaochao 2010-12-22  
我尝试把资源中的bubble0.png 也写进了exlosion.xml (第一个), 运行是发现有些不对劲,把每个item的duration 都设为500 放慢速度发现, bubble0.png会显示两次。
然后我在代码中用log输出发现每次触摸屏幕都会至少触发两次 onTouch,
我以为是重复调用onTouch回调方法的原因,便做测试:
在 onTouch 中添加代码:
if (exal.isRunning) 
return false;


结果还是不能解决问题, 你测试的时候有这问题吗? 还是我这里什么写错了?

相关推荐

    Drawable的基础demo

    对于动画,`Drawable`提供了动画支持,如`AnimationDrawable`,这是一种帧动画,通过指定每一帧的`Drawable`和持续时间,可以实现连续播放的效果。例如,制作一个简单的动画: ```xml android:id="@+id/animation...

    Android的Drawable学习Demo

    TransitionDrawable可以实现两个Drawable之间的过渡动画;AnimatableDrawable则可以播放帧动画,如常用的旋转动画。 在我们的Demo中,我们将创建一个自定义的Drawable,包含多个ShapeDrawable,并使用...

    自定义Drawable实现灵动的红鲤鱼动画

    在Android开发中,自定义Drawable是创建独特动画效果的重要手段之一。本教程将深入探讨如何利用自定义Drawable来实现一个灵动的红鲤鱼游动动画。这个动画涉及到多个技术点,包括图形绘制、动画帧更新以及算法计算。...

    Android基础——Tween动画、Drawable动画、Property动画、MaterialDesign动画、Trasition动画

    本文将深入探讨Android中的五种主要动画类型:Tween动画、Drawable动画、Property动画、Material Design动画以及Transition动画。 1. Tween动画(补间动画) Tween动画是Android中最基础的动画形式,它通过改变对象...

    android-gif-drawable 支持gif显示DEMO

    在"android-gif-drawable 支持gif显示DEMO"中,开发者可以找到一个实际的示例,展示了如何在Android应用中实现GIF动画的显示。这个DEMO包含两个主要部分:本地GIF显示和网络加载GIF显示。 1. **本地GIF显示**: - ...

    Android属性动画——自定义Drawable(Robots)

    在实际项目中,自定义Drawable配合属性动画可以实现各种创意效果,如滑动菜单的展开动画、按钮的按下反馈、加载指示器等。通过巧妙地利用自定义Drawable和属性动画,开发者可以提升应用的用户体验,增加交互的趣味性...

    android-drawable-animation-demo:Drawable 和动画的 Android Demo

    `android-drawable-animation-demo`项目提供了一个简单的Android应用示例,展示了如何在按钮上使用可绘制对象及其动画效果。这个Demo是用Java编写的,因此我们可以深入探讨Android中的Drawable、动画系统以及如何在...

    博客《Android动画之一:Drawable Animation》附带源码 SwipeWithAnim

    这篇博客《Android动画之一:Drawable Animation》深入探讨了如何使用Drawable Animation来实现平滑的界面过渡效果,同时附带了源码供读者实践和学习。 Drawable Animation基于Drawable对象,它可以是一组连续的...

    DrawableStatesDemo:一个学习自定义Drawable以及学习DrawableState的demo

    这个项目由作者Wangjia55创建,通过它,我们可以学习如何在Java编程环境中实现自定义的可变状态Drawable。 首先,了解`Drawable`的基本概念。`Drawable`是Android中表示图形对象的接口,它可以是一个简单的颜色、...

    android 一些Drawable的简单实现

    这个程序是对android的部分Drawable的实现。包括了BitmapDrawable,InsetDrawable,ClipDrawable,TransitionDrawable,GradientDrawable,...里面没有什么复杂的东西,只是简单实现了这些Drawable,供参考。

    android 各种加载动画效果

    本资源包"android 各种加载动画效果"提供了多种加载进度条的设计与实现,旨在帮助开发者们为自己的应用增添更多个性化和吸引人的元素。 1. **进度条类型** - **圆形进度条**:最常见的一种加载样式,表现为一个...

    博客《Android动画之一:Drawable Animation》附带源码

    通过阅读博客和研究`DrawableAnimationDemo`项目,开发者可以了解如何在Android应用中实现基于Drawable的简单动画效果。虽然这不涉及更复杂的Tween Animation或Property Animation,但对于初学者来说,理解Drawable ...

    帧动画Demo

    在这个"帧动画Demo"中,我们将探讨帧动画的基本原理、实现方式以及在实际项目中的应用。 首先,我们要理解帧动画的基本概念。帧是构成动画的基本单元,每一帧都是一个独立的画面。当这些帧按照一定的速度连续播放时...

    Android自定义Drawable的代码例子

    系统提供了多种预定义的Drawable类型,如Shape、BitmapDrawable等,但有时我们可能需要实现更复杂的视觉效果,这时就需要自定义Drawable。本教程将通过具体的代码示例,介绍如何在Android中创建自定义的Drawable,...

    Android代码-使用SVG实现Drawable切换动画

    DEMO APK How? The library provides a few implementations like SearchArrowDrawable, SearchCrossDrawable or DrawerArrowDrawable: ToggleDrawable drawable = new SearchArrowDrawable(context); ...

    安卓动画效果相关-仿360手机卫士扫描的圆形旋转框动画-自定义Drawable.zip

    这个压缩包"安卓动画效果相关-仿360手机卫士扫描的圆形旋转框动画-自定义Drawable.zip"显然是关于实现一个模仿360手机卫士的扫描动画,该动画通常表现为一个圆形边框持续旋转,给人一种正在处理数据或扫描系统的视觉...

    代码实现drawable的selector效果

    在本示例中,我们将探讨如何通过代码实现Drawable的Selector效果,以及如何处理圆形和圆角图片。 首先,Selector通常在XML中定义,但有时为了程序的动态性或避免为每个控件重复编写XML,我们可以用Java代码来创建。...

    android动画之帧动画(drawable animation)和补间动画(view animation)

    本文将深入探讨两种主要的动画类型:帧动画(Drawable Animation)和补间动画(View Animation),并以一个简单的“太阳地球月亮”模型为例,来阐述这两种动画的实现原理和应用场景。 ### 帧动画 (Drawable ...

Global site tag (gtag.js) - Google Analytics