SurfaceView 的一般绘制View用法(一)

2023-05-16

前段时间写了不少关于自定义View相关的文章 , 最近两个项目同时开工,忙成狗了,这不是不写博客的理由哈,今晚写一篇关于SurfaceView相关的博客 ,

还是和以前一样,今天写一个基本用法 ,下一篇写一篇常用的用法 ,这个是一个简单的绘制动态的View, 以前一直是继承View, 但是有时动态比较多的话 ,比如上一篇吃豆豆的View,因为绘制的频率颇高,用SurfaceView是比较好的 , 不然画面看起来会有点卡顿的现象,

先看一个SurfaceView写的一个progressBar的图


图片是看不出SurfaceView的有点,但是频繁绘制图片的话,比如说绘制股票走势图,心跳图,性能的有事就明显不一样了,直接看代码

今天只是一个简答的实现, 代码比较简单,

1:需要继承SurfaceView , SurfaceHolder.callBack,和线程的Runnable

2 :线程里面写一个死循环,不停的绘制 ,

3 :View创建的时候,开始绘制 ,View销毁的时候,停止绘制,增加一个Boolean类型的控制值
4:绘制的时候,需要锁住holder . 

5:然后就是在该停止的时候加一个判断 ,不要做无用的绘制,消耗内存

看代码,注释比较详细

=================================================================

package com.reeman.demo.viewcustom;

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


public class MySurfaceView extends SurfaceView implements SurfaceHolder.Callback, Runnable {

    SurfaceHolder mHolder;
    Canvas mCanvas;
    private boolean mIsDrawing;

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

    public MySurfaceView(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public MySurfaceView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        initView();
    }

    Paint mPaint;

    private void initView() {
        mHolder = getHolder();
        mHolder.addCallback(this);
        //使用键盘可以获取焦点
        setFocusable(true);
        //触摸可以获取焦点
        setFocusableInTouchMode(true);
        //博爱吃屏幕常亮
        this.setKeepScreenOn(true);
        //paint初始化
        mPaint = new Paint();
        mPaint.setColor(Color.RED);
        mPaint.setAntiAlias(true);
        mPaint.setStyle(Paint.Style.FILL);
    }


    @Override
    public void surfaceCreated(SurfaceHolder holder) {
        mIsDrawing = true;
        new Thread(this).start();
    }

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

    }

    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {
        mIsDrawing = false;
    }

    @Override
    public void run() {
        while (mIsDrawing) {
            draw();
        }
    }

    private void draw() {
        try {
            mCanvas = mHolder.lockCanvas();
            drawSomeThing(mCanvas);
        } catch (Exception e) {
        } finally {
            if (mCanvas != null) {
                mHolder.unlockCanvasAndPost(mCanvas);
            }
        }
    }


    public int current_progress = 50;

    public void setProgress(int progress) {
        this.current_progress = progress;
        invalidate();
        //绘制完成之后,停止绘制。
        if (progress < 100) {
            mIsDrawing = true;
        } else {
            mIsDrawing = false;
        }
    }


    int width = 800;
    int height = 50;

    private void drawSomeThing(Canvas canvas) {
        Log.i("main", "=======" + System.currentTimeMillis());
        int left = getWidth() / 2 - width / 2;
        int top = getHeight() / 2 - height / 2;
        int bottom = getHeight() / 2 + height / 2;
        int right = left + (width * current_progress / 100);
        canvas.drawRect(left, top, right, bottom, mPaint);
    }

}



布局代码=======================

    <com.reeman.demo.viewcustom.MySurfaceView
        android:id="@+id/surface"
        android:layout_width="match_parent"
        android:layout_height="100dp"
        android:layout_centerInParent="true" />

====================================================

package com.reeman.demo.viewcustom;

import android.os.Bundle;
import android.os.Handler;
import android.support.v7.app.AppCompatActivity;


public class MainActivity extends AppCompatActivity {

    private MySurfaceView surface;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        surface = (MySurfaceView) findViewById(R.id.surface);
        inti();
    }

    int i = 0;
    boolean isRun = true;

    private void inti() {
        new Thread() {
            @Override
            public void run() {
                super.run();
                while (isRun) {
                    try {
                        Thread.sleep(50);
                    } catch (Exception e) {

                    }
                    i++;
                    handler.post(new Runnable() {
                        @Override
                        public void run() {
                            surface.setProgress(i);
                            if (i > 99) {
                                isRun = false;
                            }
                        }
                    });

                }
            }
        }.start();
    }


    private Handler handler = new Handler();

}


