首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >自定义View画直线、圆环数据变动View

自定义View画直线、圆环数据变动View

作者头像
对话、
发布于 2022-02-22 06:01:57
发布于 2022-02-22 06:01:57
61500
代码可运行
举报
文章被收录于专栏:Android-XjAndroid-Xj
运行总次数:0
代码可运行

效果

绘制直线

首先我们了解下自定义View

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 /**
     * 测量的方法
     * @param widthMeasureSpec
     * @param heightMeasureSpec
     */
    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    }

    /**
     * 定位的方法
     * @param changed
     * @param left
     * @param top
     * @param right
     * @param bottom
     */
    @Override
    protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
        super.onLayout(changed, left, top, right, bottom);
    }

    /**
     * 绘制View的方法
     * @param canvas
     */
    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
    }

知道了这些下面我们开始绘制直线

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  //画笔
 Paint red=new Paint();
 Paint green=new Paint();
 Paint text=new Paint();
 Paint black=new Paint();

这就是我们的画笔

现在开始给画笔安装笔芯

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  //颜色
        red.setColor(Color.RED);
        //宽度
        red.setStrokeWidth(50);
        red.setAntiAlias(true);
        red.setStyle(Paint.Style.FILL);
        //抗锯齿功能
        green.setAntiAlias(true);
        green.setColor(Color.GREEN);
        green.setStyle(Paint.Style.FILL);
        //Paint.Style.FILL :填充内部
        // Paint.Style.FILL_AND_STROKE :填充内部和描边
        // Paint.Style.STROKE :仅描边
        green.setStrokeWidth(50);

        text.setStrokeWidth(4);
        text.setColor(Color.BLACK);
        text.setTextSize(30);

        //绘制文字的笔
        black.setColor(Color.BLACK);
        black.setStrokeWidth(2);
        black.setStyle(Paint.Style.STROKE);

笔芯装完

开始画!

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  //画出红线
        canvas.drawLine(0,70,redLength,70,red);
        //画出绿线
        canvas.drawLine(0,70,greenLength,70,green);
        //画出文字
        canvas.drawText(end+"",end,25, text);
        canvas.drawText(start+"",0,25, text);

直线画完了

最后我们添加上刷新的方法

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//刷新
        invalidate();

完整代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class DrawLine  extends View {
    //画笔
    Paint red=new Paint();
    Paint green=new Paint();
    Paint text=new Paint();
    Paint black=new Paint();
    /**
     * 整体长度
     */
    private float  redLength=400;
    /**
     * 进度长度
     */
    private  float  greenLength=200;
    /**
     * 起点显示文本
     */
    private  float  start=0;
    /**
     * 进度条显示文本
     */
    private  float end=greenLength;

    public float getRedLength() {
        return redLength;
    }

    public float getStart() {
        return start;
    }

    public void setStart(float start) {
        this.start = start;
    }

    public float getEnd() {
        return end;
    }

    public void setEnd(float end) {
        this.end = end;
    }

    public void setRedLength(float redLength) {
        this.redLength = redLength;
    }

    public float getGreenLength() {
        return greenLength;
    }

    public void setGreenLength(float greenLength) {
        this.greenLength = greenLength;
    }



    public DrawLine(Context context) {
        super(context);
    }

    /**
     * 绘制直线
     * @param canvas
     */
    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        //颜色
        red.setColor(Color.RED);
        //宽度
        red.setStrokeWidth(50);
        red.setAntiAlias(true);
        red.setStyle(Paint.Style.FILL);
        //抗锯齿功能
        green.setAntiAlias(true);
        green.setColor(Color.GREEN);
        green.setStyle(Paint.Style.FILL);
        //Paint.Style.FILL :填充内部
        // Paint.Style.FILL_AND_STROKE :填充内部和描边
        // Paint.Style.STROKE :仅描边
        green.setStrokeWidth(50);

        text.setStrokeWidth(4);
        text.setColor(Color.BLACK);
        text.setTextSize(30);

        //绘制文字的笔
        black.setColor(Color.BLACK);
        black.setStrokeWidth(2);
        black.setStyle(Paint.Style.STROKE);

        //画出红线
        canvas.drawLine(0,70,redLength,70,red);
        //画出绿线
        canvas.drawLine(0,70,greenLength,70,green);
        //画出文字
        canvas.drawText(end+"",end,25, text);
        canvas.drawText(start+"",0,25, text);
        //刷新
        invalidate();
    }
}

代码其实很少,我添加了些get、set方法

绘制圆环

同样的我们要有一支笔

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 mPaint = new Paint();

给笔装上笔芯

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
   mPaint.setStrokeWidth(mCircleWidth); // 设置圆环的宽度
       mPaint.setAntiAlias(true); // 消除锯齿
       mPaint.setStyle(Paint.Style.STROKE); // 设置空心

