Android -- SurfaceView绘制

简介:

SurfaceView                                                                          

SurfaceView是View的一个特殊子类,它的目的是另外提供一个线程进行绘制操作。

  • 步骤

1.用SurfaceView进行绘制,首先要创建一个类,继承 SurfaceView,同时这个类应该实现SurfaceHolder.Callback接口

  这个接口中的三个回调函数(surfaceChanged(SurfaceHolder holder, int format, int width, int height),surfaceCreated(SurfaceHolder holder),surfaceDestroyed(SurfaceHolder holder))分别对应Surface何时更改、创建和销毁。

2.对Surface对象的操作是通过SurfaceHolder来进行的。所以,在你的SurfaceView类初始化的时候,你需要调用 getHolder()来获得SurfaceHolder对象,然后用addCallback()加上回调接口(因为你的类实现了相应的接口,所以此处传入this即可)。

3.在你的SurfaceView类中应该建立一个线程类,处理绘制操作。为此,要向这个线程类传递上面获得的SurfaceHolder对象。

4.绘制:在线程类的run()方法中进行绘制操作,通过lockCanvas()方法获得Canvas对象,然后就可以用这个对象进行绘制,绘制完成后调用unlockCanvasAndPost(),传入Canvas对象,这时Surface将会按Canvas进行绘制。

  注意:每次利用SurfaceHolder获得画布时,前一次的内容将会保留。

Code                                                                                   

复制代码
public class MySurfaceView extends SurfaceView implements
        SurfaceHolder.Callback
{

    private DrawThread mThread = null;

    public MySurfaceView(Context context, AttributeSet attrs, int defStyle)
    {
        super(context, attrs, defStyle);
        init();
    }

    public MySurfaceView(Context context, AttributeSet attrs)
    {
        super(context, attrs);
        init();
    }

    public MySurfaceView(Context context)
    {
        super(context);
        init();
    }

    private void init()
    {
        Log.d(AppConstants.LOG_TAG, "init");

        SurfaceHolder holder = getHolder();
        holder.addCallback(this);

        mThread = new DrawThread(holder);

    }

    @Override
    protected void onSizeChanged(int w, int h, int oldw, int oldh)
    {
        Log.d(AppConstants.LOG_TAG, "onSizeChanged");
        super.onSizeChanged(w, h, oldw, oldh);

    }

    @Override
    public void surfaceCreated(SurfaceHolder holder)
    {
        Log.d(AppConstants.LOG_TAG, "surfaceCreated");
        mThread.setRun(true);
        mThread.start();

    }

    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width,
            int height)
    {
        Log.d(AppConstants.LOG_TAG, "surfaceChanged");
    }

    @Override
    public void surfaceDestroyed(SurfaceHolder holder)
    {
        Log.d(AppConstants.LOG_TAG, "surfaceDestroyed");
        mThread.setRun(false);

    }

    /**
     * 绘制线程类
     * 
     */
    public class DrawThread extends Thread
    {
        private SurfaceHolder mHolder = null;
        private boolean isRun = false;

        public DrawThread(SurfaceHolder holder)
        {
            Log.d(AppConstants.LOG_TAG, "DrawThread Constructor");
            mHolder = holder;

        }

        public void setRun(boolean isRun)
        {
            Log.d(AppConstants.LOG_TAG, "DrawThread setRun: " + isRun);
            this.isRun = isRun;
        }

        @Override
        public void run()
        {
            Log.d(AppConstants.LOG_TAG, "DrawThread run");
            int count = 0;

            while (isRun)
            {
                Canvas canvas = null;
                synchronized (mHolder)
                {
                    try
                    {
                        Log.d(AppConstants.LOG_TAG, "Drawing-------------");
                        canvas = mHolder.lockCanvas();
                        canvas.drawColor(Color.WHITE);
                        Paint p = new Paint();
                        p.setColor(Color.BLACK);

                        Rect r = new Rect(100, 50, 300, 250);
                        canvas.drawRect(r, p);
                        canvas.drawText("这是第" + (count++) + "秒", 100, 310, p);

                        Thread.sleep(1000);// 睡眠时间为1秒

                    }
                    catch (Exception e)
                    {
                        Log.d(AppConstants.LOG_TAG, "throw Exception in run");
                        e.printStackTrace();

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

                }

            }
        }

    }

}
复制代码

我是天王盖地虎的分割线           




本文转自我爱物联网博客园博客,原文链接:http://www.cnblogs.com/yydcdut/p/3952551.html,如需转载请自行联系原作者

相关文章
|
7月前
|
前端开发 开发工具 Android开发
Android播放器之SurfaceView与GLSurfaceView
Surface的官方介绍:Handle onto a raw buffer that is being managed by the screen compositor,Surface是一个raw buffer的句柄,通过它在raw buffer上进行绘制,可以通过Surface获得一个Canvas。
119 0
|
存储 缓存 前端开发
关于Android SurfaceView截屏总结
关于Android SurfaceView截屏总结
1446 0
|
8月前
|
Android开发
Android 使用MediaPlayer和SurfaceView播放视频
Android 使用MediaPlayer和SurfaceView播放视频
68 0
|
9月前
|
前端开发 安全 Android开发
|
Android开发
Android 裁剪摄像头预览窗口-SurfaceView
Android 裁剪摄像头预览窗口-SurfaceView
541 0
Android 裁剪摄像头预览窗口-SurfaceView
|
Android开发
Android绘制竖直虚线完美解决方案—自定义View
开发中我们经常会遇到绘制虚线的需求,一般我们使用一个drawable文件即可实现,下面我会先列举常规drawable文件的实现方式。
|
前端开发 Java Linux
内存泄露,OOM,ANR ,Devik 进程,Framework原理,Activity 生成一个 view,Android 中的动画,SurfaceView和V
内存泄露,OOM,ANR ,Devik 进程,Framework原理,Activity 生成一个 view,Android 中的动画,SurfaceView和V
197 0
|
监控 前端开发 Java
Android自定义控件(十)——SurfaceView实战实现天气APP背景移动效果
Android自定义控件(十)——SurfaceView实战实现天气APP背景移动效果
357 0
|
前端开发 Android开发
Android进阶之绘制-自定义View完全掌握(四)
Android进阶之绘制-自定义View完全掌握(四)
87 0
Android进阶之绘制-自定义View完全掌握(四)
|
编解码 Android开发
Android进阶之绘制-自定义View完全掌握(三)
Android进阶之绘制-自定义View完全掌握(三)
134 0
Android进阶之绘制-自定义View完全掌握(三)