Android SurfaceView简例

简介: Android SurfaceView简例Android中各的SurfaceView和View有很大的不同,两者应用场景不同。
Android SurfaceView简例


Android中各的SurfaceView和View有很大的不同,两者应用场景不同。大多数View能做的事情SurfaceView也可以,但是SurfaceView效率更高。Android的View绘制过程由Android系统控制,刷新机制开发者比较难以控制。而SurfaceView支持高频、多线程绘制。SurfaceView不存在是否在Android UI主线程绘制问题。通常SurfaceView用于游戏、多媒体(视频)开发。
现在给出一个例子。

写一个自定义的SurfaceView,MySurfaceView.java:

package zhangphil.view;

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;

/**
 * Created by Phil on 2017/9/12.
 */

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

    private void init() {
        SurfaceHolder holder = getHolder();

        final MyTask task = new MyTask(holder);

        holder.addCallback(new SurfaceHolder.Callback() {
            @Override
            public void surfaceCreated(SurfaceHolder surfaceHolder) {
                task.startTask();
            }

            @Override
            public void surfaceChanged(SurfaceHolder surfaceHolder, int format, int width, int height) {

            }

            @Override
            public void surfaceDestroyed(SurfaceHolder surfaceHolder) {
                task.stopTask();
            }
        });
    }

    private class MyTask extends Thread {
        private int width;
        private int height;

        private SurfaceHolder surfaceHolder;
        private Paint paint;
        private float radius = 0;

        public boolean stopTask = false;

        public MyTask(SurfaceHolder surfaceHolder) {
            this.surfaceHolder = surfaceHolder;

            paint = new Paint();
            paint.setAntiAlias(true);
            paint.setColor(Color.RED);
            paint.setStyle(Paint.Style.STROKE);
            paint.setStrokeWidth(10f);
        }

        public void startTask() {
            stopTask = false;
            this.start();
        }

        public void stopTask() {
            stopTask = true;
        }

        @Override
        public void run() {
            while (!stopTask) {
                try {
                    Thread.sleep(1);
                } catch (Exception e) {
                    e.printStackTrace();
                }

                Canvas canvas = surfaceHolder.lockCanvas();

                width = getWidth();
                height = getHeight();

                canvas.drawColor(Color.WHITE);
                canvas.drawCircle(width / 2, height / 2, radius++, paint);

                surfaceHolder.unlockCanvasAndPost(canvas);

                //如果半径大于边界,置0.
                if (radius >= (width / 2)) {
                    radius = 0;
                }
            }
        }
    }
}


测试的activity_main.xml:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@android:color/holo_blue_light"
    tools:context="zhangphil.view.MainActivity">

    <zhangphil.view.MySurfaceView
        android:layout_width="150dp"
        android:layout_height="150dp"
        android:layout_centerInParent="true" />
</RelativeLayout>



代码运行结果:

相关文章
|
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
538 0
Android 裁剪摄像头预览窗口-SurfaceView
|
前端开发 Java Linux
内存泄露,OOM,ANR ,Devik 进程,Framework原理,Activity 生成一个 view,Android 中的动画,SurfaceView和V
内存泄露,OOM,ANR ,Devik 进程,Framework原理,Activity 生成一个 view,Android 中的动画,SurfaceView和V
196 0
|
监控 前端开发 Java
Android自定义控件(十)——SurfaceView实战实现天气APP背景移动效果
Android自定义控件(十)——SurfaceView实战实现天气APP背景移动效果
355 0
|
消息中间件 设计模式 监控
Android性能优化 | 大图做帧动画卡?优化帧动画之 SurfaceView滑动窗口式帧复用
继上篇用“SurfaceView逐帧解析&帧复用”优化了帧动画内存性能后,一个更复杂的问题浮出水面:帧动画时间性能。这一篇试着让每帧素材大小 1MB 的帧动画流畅播放的同时不让内存膨胀。
709 0
|
算法 Java Android开发
Android性能优化 | 帧动画OOM?优化帧动画之SurfaceView逐帧解析
应用 SurfaceView 逐帧绘制帧动画配合 Bitmap 复用。和原生帧动画的内存压力及卡顿说再见!
836 0
|
前端开发 Android开发
【Android 应用开发】View 与 SurfaceView 区别
【Android 应用开发】View 与 SurfaceView 区别
124 0