当前位置: 首页 > news >正文

自实现三色空缺圆环

项目需要实现一个三色圆环,下面UI 效果:(部分细节已隐藏)

下图是实现之后的布局预览效果:

具体的布局代码

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="140dp"
    android:background="@color/white"
    android:gravity="center"
    android:orientation="horizontal">
    <CustormChartView
        android:id="@+id/ccv_percent"
        android:layout_width="120dp"
        android:layout_height="120dp" />
</LinearLayout>
复制代码

具体实现代码

public class CustormChartView extends View {
    private final float PROGRESS_DEFAULT = 330;
    private Paint paint;
    /**
     * 第一个环的进度百分比
     */
    protected float wProgress;
    /**
     * 第二个环的进度百分比
     */
    protected float dProgress;
    /**
     * 第三个环的进度百分比
     */
    protected float lProgress;


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

    public CustormChartView(Context context, @Nullable AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public CustormChartView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        this.wProgress = 1f / 3f * PROGRESS_DEFAULT;
        this.dProgress = wProgress;
        this.lProgress = wProgress;
        paint = new Paint();
        paint.setStyle(Paint.Style.STROKE);
        paint.setAntiAlias(true);
        paint.setStrokeCap(Paint.Cap.ROUND);
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);

        int screen = Math.min(getScreen().widthPixels, getScreen().heightPixels);
        int width = screen * 2 / 3;
        int height = width;
        int widthMode = MeasureSpec.getMode(widthMeasureSpec);
        int heightMode = MeasureSpec.getMode(heightMeasureSpec);
        if (widthMode == MeasureSpec.EXACTLY) {
            width = MeasureSpec.getSize(widthMeasureSpec);
        }
        if (heightMode == MeasureSpec.EXACTLY) {
            height = MeasureSpec.getSize(heightMeasureSpec);
        }

        setMeasuredDimension(width, height);

    }

    @SuppressLint("DrawAllocation")
    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        int circularWidth = 20;
        RectF rectF = new RectF(getPaddingLeft() + circularWidth / 2,
                getPaddingTop() + circularWidth / 2,
                getWidth() - getPaddingRight() - circularWidth / 2,
                getWidth() - getPaddingBottom() - circularWidth / 2);
        paint.setStrokeWidth(circularWidth);
        paint.setColor(Color.RED);
        canvas.drawArc(rectF, 30, wProgress, false, paint);
        paint.setColor(Color.BLUE);
        canvas.drawArc(rectF, 30 + wProgress +10 , dProgress, false, paint);
        paint.setColor(Color.GREEN);
        canvas.drawArc(rectF, 30 + wProgress + dProgress +20 , lProgress, false, paint);
    }

    private DisplayMetrics getScreen() {
        Resources resources = getResources();
        DisplayMetrics dm = resources.getDisplayMetrics();
        return dm;

    }

    @Keep
    public void setProgress(float wProgress, float dProgress, float lProgress) {
        this.wProgress = PROGRESS_DEFAULT * wProgress /100;
        this.dProgress = PROGRESS_DEFAULT * dProgress /100;
        this.lProgress = PROGRESS_DEFAULT * lProgress /100;
        invalidate();
    }
复制代码

最终运行效果和UI设计效果一致。

相关文章:

  • Search in Rotated Sorted Array II
  • IT题库7-线程加锁
  • sysbench使用
  • CSS.2
  • 程序架构探讨—002 应用服务器集群的伸缩性之负载均衡
  • Web安全系列(二):XSS 攻击进阶(初探 XSS Payload)
  • 3点建议:如何在面试中回答“你最大的成就”
  • 简单的node爬虫练手,循环中的异步转同步
  • 活跃银行×××之二:创新的恶意软件Osiris
  • “数据中心运维管理VIP学习群”问题汇总(一)
  • Oracle 数据文件及其管理
  • Oh!MongoDB日志从文本穿越成了图片?咋整!
  • AtCoder Grant Contest 10.F 博弈
  • Centos7安装Openresty和orange
  • 在ubuntu18实践
  • [ JavaScript ] 数据结构与算法 —— 链表
  • canvas实际项目操作,包含:线条,圆形,扇形,图片绘制,图片圆角遮罩,矩形,弧形文字...
  • codis proxy处理流程
  • iOS 系统授权开发
  • Java比较器对数组,集合排序
  • jquery cookie
  • node.js
  • oldjun 检测网站的经验
  • PHP 使用 Swoole - TaskWorker 实现异步操作 Mysql
  • Python学习之路16-使用API
  • REST架构的思考
  • Spark in action on Kubernetes - Playground搭建与架构浅析
  • V4L2视频输入框架概述
  • 简单易用的leetcode开发测试工具(npm)
  • 精益 React 学习指南 (Lean React)- 1.5 React 与 DOM
  • 聊聊hikari连接池的leakDetectionThreshold
  • 前端面试总结(at, md)
  • 深入浅出webpack学习(1)--核心概念
  • 使用 Xcode 的 Target 区分开发和生产环境
  • 提升用户体验的利器——使用Vue-Occupy实现占位效果
  • 异步
  • 用Python写一份独特的元宵节祝福
  • - 转 Ext2.0 form使用实例
  • [Shell 脚本] 备份网站文件至OSS服务(纯shell脚本无sdk) ...
  • Spring Batch JSON 支持
  • 基于django的视频点播网站开发-step3-注册登录功能 ...
  • 京东物流联手山西图灵打造智能供应链,让阅读更有趣 ...
  • 曜石科技宣布获得千万级天使轮投资,全方面布局电竞产业链 ...
  • ​总结MySQL 的一些知识点:MySQL 选择数据库​
  • #每天一道面试题# 什么是MySQL的回表查询
  • (8)Linux使用C语言读取proc/stat等cpu使用数据
  • (zz)子曾经曰过:先有司,赦小过,举贤才
  • (附源码)springboot家庭装修管理系统 毕业设计 613205
  • (附源码)springboot炼糖厂地磅全自动控制系统 毕业设计 341357
  • (紀錄)[ASP.NET MVC][jQuery]-2 純手工打造屬於自己的 jQuery GridView (含完整程式碼下載)...
  • (三) prometheus + grafana + alertmanager 配置Redis监控
  • (十三)Java springcloud B2B2C o2o多用户商城 springcloud架构 - SSO单点登录之OAuth2.0 根据token获取用户信息(4)...
  • (转载)hibernate缓存
  • ***微信公众号支付+微信H5支付+微信扫码支付+小程序支付+APP微信支付解决方案总结...
  • ./indexer: error while loading shared libraries: libmysqlclient.so.18: cannot open shared object fil