文档章节

android学习笔记——SurfaceView 的理解

小白杨啦啦
 小白杨啦啦
发布于 2016/04/30 16:39
字数 809
阅读 72
收藏 1
  1. SurfaceView 的概念和用途

    surfaceview是view的一个子类,可以直接从内存或者DMA等硬件接口中取得图像数据,是一个非常重要的绘图视图。他的特性是:可以在主线程之外的线程中向屏幕绘图,这样可以避免画图任务繁重的时候造成的主线程阻塞,从而提高了程序的反应速度。在游戏开发过程中多用到SurfaceView,游戏中的背景、人物、动画等等在画布canvas中画出。

  2. Surfaceview的实现和方法

1.实现步骤

        a.继承SurfaceView

        b.实现SurfaceHolder.Callback 接口

2.需要重写的方法

//在surface的大小发生改变时激发
public void surfaceChanged(SurfaceHolder holder,int format,int width,int height){}
//在创建时触发,一般在这里调用画图的线程
public void surfaceCreated(SurfaceHolder holder){}
//在销毁时激发,一般在这里将画图的线程停止、释放。
public void surfaceDestroyed(SurfaceHolder holder) {}

   在整个过程中:继承SurfaceView并实现SurfaceHolder.Callback接口---->SurfaceView.getHolder()获得SerfaceHolder对象  ----->然后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);
// 结束锁定画图,并提交改变。

三、通过自定义的SurfaceView组件实现的一个绘图类

package com.example.mydrawingboard;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.PaintFlagsDrawFilter;
import android.graphics.Path;
import android.graphics.Paint.Style;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.view.View.OnTouchListener;


public class MyView extends SurfaceView implements SurfaceHolder.Callback,OnTouchListener
{
	
	Paint paint=new Paint();  //创建一个画笔
	Path path=new Path();     //创建一个保存路径
	
	//由于我们这是自定义控件,所以要使用有两个参数的构造函数
	public MyView(Context context, AttributeSet attrs)
	{
		super(context, attrs);
		// TODO Auto-generated constructor stub
		getHolder().addCallback(this);  //添加一个回调函数
		paint.setTextSize(15);
		paint.setColor(Color.GREEN);
		paint.setStyle(Style.STROKE); //定义为空心
		setOnTouchListener(this);
	}
	//创建一个绘图方法
	public void draw(){
		//创建一个画布并且锁定画布
		Canvas canvas=getHolder().lockCanvas();
		canvas.drawColor(Color.WHITE);
		canvas.drawPath(path, paint);
		//画布抗锯齿
		canvas.setDrawFilter(new PaintFlagsDrawFilter(0, Paint.ANTI_ALIAS_FLAG));
		//在整个绘图结束之后调用解锁画图
		getHolder().unlockCanvasAndPost(canvas);
	}
	
	public void clear(){
		path.reset();
		draw();
	}
	
	@Override
	public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3)
	{
		// TODO Auto-generated method stub
		
	}

	@Override
	public void surfaceCreated(SurfaceHolder arg0)
	{
		//在surface开始的时候就开始执行draw
		draw();
	}

	@Override
	public void surfaceDestroyed(SurfaceHolder arg0)
	{
		// TODO Auto-generated method stub
		
	}
	@Override
	public boolean onTouch(View arg0, MotionEvent arg1)
	{
		// TODO Auto-generated method stub
		switch (arg1.getAction())
		{
		case MotionEvent.ACTION_DOWN:
			path.moveTo(arg1.getX(),arg1.getY());
			draw();
			break;

		case MotionEvent.ACTION_MOVE:
			path.lineTo(arg1.getX(),arg1.getY());
			draw();
			break;
		}
		//如果返回false,则只能执行down操作;
		return true;
	}

}

       

© 著作权归作者所有

小白杨啦啦
粉丝 0
博文 7
码字总数 4746
作品 0
漳州
程序员
私信 提问
Android 学习小结

Android 学习已有一年半有余,先后做过两款游戏、三款应用和搭建一台服务端,也了解过一些Android相关的源码(JDK、SDK和NDK) 后来想学深入点,搞过两款开源项目(LGame 和 AChartEngine),...

长平狐
2013/01/06
243
0
Android:SurfaceView 的使用(附代码模板)

前言 摘自《Android群英传》 Android提供了View进行绘图处理,View可以满足大部分的绘图需求,但在某些时候也会心有余而力不足。我们知道,View通过刷新来重绘视图,Android 系统通过发出VSY...

涤生_Woo
2017/05/23
0
0
【Android游戏开发之六】在SurfaceView中添加组件!!!!并且相互交互数据!!!!

李华明Himi 原创,转载务必在明显处注明: 转载自【黑米GameDev街区】 原文链接: http://www.himigame.com/android-game/306.html 很多童鞋说我的代码运行后,点击home或者back后会程序异常,...

迷途d书童
2012/03/19
453
0
Android-SurfaceView与SurfaceHolder对象

1、Android-SurfaceView与SurfaceHolder对象: http://blog.csdn.net/andyhuabing/article/details/7657069 2、Android学习之 VideoView,SurfaceView: http://blog.csdn.net/abidepan/arti......

当空皓月
2014/12/18
192
0
【Android学习总结】之Activity:深入理解、体验Activity的生命周期

【本博客内的文章是本人的学习笔记总结,如有错误请各位批评指正,谢谢!欢迎加入群285077071讨论】 关于Activity的生命周期的学习,我将从以下几个方面入手来全面认识: 一、什么是生命周期...

kinbos
2018/06/26
0
0

没有更多内容

加载失败,请刷新页面

加载更多

如何制作省市级别上钻下取的在线疫情地图

目前大多数省级尺度的疫情地图,不能精细的表达各个城市的疫情差异和发展事态。纯粹市级维度的地图由于全国市比较多,很难快速查看自己所在省市的疫情分布情况。我们制作一个省市下钻上取的疫...

空间数据可视化
今天
113
0
用Markdown编程之虚转实

没变成机器码之前,撒都是虚的。而要变成机器码必须有长度。有长度后必然是结构划分。之后就是逻辑正确。而逻辑正确可以看成正确的值。 由此,基础行为有:长度的比对转换、结构的解析、值的...

dwcz
今天
80
0
ASP之ADODB.Stream

ASP 其实很强,真的,很强... 但是,也很难,难就难在没有文档啊~~~ 因为 ASP 经常会用到很多服务器对象,本文记录下在 ASP 中的 Stream(流)操作。 ADODB.Stream 未完待续,敬请期待......

AioDiage
今天
71
0
从源码看世界:Springboot整合Mybatis后到底做了什么

在Mybatis一次数据库操作过程的文章中,我展示了使用Mybatis操作数据库的demo,但实际使用时并不会这里写代码,因为一般都会使用springboot了,那现在我们一起来看看Springboot整合Mybatis之...

壞天空_囝仔
今天
46
0
【自用】 Flutter GestureDetector 给控件添加监听事件

Dart GestureDetector( child: Text("xxxx"), onTap: () => _onXxxxCall(index), ) PS:自用的 不做解释 作者:一个吃货帅锅...

Tensor丨思悟
今天
67
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部