Android之SurfaceView(六)

关于surfaceView相关知识:java

View和SurfaceView主要区别:android

  1. View只能在UI线程中刷新,而SurfaceView能够在子线程中刷新ide

  2. SurfaceView能够控制刷新频率布局

SurfaceView几个重要的方法this

  1. 继承SurfaceView 后调用getHolder()方法能够获取到mSurfaceHolder对象这个对于能够控制SurfaceView的绘制spa

  2. 实现这个SurfaceHolder.Callback接口而且mSurfaceHolder.addCallback(this)添加回调能够感知到SurfaceView的生命周期线程

  3. 绘制的时候mCanvas.drawColor(Color.BLACK);这个方法很重要,这个方法是清理上一次绘制的东西,这个方法必定要调用才能看到效果
    code

实现效果 以下:
orm


第一步:新建XRSurfaceView继承SurfaceViewxml

package com.rong.activity;

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

/**
 * 自定义SurfaceView
 * 
 * @author 徐荣
 *
 */
public class XRSurfaceView extends SurfaceView implements SurfaceHolder.Callback, Runnable {
	// SurfaceView的宽
	int surfaceWidth;
	// SurfaceView的高
	int surfaceHeight;
	// SurfaceHolder对象
	SurfaceHolder mSurfaceHolder;
	// 开关线程的标志位
	boolean isRunning = true;
	// 画笔
	Paint mPaint;
	// 圆的半径
	float radius = 0;
	// 圆是变大仍是缩小的状态
	boolean status = true;
	// 圆变化的速度
	int mSpeed = 3;

	public XRSurfaceView(Context context, AttributeSet attrs) {
		super(context, attrs);
		initView();
	}

	private void initView() {
		// 获取mSurfaceHolder
		mSurfaceHolder = getHolder();
		// 添加回调
		mSurfaceHolder.addCallback(this);
	}

	@Override
	public void surfaceCreated(SurfaceHolder holder) {

		isRunning = true;
		// 初始化画笔
		mPaint = new Paint();
		mPaint.setAntiAlias(true);
		mPaint.setColor(Color.BLUE);
		// 开启绘制线程
		new Thread(this).start();

	}

	@Override
	public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
		// 获取surface的宽
		surfaceWidth = width;
		// 获取surface的高
		surfaceHeight = height;
	}

	@Override
	public void surfaceDestroyed(SurfaceHolder holder) {
		// 关闭绘制线程
		isRunning = false;
	}

	@Override
	public void run() {
		Canvas mCanvas = null;
		while (isRunning) {
			try {
				// 锁定canva进行绘制
				mCanvas = mSurfaceHolder.lockCanvas(null);
				// 这个方法很重要,至关于重绘(必定要调用否则看不到效果)
				mCanvas.drawColor(Color.BLACK);
				// 画圆
				mCanvas.drawCircle((surfaceWidth / 2), (surfaceHeight / 2), radius, mPaint);
				// 更改半径变量
				if (status) {
					radius = radius + mSpeed;
					if (radius > 200) {
						status = false;
					}
				} else {
					radius = radius - mSpeed;
					if (radius < 0) {
						status = true;
					}
				}
			} catch (Exception e) {
				e.printStackTrace();
			} finally {
				// 解除画布锁
				mSurfaceHolder.unlockCanvasAndPost(mCanvas);
			}
		}
	}
}

第二步:新建布局文件activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#ffffff"
    android:orientation="vertical" >

    <com.rong.activity.XRSurfaceView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_centerInParent="true"
        android:orientation="vertical" />

</RelativeLayout>

Run

相关文章
相关标签/搜索