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

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;
			//用于绘图的Canv
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值