使用起来和其他的自定义View,看起来没有什么差别 ,唯一的不同就是,开了线程去绘制 , 效率可以大大提升 , 内存消耗 和在主线程绘制,明显有区别 , 

下一章写一个实例,股票走势图,或者和MediaPlayer结合使用的 。

大家晚安 









本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SurfaceView 的一般绘制View用法(一) 的相关文章

  • 如何:点击时将视图置于前面;设置最大/最小捏合手势比例;将屏幕限制设置为平移手势

    注意 我发现的所有东西都太旧了 或者与我实际需要的东西相差太大 而且我几乎尝试了我发现的所有东西 但没有一个能以正确的方式工作 我创建了 3 个 UIView 我可以拖动它们并缩放它们 现在 我需要 将其中一些放在前面 我想为每个添加一个
  • android - 以编程方式将 ID 设置为视图

    我正在添加Buttons以编程方式和数量Buttons取决于一些条件 添加规则相对布局 LayoutParams that Buttons彼此顶部对齐我需要设置它们IDs 2 3年前的所有答案都说设置 ID int 没问题 例如setId
  • 如何自动加载键盘(iOS SDK)?

    非常简单的问题 我得到一个由两个文本字段组成的视图 当视图加载时 我希望键盘自动弹出并聚焦第一个字段 我怎么做 在代码中 在 IB 中 多谢 芥末 In your viewDidAppear 方法调用 yourTextField becom
  • 如何使视图变灰。具体来说是一个EditText?

    大家好 首先感谢您阅读本文 当我失去焦点时 我很难找到更改 EditText 的方法 我希望它在发生这种情况时变灰 但我不希望它被禁用 因为用户可以触摸它并稍后编辑文本 Anyone 问候 You can 为文本设置不同的颜色 http d
  • 将 Button_to 与文本内联:twitter-bootstrap-rails

    我正在渲染带有 2 个按钮和文本的部分 并尝试使用 twitter bootstrap 将这几个按钮与我的文本放在同一行 部分文件 div class well pull right inline Logged in as Welcome
  • React Native - 如何像 iOS 或 Instagram 一样进行模糊视图?

    模糊背景透明度 是否可以在不使用背景图像的情况下模糊视图 我想展示家长内容在上面背景模糊视图 in modal 类似这样的 尝试过反应本机模糊 https github com react native community react na
  • WPF 中的条件列表项模板或数据模板

    这可能是一个显而易见的问题 但我认为很可能有多种方法来实现它 所以这不仅对我有用 希望对其他人也有用 本质上 我正在寻找实现列表视图的最佳方法 该视图可以接受不同类型的对象 然后使用该对象的适当项目 数据模板来呈现它们 例如 我们有一个标准
  • Angular View 绑定未使用简单布尔值更新

    再见 这可能是一个菜鸟问题 但我无法让它发挥作用 我有一个简单的服务 可以切换布尔值 如果布尔值为 true 则活动类应该出现在我的 div 上 如果为 false 则没有类 就这么简单 但是布尔值已更新 但我的视图没有对此做出反应 我是否
  • Android View 背景意外变化

    我正在构建一个具有大量屏幕的应用程序 大多数屏幕的顶部都有一个带有背景颜色的视图 我经常使用 view setBackgroundColor color 更改颜色 奇怪的事情来了 有时在设置一个视图的颜色后 例如 f14fb7 在应用程序中
  • Laravel 视图缓存如何工作?

    根据 Laravel 的文档 https laravel com docs 5 3 blade introduction https laravel com docs 5 3 blade introduction 视图被编译成纯 PHP 代
  • 在页面上显示 # 个视图,而无需始终访问数据库

    越来越多的网站显示某些页面收到的浏览量 以及点击次数 如 dzone com 跟踪视图而不每次加载都访问数据库的最佳实践是什么 我脑子里有很多关于如何做到这一点的潜在想法 但似乎没有一个可行 谢谢 首次使用的用户 我会首先尝试数据库方法 返
  • 如何在couchdb中实现复杂的搜索过滤器?我应该避免暂时的观点吗?

    我想在网格中管理我的用户实体 我想对它们进行排序 并且我想为每一列都有一个搜索过滤器 我的动态生成的临时视图工作正常 function doc if doc type User Dynamic filters WHERE firstName
  • 将照片上传到 MVC 4 应用程序

    我正在尝试创建一个控制器来在我的 MVC4 应用程序中上传照片 但我不断收到此错误 输入不是有效的 Base 64 字符串 因为它包含非 Base 64 字符 两个以上的填充字符或填充字符中包含非空白字符 照片控制器 cs public c
  • Android - setRequestedOrientation - 活动和视图生命周期

    我在使用 JNI 的本机代码方面遇到了一些问题 我怀疑这可能是由于调用setRequestedOrientation 当我打电话时活动会发生什么setRequestedOrientation 是刚刚重新启动还是完全被破坏了 另外 视图会发生
  • Codeigniter - 返回视图作为数据不起作用[重复]

    这个问题在这里已经有答案了 我在 CodeIgniter 2 0 2 中将视图作为数据返回时遇到问题 我不确定此版本的 CI 中是否提供此功能 这可能是问题所在 但我希望不是这样 因为目前无法选择升级 我们运行两个两个网站 其中一个我们使用
  • 有时 listView.getChildAt(int index) 返回 NULL (Android)

    我有一个带有自定义适配器的 listView 当发生某些事情 在子视图中单击 时 我会进行一些计算并修改子视图 如果满足某些条件 则应修改与单击的子项无关的其他子项 这有时有效 但有时失败 DDMS 说视图为空 让我向您展示代码 if in
  • 色带仅适用于 Android 4.0+

    在运行 Android 4 0 或 4 0 3 的模拟器上 我看到可怕的色带 而且似乎无法摆脱 在我测试过的所有其他 Android 版本上 渐变看起来都很平滑 我有一个配置为 RGBX 8888 的 SurfaceView 并且渲染的画布
  • 根据文档,Django 1.8spectdb 命令看不到 PostgreSQL 视图

    我有一个带有 PostgreSQL 数据库的 Django 1 8 应用程序 我从命令行运行 django inspectdb 来检查模型的视图 但视图不会显示在模型输出中 这是版本输出 17 36 python well manage p
  • 无法使clipChildren = false属性起作用[重复]

    这个问题在这里已经有答案了 我有一个黄色的RelativeLayout含有较高的红色LinearLayout 为了使整体LinearLayout可见 我设置android clipChildren false 但这并没有按预期工作
  • Grails:如何更改默认视图位置?

    我有控制器AdminTagController 默认情况下视图将位于 adminTag文件夹 是否可以将此控制器的默认文件夹更改为 admin view 我可以为每个方法指定视图 但这并不酷 谢谢 可以用以下命令更改它拦截器后 http g

