SurfaceView适用于被动更新,通过子线程来进行页面的刷新,使用双缓冲机制。
一般实现SurfaceHolder.Callback 和 Runnable接口。
当SurfaceHolder被销毁的时候回调
surfaceCreated(SurfaceHolder holder)
开始绘制
当SurfaceHolder的尺寸发生变化的时候被回调。
surfaceChange(SurfaceHolder holder, int format, int width, int height)
当SurfaceHolder被创建的时候回调
surfaceDestroyed(SurfaceHolder holder)
一般用于释放资源,或者结束绘图
下面画了一个用SurfaceView画了一个正弦波。
package com.example.administrator.youku_animi;
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.view.SurfaceHolder;
import android.view.SurfaceView;
/**
* Created by Administrator on 2017/8/3 0003.
*/
public class MySurfaceView extends SurfaceView implements SurfaceHolder.Callback, Runnable
{
private SurfaceHolder mHolder;
private Canvas mCanvas;
private boolean mIsDrawing;
private Paint mPaint;
private Path path;
int x = 0, y;
public MySurfaceView(Context context){
super(context);
initView();
}
public MySurfaceView(Context context, AttributeSet attrs)
{
super(context, attrs);
initView();
}
/*
*@author
*
*
*初始化函数
*create at 2017/8/3 0003 下午 23:11
*/
private void initView()
{
mHolder = getHolder();
mHolder.addCallback(this);
setFocusable(true);
setFocusableInTouchMode(true);
this.setKeepScreenOn(true);
path = new Path();
path.setLastPoint(0, 400);
mPaint = new Paint();
mPaint.setColor(Color.BLACK);
mPaint.setStrokeWidth(2);
mPaint.setStyle(Paint.Style.STROKE);
}
/*
*@author
*
*
*
*create at 2017/8/3 0003 下午 23:10
*/
@Override
public void surfaceCreated(SurfaceHolder holder)
{
mIsDrawing = true;
new Thread(this).start();
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height)
{
}
@Override
public void surfaceDestroyed(SurfaceHolder holder)
{
mIsDrawing = false;
}
/*
*@author
*
*
*画正选波
*create at 2017/8/3 0003 下午 23:09
*/
@Override
public void run()
{
while (mIsDrawing)
{
draw();
x += 1;
y = (int) (100 * Math.sin(x * 2 * Math.PI / 180) + 400);
path.lineTo(x, y);
}
}
private void draw()
{
try
{
//锁定画布
mCanvas = mHolder.lockCanvas();
//draw something
//给画布设置颜色为白色
mCanvas.drawColor(Color.WHITE);
//画路径
mCanvas.drawPath(path, mPaint);
}
catch (Exception e)
{
}
finally {
if (mCanvas != null)
{
//解锁画布
mHolder.unlockCanvasAndPost(mCanvas);
}
}
}
}