好了现在我们开始画

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 		RectF oval = new RectF(center - radius, center - radius,
 		 center + radius, center + radius); // 用于定义的圆弧的形状和大小的界限
       ArrayList list=new ArrayList();
       mPaint.setColor(mFirstColor); // 设置圆环的颜色
       canvas.drawCircle(center, center, radius, mPaint); // 画出圆环
       mPaint.setColor(mSecondColor); // 设置圆环的颜色
       canvas.drawArc(oval, -90, mProgress, false, mPaint); // 根据进度画圆弧

       /**
        * oval :指定圆弧的外轮廓矩形区域。
        * startAngle: 圆弧起始角度,单位为度。
        * sweepAngle: 圆弧扫过的角度,顺时针方向,单位为度。
        * useCenter: 如果为True时,在绘制圆弧时将圆心包括在内,通常用来绘制扇形。
        * paint: 绘制圆弧的画板属性,如颜色,是否填充等。
        */

最后同样是刷新

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 invalidate();

完整代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class DrawCircle extends View {
    /**
     * 第一种颜色
     */
    private int mFirstColor=Color.parseColor("#fd0000");
    /**
     * 第二种颜色
     */
    private int mSecondColor=Color.parseColor("#0022ff");
    /**
     * 圆弧的宽度
     */
    private int mCircleWidth=60;
    /**
     * 画笔
     */
    private Paint mPaint;

    public int getmProgress() {
        return mProgress;
    }

    public void setmProgress(int mProgress) {
        this.mProgress = mProgress;
    }


    /**
     * 圆弧的度数
     */
    private int mProgress;

    /**
     *圆环大小
     */
    private int  mwidth=300;

    public int getMwidth() {
        return mwidth;
    }

    public void setMwidth(int mwidth) {
        this.mwidth = mwidth;
    }

    public DrawCircle(Context context) {
        super(context);
        mPaint = new Paint();

    }

    @Override
    protected void onDraw(Canvas canvas) {
        int center = getMwidth()/ 2;
        int radius = center - mCircleWidth / 2;
        mPaint.setStrokeWidth(mCircleWidth); // 设置圆环的宽度
        mPaint.setAntiAlias(true); // 消除锯齿
        mPaint.setStyle(Paint.Style.STROKE); // 设置空心
        RectF oval = new RectF(center - radius, center - radius, center + radius, center + radius); // 用于定义的圆弧的形状和大小的界限
        ArrayList list=new ArrayList();
        mPaint.setColor(mFirstColor); // 设置圆环的颜色
        canvas.drawCircle(center, center, radius, mPaint); // 画出圆环
        mPaint.setColor(mSecondColor); // 设置圆环的颜色
        canvas.drawArc(oval, -90, mProgress, false, mPaint); // 根据进度画圆弧

        /**
         * oval :指定圆弧的外轮廓矩形区域。
         * startAngle: 圆弧起始角度,单位为度。
         * sweepAngle: 圆弧扫过的角度,顺时针方向,单位为度。
         * useCenter: 如果为True时,在绘制圆弧时将圆心包括在内,通常用来绘制扇形。
         * paint: 绘制圆弧的画板属性,如颜色,是否填充等。
         */
        invalidate();
    }
}

