美文网首页
SurfaceView

SurfaceView

作者: 一路摇到顶 | 来源:发表于2016-10-07 22:25 被阅读153次

认识

SurfaceView 子线程中绘制完成,提交到主线程。在家里把作业写好,回到学校交给老师。

使用

  1. 集成SurfaceView 实现SurfaceHolder.Callback接口
  2. 获取到SurfaceHolder,这个Surface的控制器。
  3. 新建绘图线程。通过surfaceHolder.lockCanvas();拿到canvas.
  4. holder.unlockCanvasAndPost(canvas); 提交画板。
package com.x603.dbox.surfaceviewdemo;

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

/**
 * surface的简单使用。
 * Created by azezer0 on 16/10/7.
 */
public class CircleSurfaceView extends SurfaceView implements SurfaceHolder.Callback {
    public static final String Tag = CircleSurfaceView.class.getSimpleName();

    private SurfaceHolder mSurfaceHolder;
    private DrawThread mDrawThread;

    public CircleSurfaceView(Context context) {
        this(context, null);
    }

    public CircleSurfaceView(Context context, AttributeSet attrs) {
        super(context, attrs);
        mSurfaceHolder = getHolder();
        mSurfaceHolder.addCallback(this);
        mDrawThread = new DrawThread(mSurfaceHolder);
    }

    @Override
    public void surfaceCreated(SurfaceHolder holder) { //surface创建时候,就在这里启动画画
        mDrawThread.isRun = true;
        mDrawThread.start();
    }

    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {  //surface大小发生变化时

    }

    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {//surface结束画画,
        mDrawThread.isRun = false;
    }

    private class DrawThread extends Thread {
        public boolean isRun = true;
        private SurfaceHolder holder;

        public DrawThread(SurfaceHolder mSurfaceHolder) {
            holder = mSurfaceHolder;
        }

        @Override
        public void run() {
            int count = 0;
            while (isRun) {
                Canvas canvas = null;
                try {
                    synchronized (holder) {
                        canvas = holder.lockCanvas();
                        canvas.drawColor(Color.BLUE);
                        Paint p = new Paint();
                        p.setColor(Color.WHITE);
                        Rect r = new Rect(20, 20, 400, 500);
                        canvas.drawRect(r, p);
                        p.setTextSize(30);
                        p.setColor(Color.RED);
                        canvas.drawText("这是第" + count++ + "秒", 20, 300, p);
                        Thread.sleep(1000);
                    }
                } catch (Exception e) {

                } finally {
                    if (canvas != null) {
                        holder.unlockCanvasAndPost(canvas);
                    }
                }
            }
        }
    }
}

实例

  1. 几个圆转圈圈
ezgif.com-gif-maker.gif

exception

  • IllegalThreadStateException: Thread already started
    不管Thread.isAlive() 返回true or false,都会报这个异常。在surfaceCreated(),新建线程,并启动。在surfaceDestroyed() 结束掉。

源码解析

github

相关文章

网友评论

      本文标题:SurfaceView

      本文链接:https://www.haomeiwen.com/subject/jfayyttx.html