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