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

相關文章
相關標籤/搜索