随机推荐

  • SQL优化面试专题

    介绍 xff1a 无论您是创建Web应用程序的开发人员 xff0c 还是参与Web测试的DBA或测试人员 xff0c SQL方面的技巧在数据库编程和数据库验证中都非常重要 因此 xff0c 我们整理了QL性能优化方面的面试问题 SQL性能优
  • Docker容器:将带UI的程序直接转为Web应用,so easy

    摘要 xff1a 使用Docker容器 xff0c 将带UI的程序 xff0c 直接转换为Web应用 很方便 xff0c 跟大家分享一下 本文分享自华为云社区 使用Docker容器 xff0c 将带UI的程序 xff0c 直接转为Web应用
  • 38道多线程核心面试题(附答案)

    前言 今天给大家分享的是比较全面的多线程面试题 xff0c 大家在面试的过程中不免会被问到很多专业性的问题 xff0c 有的时候回答的并不是那么全面和精细 xff0c 这仅仅代表个人观点 1 如何预防死锁 xff1f 1 首先需要将死锁发生
  • Java程序员,最常用的20%技术有哪些?

    1 基本的数据结构和算法真的非常重要 xff1a 不管你做过多少项目或者是熟悉多少框架和工具 xff0c 面试和考察一个人还是大部分停留在基本功上 所以 xff0c 在每天工作开发之余 xff0c 应保证一定的时间段不断去打磨自己的基本功
  • Linux 程序编译过程详解

    大家肯定都知道计算机程序设计语言通常分为机器语言 汇编语言和高级语言三类 高级语言需要通过翻译成机器语言才能执行 xff0c 而翻译的方式分为两种 xff0c 一种是编译型 xff0c 另一种是解释型 xff0c 因此我们基本上将高级语言分
  • 关于485总线 A、B端上拉下拉电阻选择

    问 xff1a about rs485 用电阻上拉 B用电阻下拉 A B间用电阻连接 xff0c 这些电阻参数大致多少 xff1f 我们公司的设计是 TTL输入都用光偶隔离 输出加上拉和下拉 xff0c 中间加TVS和2个电阻串联 xff0
  • JAVA集合框架(一)-ARRAYLIST

    1 ArrayList的特点 存放的元素有序元素不唯一 可以重复 随机访问快插入删除元素慢非线程安全 2 底层实现 底层初始化 xff0c 使用一个Object类型的空对象数组 xff0c 初始长度为0 源码 Object类型对象数组引用
  • Java如何将两个数组合并为一个数组呢?

    数组 xff1a 数组 xff08 Array xff09 是有序的元素序列 1 若将有限个类型相同的变量的集合命名 xff0c 那么这个名称为数组名 组成数组的各个变量称为数组的分量 xff0c 也称为数组的元素 xff0c 有时也称为下
  • pca9548及vsc9548的设备树简单挂载

    简述 pca9548及vsc9548是iic拓展器件 xff0c 主要是防止iic器件地址冲突 通过写其0x0寄存器可切换0 7路iic 设备树挂载 这里用到了vsc9548 xff0c 且在第7路上挂在了eeprom器件 i2c 64 f
  • 类的作用域

    类的作用域简称类域 xff0c 它是指在类的定义中由一对花括号所括起来的部分 每一个类都具有该类的类域 xff0c 该类的成员局部于该类所属的类域中 在类的定义中可知 xff0c 类域中可以定义变量 xff0c 也可以定义函数 从这一点上看
  • 常见问题(持续更新)

    近期整理的初级开发遇到的问题 xff0c 希望对大家有用 1 Unsatisfied dependency expressed through field 39 baseMapper 39 于是在pom xml中搜索mybatis关键字 x
  • orb-slam中的orb特征

    1 ORB特征简介 ORB是Oriented FAST and Rotated BRIEF xff08 oFAST and rBRIEF xff09 的简称 xff0c ORB的名字已经说明了其来源 xff0c 其实ORB特征是采用FAST
  • 计算机组成原理 第二篇:总线 1.总线原理和意义

    总线是什么 总线是连接多个部件的信息传输线 是各部件共享的传输介质 总线可以传输的原理 总线实际上是由许多传输线或通路组成 每条线上保持的电平高低即是所传输的信号 每条线可一位一位地传输二进制代码 一串二进制代码可以在一段时间内逐一传输完成
  • 主流深度学习算法简介

    深度学习算法简介 1 深度学习主流算法包括 1 1 CNN 卷积神经网络 卷积神经网络 xff08 CNN xff09 是最常见的深度学习方法之 一 自20 世纪80 年代后期以来 xff0c CNN 已应用于视觉识别与分类任务 xff0c
  • 常见外贸英文术语(下)

    很多从事外贸行业的人都会用Skype IntBell AntTone等网络电话和客户沟通 xff0c 但是有时候会因为一些外贸行业的专业英文术语闹出笑话 今天就让我们来总结一些外贸常见英文术语 xff0c 让你和客户沟通更加顺畅 xff01
  • Phpstorm2018 使用破解补丁永久激活

    1 安装phpstorm xff0c 安装包请自行官网下载 http www jetbrains com phpstorm download 2 下载JetbrainsCrack jar文件 xff0c 存放至你的phpstorm执行文件同
  • va_start 与 va_end用法

    1 包含头文件 include lt stdarg h gt 2 使用方法 参考 http www cnblogs com hanyonglu archive 2011 05 07 2039916 html include lt stdio
  • jetson-sd卡制作(批量烧写)

    jetson系列如果使用sd卡开发 xff0c 开发完成后可以不用重新制作根文件系统 拷贝目前的SD卡即可实现批量烧写 一 开发好的SD卡制作img文件 1 将sd卡插到PC端 xff0c 查看sd卡设备 eg dev sdd fdisk
  • 结构体知识点

    结构体的结构如下 xff1a span class token comment 关键字struct是数据类型说明符 xff0c 指出下面说明的是结构体类型 span span class token keyword struct span
  • SurfaceView 的一般绘制View用法(一)

    前段时间写了不少关于自定义View相关的文章 xff0c 最近两个项目同时开工 xff0c 忙成狗了 xff0c 这不是不写博客的理由哈 xff0c 今晚写一篇关于SurfaceView相关的博客 xff0c 还是和以前一样 xff0c 今