android自定义SurfaceView实现跑男动画

先看效果:

代码实现:

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import android.util.AttributeSet;
import android.view.SurfaceHolder;
import android.view.SurfaceView;

/**
 * 奔跑的小人
 *
 * @author shaoshuai
 *
 */
public class RunManView extends SurfaceView {
	private SurfaceHolder holder;
	/** 画布 */
	private Canvas mCanvas;
	/** 画笔 */
	private Paint mPaint;
	/** 视图宽度 */
	private int mWidth;
	/** 视图高度 */
	private int mHeight;

	/** 背景 */
	private Bitmap mBg1;
	/** 奔跑的小人 */
	private Bitmap mPlay1;
	/** 每一帧的动画时间 */
	private int Time = 50;
	/** 当前图片的动画帧 */
	private int mPicPosition = 0;// 动画共10帧,开始为0

	/** 执行动作 */
	private Runnable runnable = new Runnable() {
		@Override
		public void run() {
			myDraw();
		}
	};

	public RunManView(Context context, AttributeSet attrs) {
		super(context, attrs);
		holder = this.getHolder();
		holder.addCallback(callBack);

		mPaint = new Paint();
		mPaint.setColor(Color.YELLOW);

		BitmapFactory.Options ops = new BitmapFactory.Options();
		mBg1 = BitmapFactory.decodeResource(this.getResources(), R.drawable.bg1, ops);
		mPlay1 = BitmapFactory.decodeResource(getResources(), R.drawable.dartman, ops);
	}

	SurfaceHolder.Callback callBack = new SurfaceHolder.Callback() {
		@Override
		public void surfaceCreated(SurfaceHolder holder) {

		}

		@Override
		public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
			// 获取屏幕宽高
			mWidth = width;
			mHeight = height;
			// mRect = new Rect(0, 0, mWidth, mHeight);
			new Thread(runnable).start();
		}

