`

SurfaceView编写动画

 
阅读更多

SurfaceView是视图(View)的继承类,这个视图里内嵌了一个专门用于绘制的Surface。你可以控制这个Surface的格式和尺寸。Surfaceview控制这个Surface的绘制位置。
        surface是纵深排序(Z-ordered)的,这表明它总在自己所在窗口的后面。surfaceview提供了一个可见区域,只有在这个可见区域内 的surface部分内容才可见,可见区域外的部分不可见。surface的排版显示受到视图层级关系的影响,它的兄弟视图结点会在顶端显示。这意味者 surface的内容会被它的兄弟视图遮挡,这一特性可以用来放置遮盖物(overlays)(例如,文本和按钮等控件)。注意,如果surface上面 有透明控件,那么它的每次变化都会引起框架重新计算它和顶层控件的透明效果,这会影响性能。
        你可以通过SurfaceHolder接口访问这个surface,getHolder()方法可以得到这个接口。
        surfaceview变得可见时,surface被创建;surfaceview隐藏前,surface被销毁。这样能节省资源。如果你要查看 surface被创建和销毁的时机,可以重载surfaceCreated(SurfaceHolder)和 surfaceDestroyed(SurfaceHolder)。
        surfaceview的核心在于提供了两个线程:UI线程和渲染线程。这里应注意:
        1> 所有SurfaceView和SurfaceHolder.Callback的方法都应该在UI线程里调用,一般来说就是应用程序主线程。渲染线程所要访问的各种变量应该作同步处理。
        2> 由于surface可能被销毁,它只在SurfaceHolder.Callback.surfaceCreated()和 SurfaceHolder.Callback.surfaceDestroyed()之间有效,所以要确保渲染线程访问的是合法有效的surface。

 

接下来呢,说说自己对它的理解
1、定义

可以直接从内存或者DMA等硬件接口取得图像数据,是个非常重要的绘图容器。

它的特性是:可以在主线程之外的线程中向屏幕绘图上。这样可以避免画图任务繁重的时候造成主线程阻塞,从而提高了程序的反应速度。在游戏开发中多用到SurfaceView,游戏中的背景、人物、动画等等尽量在画布canvas中画出。

2、实现

首先继承SurfaceView并实现SurfaceHolder.Callback接口
使用接口的原因:因为使用SurfaceView 有一个原则,所有的绘图工作必须得在Surface 被创建之后才能开始(Surface—表面,这个概念在 图形编程中常常被提到。基本上我们可以把它当作显存的一个映射,写入到Surface 的内容
                      可以被直接复制到显存从而显示出来,这使得显示速度会非常快),而在Surface 被销毁之前必须结束。所以Callback 中的surfaceCreated 和surfaceDestroyed 就成了绘图处理代码的边界。

需要重写的方法

 (1)public void surfaceChanged(SurfaceHolder holder,int format,int width,int height){}

     //在surface的大小发生改变时激发

 (2)public void surfaceCreated(SurfaceHolder holder){}

     //在创建时激发,一般在这里调用画图的线程。

 (3)public void surfaceDestroyed(SurfaceHolder holder) {}

     //销毁时激发,一般在这里将画图的线程停止、释放。

整个过程:继承SurfaceView并实现SurfaceHolder.Callback接口 ----> SurfaceView.getHolder()获得SurfaceHolder对象 ---->SurfaceHolder.addCallback(callback)添加回调函数---->SurfaceHolder.lockCanvas()获得Canvas对象并锁定画布----> Canvas绘画 ---->SurfaceHolder.unlockCanvasAndPost(Canvas canvas)结束锁定画图,并提交改变,将图形显示。


3、SurfaceHolder
这里用到了一个类SurfaceHolder,可以把它当成surface的控制器,用来操纵surface。处理它的Canvas上画的效果和动画,控制表面,大小,像素等。
几个需要注意的方法:
(1)、abstract void addCallback(SurfaceHolder.Callback callback);
// 给SurfaceView当前的持有者一个回调对象。
(2)、abstract Canvas lockCanvas();
// 锁定画布,一般在锁定后就可以通过其返回的画布对象Canvas,在其上面画图等操作了。
(3)、abstract Canvas lockCanvas(Rect dirty);
// 锁定画布的某个区域进行画图等..因为画完图后,会调用下面的unlockCanvasAndPost来改变显示内容。
// 相对部分内存要求比较高的游戏来说,可以不用重画dirty外的其它区域的像素,可以提高速度。
(4)、abstract void unlockCanvasAndPost(Canvas canvas);
// 结束锁定画图,并提交改变。

public class AnimationWelcome extends SurfaceView implements SurfaceHolder.Callback
{
	private final int StartImg[] = { R.drawable.kaiji00013, R.drawable.kaiji00015, R.drawable.kaiji00017, R.drawable.kaiji00019, R.drawable.kaiji00021,
			R.drawable.kaiji00023, R.drawable.kaiji00025, R.drawable.kaiji00027, R.drawable.kaiji00029, R.drawable.kaiji00031,  R.drawable.kaiji00033, 
			R.drawable.kaiji00041, R.drawable.kaiji00043, R.drawable.kaiji00045, R.drawable.kaiji00047, R.drawable.kaiji00049, R.drawable.kaiji00051,
			R.drawable.kaiji00053, R.drawable.kaiji00055, R.drawable.kaiji00057, R.drawable.kaiji00059, R.drawable.kaiji00061, R.drawable.kaiji00063,  
			R.drawable.kaiji00065,
			R.drawable.kaiji00067, R.drawable.kaiji00069, R.drawable.kaiji00071, R.drawable.kaiji00073, R.drawable.kaiji00075, R.drawable.kaiji00077,
			R.drawable.kaiji00079, R.drawable.kaiji00081, R.drawable.kaiji00083 , R.drawable.kaiji00085, R.drawable.kaiji00087, R.drawable.kaiji00089};
	private Bitmap mBp;
	private SurfaceHolder holder;
	private Bitmap mBg;
	private float left;
	private Handler handler;
	
	public AnimationWelcome(Context context,float w,float h,Handler handler)
	{
		super(context);
		this.handler = handler;
		mBp = BitmapFactory.decodeResource(getResources(), StartImg[0]);
		holder = getHolder();
		holder.addCallback(this);
		
		Bitmap b = BitmapFactory.decodeResource(getResources(), R.drawable.start);
		float bw = b.getWidth();
		float bh = b.getHeight();
		float ws = w/bw;
		float hs = h/bh;
		
		Matrix m = new Matrix();
		m.setScale(ws, hs);
		mBg = Bitmap.createBitmap(b, 0, 0, b.getWidth(), b.getHeight(), m, false);
		
		left = w/2 - mBp.getWidth()/2;
	}
	@Override
	public void surfaceCreated(SurfaceHolder h)
	{
		new Thread()
		{
			@Override
			public void run()
			{
					for(int i=1; i<StartImg.length; i++)
					{
						Canvas canvas = holder.lockCanvas(null);
						canvas.drawBitmap(mBg, 0, 0, null);
						canvas.drawBitmap(mBp, left, 0, null);
						holder.unlockCanvasAndPost(canvas);
						mBp.recycle();
						mBp = BitmapFactory.decodeResource(getResources(), StartImg[i]);
					}
					handler.sendEmptyMessage(0X123);
			}
		}.start();
	}
	@Override
	public void surfaceChanged(SurfaceHolder holder, int format, int width, int height)
	{
		
	}
	@Override
	public void surfaceDestroyed(SurfaceHolder holder)
	{
		
	}
}

 

分享到:
评论

相关推荐

    Android使用SurfaceView的迷宫寻路动画

    本人Android小菜鸟一名,刚入行不久,最近自己学习SurfaceView,想做一些小游戏。在这里放上一个自己编写的“迷宫寻路”的Demo,用于记录学习心得,同时分享给大家。当然有很多地方我不知道用法是否合理,希望大家多...

    Android animation surfaceView

    通过SurfaceView实现自定义位移动画效果,可以根据需求,自己编写动画执行的算法。 不喜勿喷啊,毕竟刚毕业的新手,有问题可以在github上提交,共同进步。 CSDN : ...

    ZoomLayout:适用于Android的Kotlin编写的View层次结构,图像,视频流等的2D缩放和平移行为

    ⠀ 需要支持,咨询或有任何其他与业务有关的问题?... 缩放引擎使您可以通过不断更新为所有动画设置动画,只要您向其提供触摸事件,就可以使用基于Matrix的机制,使其变得非常灵活。 ⠀ ⠀ 支持 如果您喜欢

    android开发资料大全

    android程序编写及调试新手入门 大家一起学Android(Windows篇) android入门与提高必看指南 Android入门逆引手册 Android开发指南中文版、创意设计 【Android系统原理与开发要点详解】/底层 应用 框架 Android核心...

    《Android应用开发揭秘》附带光盘代码.

     5.1.2 SurfaceView类开发框架  5.2 Graphics类开发  5.5.1 Paint和Color类介绍  5.2.2 Canvas类介绍  5.2.3 几何图形绘制  5.2.4 字符串绘制  5.2.5 图像绘制  5.2.6 图像旋转  5.2.7 图像缩放  5.2.8 ...

    《Android应用开发揭秘》源码

     5.1.2 SurfaceView类开发框架  5.2 Graphics类开发  5.5.1 Paint和Color类介绍  5.2.2 Canvas类介绍  5.2.3 几何图形绘制  5.2.4 字符串绘制  5.2.5 图像绘制  5.2.6 图像旋转  5.2.7 图像缩放  5.2.8 ...

    Android应用开发揭秘pdf高清版

    5.1.2 SurfaceView类开发框架 5.2 Graphics类开发 5.5.1 Paint和Color类介绍 5.2.2 Canvas类介绍 5.2.3 几何图形绘制 5.2.4 字符串绘制 5.2.5 图像绘制 5.2.6 图像旋转 5.2.7 图像缩放 5.2.8 图像像素操作 5.2.9 ...

    《Android高级编程》

    《Android高级编程》首先简要介绍Android软件栈,接着陈述为手机创建稳定可靠、赏心悦目的应用...11.4.2 使用主题来为应用程序添加皮肤 11.4.3 高级画布绘图 11.4.4 SurfaceView简介 11.4.5 创建交互式控件 11.5 小结

    Android高级编程--源代码

    11.4.4 SurfaceView简介 389 11.4.5 创建交互式控件 392 11.5 小结 397 前言  对移动开发人员来说,现在是一个令人心潮澎湃的时代。手机从来没有像今天这样流行,强大的智能手机产品已经为消费者所普遍接受。...

Global site tag (gtag.js) - Google Analytics