Android SurfaceView的基本用法

原创 2016年05月06日 08:16:37

说明:
第一步:继承SurfaceView 并实现Callback,Runable
第二步:初始化SurfaceHolder mHolder,并添加事件
mHolder = getHolder();
mHolder.addCallback(this);
第三步:在public void surfaceCreated方法里开启线程, 在public void surfaceDestroyed关闭线程
第四步:在public void run()方法里实现draw方法
第五步:如果要添加背景,在draw()方法里实现,在onSizeChanged()方法里可得到改变后的视图宽高及矩形矩阵

具体代码如下:

public class FlyBirdView extends SurfaceView implements Callback, Runnable {
    private SurfaceHolder mHolder;
    // private Thread mThread;
    private ExecutorService mPool;
    private Canvas mCanvas;
    private boolean isRunnging;// 是否运行

    // 二.设置背景
    private Bitmap mBgBitmap;
    //当前View的尺寸
    private int mWidth;
    private int mHeight;
    private RectF mGamePanelRect = new RectF();

    // ----构造函数处理---------------------------------------------
    public FlyBirdView(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }

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

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

    private void init() {
        // -初始化holer-----------------------
        mHolder = getHolder();
        mHolder.addCallback(this);
        setZOrderOnTop(true);
        // 设置画布 背景透明
        mHolder.setFormat(PixelFormat.TRANSLUCENT);

        // --焦点设置----------------------------
        setFocusable(true);
        // 设置触屏
        setFocusableInTouchMode(true);
        // 设置常亮
        setKeepScreenOn(true);

        // --背景设置--------------------------------
        mGamePanelRect = new RectF();
        mBgBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.bgbird);

    }

    @Override
    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
        mWidth = w;
        mHeight = h;
        mGamePanelRect.set(0, 0, w, h);
        super.onSizeChanged(w, h, oldw, oldh);
    }

    @Override
    public void run() {
        while (isRunnging) {
            long start = System.currentTimeMillis();
            draw();
            long end = System.currentTimeMillis();
            if (start - end < 50) {
                SystemClock.sleep(50 - (start - end));
            }
        }
    }

    private void draw() {
        try {
            if (mHolder != null) {
                mCanvas = mHolder.lockCanvas();

                if (mCanvas != null) {
                    //绘制背景
                    drawBg();  
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (mHolder != null && mCanvas != null) {
                mHolder.unlockCanvasAndPost(mCanvas);
            }

        }

    }

    private void drawBg() {
        mCanvas.drawBitmap(mBgBitmap,null, mGamePanelRect, null);
    }

    // ---callback监听------------------------------------------------------
    @Override
    public void surfaceCreated(SurfaceHolder holder) {
        // -线程处理--------------------------
        isRunnging = true;
        mPool = Executors.newFixedThreadPool(5);
        // mThread = new Thread(this);
        // mThread.start();
        mPool.execute(this);
    }

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

    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {
        // 通知关闭线程
        isRunnging = false;
    }

}

———————————————————————
有需求者请加qq:136137465,非诚勿扰
(java 架构师全套教程,共760G, 让你从零到架构师,每月轻松拿3万)
01.高级架构师四十二个阶段高
02.Java高级系统培训架构课程148课时
03.Java高级互联网架构师课程
04.Java互联网架构Netty、Nio、Mina等-视频教程
05.Java高级架构设计2016整理-视频教程
06.架构师基础、高级片
07.Java架构师必修linux运维系列课程
08.Java高级系统培训架构课程116课时
(送:hadoop系列教程,java设计模式与数据结构, Spring Cloud微服务, SpringBoot入门)
——————————————————————–

版权声明:本文为博主原创文章,未经博主允许不得转载。

Android视图SurfaceView的使用

Android视图SurfaceView的使用 绘制圆形进度条。
  • hehe26
  • hehe26
  • 2016年10月31日 12:01
  • 2161

Android中SurfaceView使用详解

1.什么是SurfaceView?     Surface意为表层、表面,顾名思义SurfaceView就是指一个在表层的View对象。为什么说是在表层呢,这是因为它有点特殊跟其他View不一样,其...
  • android_cmos
  • android_cmos
  • 2017年04月03日 12:54
  • 1987

Android--SurfaceView使用详解

SurfaceView是视图(View)的继承类,这个视图里内嵌了一个专门用于绘制的Surface。你可以控制这个Surface的格式和尺寸。Surfaceview控制这个Surface的绘制位置。 ...
  • chaoyu168
  • chaoyu168
  • 2016年05月17日 14:17
  • 6657

Android中SurfaceView的使用详解

通过之前介绍的如何自定义View, 我们知道使用它可以做一些简单的动画效果。它通过不断循环的执行View.onDraw方法,每次执行都对内部显示的图形做一些调整,我们假设 onDraw方法每秒执行...
  • Listening_music
  • Listening_music
  • 2011年10月10日 22:05
  • 40218

Android中SurfaceView的使用

  • 2017年08月07日 15:44
  • 1.4MB
  • 下载

android的surfaceview的用法

参考了文章:Android中SurfaceView的使用详解,  但在该文基础上进行了一定的修改。       说到sufaceview就得讲讲这个类是干什么的。是的,它是用来控制自定义绘图的。起...
  • heikefangxian23
  • heikefangxian23
  • 2015年11月30日 11:36
  • 19523

Android视图SurfaceView的实现原理分析

在Android系统中,有一种特殊的视图,称为SurfaceView,它拥有独立的绘图表面,即它不与其宿主窗口共享同一个绘图表面。由于拥有独立的绘图表面,因此SurfaceView的UI就可以在一个独...
  • Luoshengyang
  • Luoshengyang
  • 2013年03月16日 16:57
  • 201060

Android开发--SurfaceView的基本用法

在Android中可以利用View来绘制一些图形,图片,但当我们开发游戏或视频时,View就不再适用,这时必须使用SurfaceView来代替View。SurfaceView相比View可以实现多线程...
  • smbroe
  • smbroe
  • 2014年12月16日 12:12
  • 2017

Android提高第二篇之SurfaceView的基本使用

Android提高第二篇之SurfaceView的基本使用
  • hellogv
  • hellogv
  • 2010年11月03日 16:05
  • 192813

Android SurfaceView使用dirty rect刷新

如上图,绘制一个背景图,一个不停旋转的小球 /** * author : stone * email : aa86799@163.com * time : 15/12/15 01 08 ...
  • jjwwmlp456
  • jjwwmlp456
  • 2015年12月20日 16:15
  • 1424
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android SurfaceView的基本用法
举报原因:
原因补充:

(最多只允许输入30个字)