		@Override
		public void surfaceDestroyed(SurfaceHolder holder) {

		}
	};

	private void myDraw() {
		int toLeft = 300;// 距离左侧宽度
		int toTop = mHeight - 100;// 距离顶部高度

		if (toLeft > mWidth) {
			toLeft = 0;
		}
		while (true) {
			try {
				Rect mClipRect = new Rect(toLeft, toTop, toLeft + mPlay1.getWidth() / 10, toTop - mPlay1.getHeight());
				mCanvas = holder.lockCanvas();
				if (mCanvas != null) {
					// 画背景
					mCanvas.drawBitmap(mBg1, null, new Rect(0, 0, mWidth, mHeight), mPaint);
					mCanvas.save();// 保存当前状态
					mCanvas.clipRect(mClipRect);// 裁剪区域
					// 画小人
					mCanvas.drawBitmap(mPlay1, toLeft - mPicPosition * mPlay1.getWidth() / 10,
							toTop - mPlay1.getHeight(), mPaint);
					mCanvas.restore();// 取出保存状态
					mPicPosition++;// 步子加1
					// 无限循环跑动
					if (mPicPosition > 9) {
						mPicPosition = 0;
					}
				}
			} catch (Exception e) {
				e.printStackTrace();
			} finally {
				if (mCanvas != null) {
					holder.unlockCanvasAndPost(mCanvas);
				}
			}
			try {
				Thread.sleep(Time);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}
}

相应的资源文件:

dartman.png

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-09 21:01:44

android自定义SurfaceView实现跑男动画的相关文章

Android自定义下拉刷新动画--仿百度外卖下拉刷新

好久没写博客了,小编之前一段时间一直在找工作,从天津来到了我们的大帝都,感觉还不错.好了废话不多说了,开始我们今天的主题吧.现如今的APP各式各样,同样也带来了各种需求,一个下拉刷新都能玩出花样了,前两天订饭的时候不经意间看到了"百度外卖"的下拉刷新,今天的主题就是它–自定义下拉刷新动画. 看一下实现效果吧: 动画 我们先来看看Android中的动画吧: Android中的动画分为三种: Tween动画,这一类的动画提供了旋转.平移.缩放等效果. Alpha – 淡入淡出 Scale

android自定义GifView显示gif动画

gif动画在web开发中使用的非常的多,利用gif,许多动画不必再用程序编写,现在有非常多的App已经使用到了gif动画,可是android sdk并没有为我们提供gif这种View,所以我们只能自定义一个View,去实现gif效果. android虽然没有为我们提供现成的GifView,但是为我们提供了Movie类,这个类就是用来实现GifView的关键类.它主要有两个最重要的方法,一个是根据动画播放时间设置当前要现显示的帧,二是将当前要显示的帧绘制到画布中.下面看一下效果图: 点击暂停按钮还

Android 自定义录音、播放动画View,让你的录音浪起来

最近公司项目有一个录音的录制和播放动画需求,然后时间是那么紧,那么赶紧开撸. 先看效果图 嗯,然后大致就是这样,按住录音,然后有一个倒计时,最外层一个进度条,还有一个类似模拟声波的动画效果(其实中间的波浪会根据声音的大小浪起来的~) 2 实现思路 然后,我们适当的来分析一下这个录音动画的实现方式.这个肯定是通过自定义控件,咱们来把这个效果完完全全画出来. 大致包括以下几个点: 1. 最外层的进度条,最坑的就是一开始的一个渐变的效果 2. 然后进度条最前方是有一个点的(我肯定选择用图片来实现) 3

Android自定义组件系列【12】——非UI线程绘图SurfaceView

一.SurfaceView的介绍 在前面我们已经会自定义View,使用canvas绘图,但是View的绘图机制存在一些缺陷. 1.View缺乏双缓冲机制. 2.程序必须重绘整个View上显示的图片,比较耗资源. 3.非UI线程无法更新View组件,所以会占用主线程资源,当需要在主线程中处理逻辑的时候会很慢. 在Android中为我们提供了一个SurfaceView来替代View实现绘制图形,一般在游戏绘图方面应用较广,所以如果是比较复杂的绘图建议使用SurfaceView. 二.SurfaceV

【转】android 自定义ViewPager,修改原动画

转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/38026503 记 得第一次见到ViewPager这个控件,瞬间爱不释手,做东西的主界面通通ViewPager,以及图片切换也抛弃了ImageSwitch之类的,开 始让ViewPager来做.时间长了,ViewPager的切换效果觉得枯燥,形成了审美疲劳~~我们需要改变,今天教大家如何改变ViewPager 切换时的效果,实现个性化的图片切换~~ 看一下这样效果的图片切换: 是

Android自定义水波纹动画Layout

Android自定义水波纹动画Layout 源码是双11的时候就写好了,但是我觉得当天发不太好,所以推迟了几天,没想到过了双11女友就变成了前女友,桑心.唉不说了,来看看代码吧. 展示效果 Hi前辈 话不多说,我们先来看看效果: 这一张是<Hi前辈>的搜索预览图,你可以在这里下载这个APP查看更多效果:http://www.wandoujia.com/apps/com.superlity.hiqianbei LSearchView 这是一个MD风格的搜索框,集成了ripple动画以及searc

Android UI- PullToRrefresh自定义下拉刷新动画

Android UI- PullToRrefresh自定义下拉刷新动画 如果觉得本文不错,麻烦投一票,2014年博客之星投票地址:http://vote.blog.csdn.net/blogstar2014/details?username=wwj_748#content 本篇博文要给大家分享的是如何使用修改开源项目PullToRrefresh下拉刷新的动画,来满足我们开发当中特定的需求,我们比较常见的一种下拉刷新样式可能是以下这种: 就是下拉列表的时候两个箭头上下翻转,更改日期文本和刷新状态,

Android自定义组件系列【8】——遮罩文字动画

遮罩文字的动画我们在Flash中非常常见,作为Android的应用开发者你是否也想将这种动画做到你的应用中去呢?这一篇文章我们来看看如何自定义一个ImageView来实现让一张文字图片实现文字的遮罩闪烁效果,下面先来看看效果吧. (录屏幕延时导致效果看起来不是很好) 一.实现原理 实现原理是重写View的onCreate方法,获取图片资源后对每个像素的透明度进行修改来实现,再启动一个线程来循环改变某个区域中的像素透明度. RGBA基础知识:(下面几段介绍文字引用自维基百科) RGBA是代表Red

Android自定义Transition动画

本文已授权微信公众号:鸿洋(hongyangAndroid)在微信公众号平台原创首发. 曾经(或者现在)很多人说起Android和iOS都会拿Android的UI设计来开黑, "你看看人家iOS的设计, 再来看看Android的, 差距怎么就这么大呢?", 对于这种说辞, 可以一句话来总结一下"他们还停留在4.X之前的时代". 自从Android5.0推出Material Design设计规范后, Android在设计上早已甩那个万年不变的iOS好几十条街! 以上纯