Android控件十一:SurfaceView的基本使用和实现简单动画

本文详细介绍了SurfaceView的基本使用,包括SurfaceView与View的区别,SurfaceView的使用模板,并通过实例展示了如何创建绘图板以及利用SurfaceView实现模拟下雪的动画。SurfaceView因其支持双缓冲和子线程绘图,常被用于游戏开发,避免阻塞主线程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

SurfaceView的基本使用

一、引入:
Android提供了View来进行绘图处理,在大部分情况下,View都能满足绘图需求。大家都知道View是通过刷新来重绘视图,
Android系统通过发出VSYNC信号来进行屏幕的重绘,刷新的间隔时间为16ms。如果在16ms内View完成了你所需要执行的所
有操作,那么用户在视觉上,就不会产生卡顿的感觉;反之,如果操作的逻辑过多时,就会掉帧从而使得用户感觉到卡顿。
特别的需要频繁刷新的界面上,如游戏(60FPS以上),就会不断阻塞主线程,从而导致界面卡顿。
而Android提供了SurfaceView来解决这种情况。
二、SurfaceView和View的区别:
1,View主要适用于主动更新的情况下,而SurfaceView主要适用于被动更新,例如频繁地刷新

2,View在主线程中对画面进行刷新,而SurfaceView通常会通过一个子线程来进行页面的刷新

3,View在绘图时没有使用双缓冲机制,而SufaceView在底层实现机制中就已经实现了双缓冲机制
三、SurfaceView的使用模板
SurfaceView使用过程有一套模板代码,大部分的SurfaceView都可以套用

3步走套路:

	1,创建SurfaceView
		创建一个自定义的MySurfaceView,继承之SurfaceView,并实现两个接口SurfaceHolder.CallBack和Runnable
			第一个接口中需要实现的方法分别对应于SurfaceView的生命周期,即创建、改变和销毁。
			第二接口需要实现run方法,用于在子线程中进行draw操作
		
	2,初始化SurfaceView
		在自定义的SurfaceView中,通常需要3个成员变量
			(1)SurfaceHolder mSurfaceHolder 可以控制SurfaceView的大小,格式,可以监控或者改变SurfaceView
			(2)Canvas mCanvas 画布
			(3)boolean isDrawing 子线程标志位,用来控制子线程

	
	3,使用SurfaceView
		利用在2拿到的mSurfaceHolder对象,通过lockCanvas()方法获得当前的Canvas
		注意:
			lockCanvas()获取到的Canvas对象还是上次的Canvas对象,并不是一个新的对象。之前的绘图都将被保留,如果需要擦除,
			可以在绘制之前通过drawColor()方法来进行清屏;
			
			绘制要充分利用SurfaceView的三个回调方法,在surfaceCreate()方法中开启子线程进行绘制。在子线程中,
			使用一个while(isDrawing)循环来不停地绘制。具体的绘制过程,由lockCanvas()方法进行绘制,
			并通过unlockCanvasAndPost(mCanvas)进行画布内容的提交
四:实例:绘图板

layout/activity_main.xml

		<?xml version="1.0" encoding="utf-8"?>
		<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
			xmlns:tools="http://schemas.android.com/tools"
			android:layout_width="match_parent"
			android:layout_height="match_parent"
			android:gravity="center_horizontal"
			tools:context=".MainActivity">

		 <com.example.administrator.SurfaceViewTemplate
			 android:id="@+id/sufaceView"
			 android:layout_width="match_parent"
			 android:layout_height="match_parent" />
			<Button
				android:layout_width="wrap_content"
				android:text="清屏"
				android:id="@+id/clear"
				android:layout_marginBottom="80dp"
				android:layout_centerHorizontal="true"
				android:layout_alignParentBottom="true"
				android:layout_height="wrap_content" />
		</RelativeLayout>

com/example/administrator/SurfaceViewTemplate.java

		package com.example.administrator;

		import android.content.Context;
		import android.graphics.Canvas;
		import android.graphics.Color;
		import android.graphics.Paint;
		import android.graphics.Path;
		import android.util.AttributeSet;
		import android.util.Log;
		import android.view.MotionEvent;
		import android.view.SurfaceHolder;
		import android.view.SurfaceView;

		public class SurfaceViewTemplate extends SurfaceView implements SurfaceHolder.Callback, Runnable {
			private static final String TAG = "SurfaceView";
			//SurfaceHolder
			private SurfaceHolder mHolder;
			//用于绘图的Canvas
			private Canvas mCanvas;
			//子线程标志位
			private boolean mIsDrawing;
			//画笔
			private Paint mPaint;
			//路径
			private Path mPath;

			public SurfaceViewTemplate(Context context) {
				super(context);
				initView();
			}


			public SurfaceViewTemplate(Context context, AttributeSet attrs) {
				super(context, 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值