如有不足,请指出谢谢!

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
python提取视频第一帧图片
一.实现代码 # -*- coding: utf-8 -*- import cv2 from PIL import Image from io import BytesIO def tryTime(maxTry, timeout=random.random()): """ 重试 :param maxTry:重试次数 :param timeout:睡眠时间 :return: """ def wrap1(func): #functools
小小咸鱼YwY
2020/10/10
1.8K0
视频抽帧实践---openCV和decord视频编解码
剪辑平台中需要处理大量的视频,对视频内容的理解,离不开对视频的降维操作,一般流程是进行抽帧。抽帧操作是很多视频处理的第一步,也是基础数据的一步,大量算法模型离不开帧数据的训练,而高质量的视频,它的fps(每秒帧数)很大,这就造成了处理高清视频时,抽帧速度会成为整个视频处理的瓶颈,本文将对比目前主流的两个视频读取库, openCV和decord进行对比。
后厂村鹅厂
2022/08/11
5.3K0
[1214]基于Python实现视频去重
一款基于Python语言的视频去重复程序,它可以根据视频的特征参数,将重复的视频剔除,以减少视频的存储空间。它的基本原理是:首先利用Python语言对视频文件进行解析,提取视频的特征参数,如帧率、码率等;然后根据特征参数,生成视频的哈希值;最后,将每个视频的哈希值进行对比,如果哈希值相同,则表示视频内容相同,可以将其中一个视频剔除,以节省存储空间。
周小董
2023/10/10
6930
FFmpeg 视频压缩与 Python 调用方法
下载链接:https://ffmpeg.org/download.html#build-linux
为为为什么
2023/02/21
1.3K0
OpenCV 系列教程1 | OpenCV 的 GUI 特性
Matplotlib是一个用于Python的绘图库,它提供了多种绘图方法。在这里,将学习如何使用 Matplotlib 显示图像。可以使用 Matplotlib 放大图片,保存图片等。
机器视觉CV
2019/07/15
3.7K0
OpenCV 系列教程1 | OpenCV 的 GUI 特性
保存rtsp视频流
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
全栈程序员站长
2022/11/02
2.3K0
使用Opencv-python库读取图像、本地视频和摄像头实时数据
Python中使用OpenCV读取图像、本地视频和摄像头数据很简单, 首先需要安装Python,然后安装Opencv-python库
ccf19881030
2024/05/24
1.9K0
使用Opencv-python库读取图像、本地视频和摄像头实时数据
【python-opencv】读取、显示、保存视频
要捕获视频,你需要创建一个 VideoCapture 对象。它的参数可以是设备索引或视频文件的名称。设备索引就是指定哪个摄像头的数字。正常情况下,一个摄像头会被连接(就像我的情况一样)。所以我简单地传0(或-1)。你可以通过传递1来选择第二个相机,以此类推。在此之后,你可以逐帧捕获。但是在最后,不要忘记释放俘虏。
西西嘛呦
2020/08/26
8.2K0
OpenCV学习笔记(Python)
警告: 就算图像的路径是错的, OpenCV 也不会提醒你的,但是当你使用命 令print img时得到的结果是None。
一点儿也不潇洒
2018/08/07
3.8K0
OpenCV学习笔记(Python)
视频跳帧
import cv2 cap=cv2.VideoCapture('C:/Users/xpp/Desktop/Lena.mp4') target='C:/Users/xpp/Desktop/result.mp4' i=0 fps=int(round(cap.get(cv2.CAP_PROP_FPS)))#帧率 width=int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))#分辨率-宽度 height=int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
裴来凡
2022/05/29
1.4K0
视频跳帧
Python生成字符视频
在之前也写过生成字符视频的文章,但是使用的是命令行窗口输出,效果不是很好,而且存在卡顿的情况。于是我打算直接生成一个mp4的字符视频。大致思路和之前一样:Python20行代码实现视频字符化。
ZackSock
2021/05/18
6120
Python生成字符视频
opencv︱图片与视频的读入、显示、写出、放缩与基本绘图函数介绍
opencv中读入、显示、写出图片:cv2.imread(), cv2.imshow(), cv2.imwrite()
悟乙己
2019/05/26
5.9K0
openCV 视频分解及合成
1. 视频分解 import cv2 # ************************** # 分解视频 cap=cv2.VideoCapture('1.mp4')#获取一个视频cap isOpen=cap.isOpened()#判断是否打开 fps=cap.get(cv2.CAP_PROP_FPS)#频率,一秒多少张图片 width=int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))#宽 height=int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT
py3study
2020/01/22
1K0
4步实现树莓派人脸识别、拍照与推送
大部分童鞋的树莓派是不是一直在吃灰呢?一直闲置着,倒不如用它做一个简易监控,如果检测到人脸后,就拍照上传到指定地方,或发消息提醒。
小锋学长生活大爆炸
2021/01/05
1.7K0
4步实现树莓派人脸识别、拍照与推送
有贼出没?看我用python来捉"贼"
最近自己的工位老是丢东西,关键只丢一样东西,而且每天早上来,桌子上都是乱七八糟的。像是遭了贼。
赵云龙龙
2019/11/03
6560
4步实现树莓派人脸识别、拍照与推送、舵机旋转
大部分童鞋的树莓派是不是一直在吃灰呢?一直闲置着,倒不如用它做一个简易监控,如果检测到人脸后,就拍照上传到指定地方,或发消息提醒。
小锋学长生活大爆炸
2022/03/29
7550
4步实现树莓派人脸识别、拍照与推送、舵机旋转
Python基于opencv调用摄像头获取个人图片的实现方法
接触图像领域的应该对于opencv都不会感到陌生,这个应该算是功能十分强劲的一个算法库了,当然了,使用起来也是很方便的,之前使用Windows7的时候出现多该库难以安装成功的情况,现在这个问题就不存在了,需要安装包的话可以去我的资源中下载使用,使用pip安装方式十分地便捷。
matinal
2020/11/27
1.8K0
Python基于opencv调用摄像头获取个人图片的实现方法
虽然现在有可以去码的软件了,可视频是如何自动跟踪打码的?
它的身影随处可见,刷脸支付,信息审核,监控搜索等,除了这些常规操作,还可以对视频里的特定人物进行打码。
松鼠爱吃饼干
2020/09/12
6040
虽然现在有可以去码的软件了,可视频是如何自动跟踪打码的?
虽然现在有可以去码的软件了,可视频是如何自动跟踪打码的?
它的身影随处可见,刷脸支付,信息审核,监控搜索等,除了这些常规操作,还可以对视频里的特定人物进行打码。
松鼠爱吃饼干
2020/09/15
5400
虽然现在有可以去码的软件了,可视频是如何自动跟踪打码的?
基于Aidlux平台实现ONNX Runtime部署-水果分类-摄像头和视频
连接Aidlux后,使用jupyter notebook --allow-root进行Aidlux平台联系的jupyter notebook安装配置环境:
用户10686717
2023/08/07
3690
推荐阅读
相关推荐
python提取视频第一帧图片
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验