`

关于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;


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

相关推荐

Global site tag (gtag.js) - Google Analytics