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>



代码运行结果:

相关文章
|
存储 缓存 前端开发
关于Android SurfaceView截屏总结
关于Android SurfaceView截屏总结
1676 0
|
前端开发 开发工具 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。
278 0
|
3月前
|
安全 Android开发 Kotlin
Android经典实战之SurfaceView原理和实践
本文介绍了 `SurfaceView` 这一强大的 UI 组件,尤其适合高性能绘制任务,如视频播放和游戏。文章详细讲解了 `SurfaceView` 的原理、与 `Surface` 类的关系及其实现示例,并强调了使用时需注意的线程安全、生命周期管理和性能优化等问题。
169 8
|
3月前
|
Android开发
Android中SurfaceView的双缓冲机制和普通View叠加问题解决办法
本文介绍了 Android 平台上的 SurfaceView,这是一种高效的图形渲染控件,尤其适用于视频播放、游戏和图形动画等场景。文章详细解释了其双缓冲机制,该机制通过前后缓冲区交换来减少图像闪烁,提升视觉体验。然而,SurfaceView 与普通 View 叠加时可能存在 Z-Order 不一致、同步问题及混合渲染难题。文中提供了使用 TextureView、调整 Z-Order 和创建自定义组合控件等多种解决方案。
147 9
|
5月前
|
Android开发 开发者
Android经典面试题之SurfaceView和TextureView有什么区别?
分享了`SurfaceView`和`TextureView`在Android中的角色。`SurfaceView`适于视频/游戏,独立窗口低延迟,但变换受限;`TextureView`支持复杂变换,视图层级中渲染,适合动画/视频特效,但性能略低。两者在性能、变换、使用和层级上有差异,开发者需按需选择。
89 1
|
Android开发
Android 使用MediaPlayer和SurfaceView播放视频
Android 使用MediaPlayer和SurfaceView播放视频
179 0
|
Android开发
Android 裁剪摄像头预览窗口-SurfaceView
Android 裁剪摄像头预览窗口-SurfaceView
751 0
Android 裁剪摄像头预览窗口-SurfaceView
|
监控 前端开发 Java
Android自定义控件(十)——SurfaceView实战实现天气APP背景移动效果
Android自定义控件(十)——SurfaceView实战实现天气APP背景移动效果
459 0
|
消息中间件 设计模式 监控
Android性能优化 | 大图做帧动画卡?优化帧动画之 SurfaceView滑动窗口式帧复用
继上篇用“SurfaceView逐帧解析&帧复用”优化了帧动画内存性能后,一个更复杂的问题浮出水面:帧动画时间性能。这一篇试着让每帧素材大小 1MB 的帧动画流畅播放的同时不让内存膨胀。
848 0