颜色选择条 水平条状

HarmonyOS实战开发-如何实现自定义绘制颜色条 在做颜色拾取器,圆形或者条状颜色效果,进行选择,选择触摸点的颜色数值。 阅读详情
public class ColorSelectBar extends View {

    //控件的高度
    private int mBarHeight;
    //控件的宽度
    private int mBarWidth;
    //定义画笔
    private Paint paint;
    //圆圈的半径
    private int mBarPointerRadius;

    private RectF mBarRect = new RectF();
    //圆圈的圆心坐标
    private int cX, cY;

    //定义线性渲染
    private LinearGradient linearGradient;
    //画圆的画笔
    private Paint circlePaint;

    //渐变的颜色集合
    private static final int[] COLORS = new int[]{0xFF000000, 0xFF808080, 0xFFFFFFFF, 0xFFFF0000, 0xFFFF00FF,
            0xFF0000FF, 0xFF00FFFF, 0xFF00FF00, 0xFFFFFF00, 0xFFFF0000};

    //选择的颜色
    private int selectColor = Color.parseColor("#ff000000");

    //记录是否可以移动
    private boolean mIsMovingPointer;

    //颜色变化的监听器
    ColorChangeListener colorChangeListener;

    public ColorSelectBar(Context context) {
        super(context);
        init(null, 0);
    }

    public ColorSelectBar(Context context, AttributeSet attrs) {
        super(context, attrs);
        init(attrs, 0);
    }

    public ColorSelectBar(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init(attrs, defStyleAttr);
    }

    private void init(AttributeSet attrs, int defStyle) {
        TypedArray a = getContext().obtainStyledAttributes(attrs, R.styleable.ColorSelectBar, defStyle, 0);
        final Resources resources = getContext().getResources();
        //获取高度
        mBarHeight = a.getDimensionPixelSize(R.styleable.ColorSelectBar_bar_height, resources.getDimensionPixelSize(R.dimen.bar_height));
        //获取宽度
        mBarWidth = a.getDimensionPixelSize(R.styleable.ColorSelectBar_bar_width, resources.getDimensionPixelSize(R.dimen.bar_width));
        //获取半径
        mBarPointerRadius = a.getDimensionPixelSize(R.styleable.ColorSelectBar_pointer_radius, resources.getDimensionPixelSize(R.dimen.bar_pointer_radius));
        a.recycle();
        paint = new Paint(Paint.ANTI_ALIAS_FLAG);
        paint.setAntiAlias(true);
        paint.setStyle(Paint.Style.FILL);
        //定义画圆的画笔
        circlePaint = new Paint(Paint.ANTI_ALIAS_FLAG);
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        //获取mode和size
        int widthMode = MeasureSpec.getMode(widthMeasureSpec);
        int widthSize = MeasureSpec.getSize(widthMeasureSpec);
        //根据mode来确定size
        if (widthMode == MeasureSpec.EXACTLY) {
            mBarWidth = widthSize - mBarPointerRadius * 2;
        } else if (widthMode == MeasureSpec.AT_MOST) {
            mBarWidth = Math.min(mBarWidth, widthSize);
        }
        //确定高度
        int heightMode = MeasureSpec.getMode(heightMeasureSpec);
        int heightSize = MeasureSpec.getSize(heightMeasureSpec);
        if (heightMode == MeasureSpec.EXACTLY) {
            mBarHeight = heightSize;
        } else if (heightMode == MeasureSpec.AT_MOST) {
            mBarHeight = Math.min(mBarHeight, heightSize);
        }
        //确定最终大小布局
        setMeasuredDimension(widthSize, mBarPointerRadius * 2);
        //确定矩形的位置
        mBarRect.set(mBarPointerRadius,
                mBarPointerRadius - (mBarHeight / 2),
                mBarWidth + mBarPointerRadius,
                (mBarPointerRadius + (mBarHeight / 2))
        );
        //计算圆心的位置
        cX = mBarWidth + mBarPointerRadius;
        cY = mBarPointerRadius;
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        if (null == linearGradient) {
            linearGradient = new LinearGradient(mBarPointerRadius, 0, mBarWidth + mBarPointerRadius, mBarHeight, COLORS, null, Shader.TileMode.CLAMP);
            paint.setShader(linearGradient);
        }
        canvas.drawRect(mBarRect, paint);        //绘制矩形

        circlePaint.setColor(selectColor);
        canvas.drawCircle(cX, cY, mBarPointerRadius, circlePaint);    //绘制圆圈
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        getParent().requestDisallowInterceptTouchEvent(true);
        int action = event.getAction();
        //只是水平的滑动,故只记录x值的变化
        float dimen;
        dimen = event.getX();
        switch (action) {
            case MotionEvent.ACTION_DOWN:
                if (dimen >= mBarPointerRadius && dimen <= mBarPointerRadius + mBarWidth) {
                    mIsMovingPointer = true;
                    drawAgain(dimen);
                }
                break;
            case MotionEvent.ACTION_MOVE:
                if (mIsMovingPointer) {
                    if (dimen >= mBarPointerRadius
                            && dimen <= (mBarPointerRadius + mBarWidth)) {
                        drawAgain(dimen);
                    }
                }
                break;
            case MotionEvent.ACTION_UP:
                mIsMovingPointer = false;
                break;
        }
        return true;
    }


    private int ave(int s, int d, float p) {
        return s + Math.round(p * (d - s));
    }

    //根据位置来计算相应的颜色值
    private int calculateColor(float x) {
        float unit = x / (mBarPointerRadius + mBarWidth);
        if (unit < 0) {
            unit += 1;
        }

        if (unit <= 0) {
            return COLORS[0];
        }
        if (unit >= 1) {
            return COLORS[COLORS.length - 1];
        }

        float p = unit * (COLORS.length - 1);
        int i = (int) p;
        p -= i;

        int c0 = COLORS[i];
        int c1 = COLORS[i + 1];
        int a = ave(Color.alpha(c0), Color.alpha(c1), p);
        int r = ave(Color.red(c0), Color.red(c1), p);
        int g = ave(Color.green(c0), Color.green(c1), p);
        int b = ave(Color.blue(c0), Color.blue(c1), p);

        return Color.argb(a, r, g, b);
    }

    //定义个接口,颜色发生变化的接口监听
    public interface ColorChangeListener {
        public void onColorChanged(int value);
    }

    public void setColorChangeListener(ColorChangeListener colorChangeListener) {
        this.colorChangeListener = colorChangeListener;
    }

    /**
     * 重新绘制
     */
    private void drawAgain(float dimen) {
        cX = Math.round(dimen);
        selectColor = calculateColor(cX);
        invalidate();
        if (null != colorChangeListener)
            colorChangeListener.onColorChanged(selectColor);
    }
}

实现效果类似于:


ps:需要在dimens文件中自定义,颜色条的宽、高和拖动圆形的半径。在attr文件中定义,自定义颜色条的属性,及属性参数。

如:

<declare-styleable name="ColorSelectBar">
        <!--高度-->
        <attr name="bar_height" format="dimension"></attr>
        <!--宽度-->
        <attr name="bar_width" format="dimension"></attr>
        <!--圆圈的半径-->
        <attr name="pointer_radius" format="dimension"></attr>
</declare-styleable>



Origin绘制高级堆积条状图|科研论文图表教程(附数据格式模板) 普通堆积条状图看似常见,但别小瞧它,实则蕴含着强大且多元的分析潜力,今天带你解锁它的高阶玩法,让导师眼前一亮。本期例图,它打破数据堆砌模式,巧妙融合实际与目标值对比、绩效水平分类,多维度呈现每月绩效的复杂与变化,让人一眼洞悉数据奥秘。 🔥 为什么推荐它?🔥 ✅ 零基础5分钟上手:Origin直接出图,拒绝加班改图 ✅ SCI审稿人最爱:符合顶刊可视化规范,告别拒稿焦虑 ✅ 信息整合全:打破传统单维度,整合实际值、目标值及多绩效水平数据于一图,全面呈现月绩效全貌。 ✅ 结构分析透:颜色分层展示绩 阅读详情

相关推荐

RoboMaster装甲板识别:从灯条筛选到匹配算法的实战解析(附完整源码)

本文详细解析了RoboMaster装甲板识别技术,从灯条筛选到匹配算法的实战应用。通过颜色通道分离、轮廓查找与椭圆拟合等步骤,结合7层几何约束条件,实现高效准确的装甲板识别。文章还提供了完整源码和性能优化技巧,帮助开发者快速掌握这一关键技术。

weixin_42523543的博客 338

好看炫酷又好用的C#颜色选择器

好看炫酷的C#颜色选择器 前一段时间开发上位机功能需要用到颜色选择器功能,但是C#自带的颜色选择器操作繁琐,而且嵌入到上位机着实不好看,然后我在网上找了很久,发现很少有色轮形式的颜色选择器,所以我上github寻找,发现了一个宝藏——一个非常好看炫酷的颜色选择器控件,推荐给大家。 【首先贴上链接:适用于 Windows 窗体的 Cyotek 拾色器控件】 1.简单使用教程 2.官方介绍 Cyotek.Windows.Forms.ColorPickers库包含一系列自定义控件和实用程序类,适用于使用颜色的

weixin_49959955的博客 4142

C#中使用ColorDialog选择颜色

在该方法中,我们创建一个ColorDialog对象,并设置FullOpen属性为true,以允许用户自定义颜色。当用户选择了颜色并点击了对话框的确定按钮后,我们检查对话框的操作结果。如果用户点击了确定按钮(即操作结果为DialogResult.OK),则获取选择的颜色,并将其设置为标签lblSelectedColor的文本颜色和背景色。右击按钮,选择"属性",在事件中选择btnSelectColor_Click方法。这样,当用户点击按钮时,ColorDialog对话框将弹出并且用户可以选择颜色。

AnBig_Data的博客 859

[Python3] Matplotlib —— (八) 配置颜色条

文章目录九、配置颜色条(一)选择配色方案(二)颜色条刻度的限制与扩展功能的设置(三)离散型颜色条 [ Matplotlib version: 3.2.1 ] 九、配置颜色条 图例通过离散的标签标示离散的图形元素,然而,对于图形中由彩色的点、线、面构成的连续标签,用颜色条来表示的效果比较好。 在Matplotlib中,颜色条是一条独立的坐标轴,可以指明图形中颜色的含义。 通过colorbar()函数可以创建最简单的颜色条 import numpy as np import matplotlib.pyplo

進撃の算法 9080

C#做的颜色选择器

C#做的拾色器,可以通过鼠标选取屏幕中的任何像素点的颜色值,还包括一个刻度尺的应用。

RGB与RGBW比较

本文从静态测试图的光学指标、视频测试图的光学指标、主观评价等三个方面对使用RGB显示技术和RGBW显示技术的4K电视进行比对验证,对有关测试结果进行了分析,并由此给出几点有关4K电视标准化方面的建议。

C# 颜色选择控件

该控件可以选择 RGB,HSL,CMYK,也可以实现屏幕选择颜色。操作之后, 我们可以看到颜色的ARGB的值。C# 的颜色控件目前用的最多的就是。有需要的可以联系我,免费获取源代码。今天我们看一下另外的一种颜色控件。

qq_23353835的博客 795

android自定义ProgressView长条渐变色的进度条,实现渐变色的效果

android自定义ProgressView长条渐变色的进度条,实现渐变色的效果,不适用一张图片实现! 具体思路:http://blog.youkuaiyun.com/springsky_/article/details/17954765

用Python做一张拥有渐变色的水平堆叠图

keyword:python、matplotlib、barh、堆叠 起源:做数据处理时候需要制造一张如下的图片: 示例图 恰逢最近在学Python,然后就想试一下用python去实现,因为稍微接触过matplotlib这个库,然后就想着用它去实现 首先通过查资料,才知道这种图的名字叫做“水平堆叠条状图”,然后使用Matplotlib.plot.barh()就可以实现水平堆叠的效果; 水平或者垂直...

Rysin的博客 2808

鸿蒙实战开发教程-注册登录页面

在密码输入框中,只要设置TextInput的类型就可以实现带眼睛logo的密码输入框效果:

2401_82546228的博客 3559

Linux安装消息队列IBM MQ 7.5开发版安装配置详解

消息队列IBM MQ 7.5开发版安装配置详解 文章目录消息队列IBM MQ 7.5开发版安装配置详解前言一、什么是IBM MQ?二、安装前准备1、安装前准备2、安装MQ Server3、启动实例4、创建队列一个名为TEXT的队列(测试)5、启动端口监听6、启动成功总结 前言 IBM 已经熟练地优化了 MQ(消息队列),在市场上已有超过 25 年的历史。借助 MQ(消息队列),如果无法立即传递消息,那么会在其等待队列中确保消息安全,直到保证传递为止。竞争产品可能会传递两次消息或根本不传递消息,而 M

zhx__的博客 5163

教你在Excel里做GA的水平百分比图的详细步骤(图文教程)-成为excel大师(1)...

GA报表除了默认的表格方式显示数据外,还支持饼图,水平百分比图,数据透视图等展现方式,其中水平百分比图在可视化看流量时最为方便,就像这样:     那么当我们要在Excel里做类似的效果应该怎么做呢?尤其是数据源不是来自GA的情况。   初始的表格:   做好的效果:   首先选择好百分比这一列,然后插入-&gt;条状图-&gt;水平条状图   选中新建的图表: ...

weixin_33898233的博客 1262

新手必看!无人机定高PID调参避坑指南:从理论到实战的完整流程

本文为无人机新手提供定高PID调参的完整指南,从传感器融合到抗风策略,详细解析多传感器融合、PID控制参数调试及环境干扰应对。通过实战案例和代码示例,帮助开发者快速掌握无人机定高技术,避免常见调参陷阱,提升飞行稳定性。

spark7igniter的博客 221

python可视化水平双向箭头_python数据可视化第二弹

代码模板:最前面importpandas as pdpd.plotting.register_matplotlib_converters()importmatplotlib.pyplot as plt%matplotlib inlineimportseaborn as snsprint("Setup Complete")View Code一、折线图Line chartsplt.figure(fig...

weixin_39911007的博客 1245

三、使用HM进行简单的视频隐写demo

三、使用HM进行简单的视频隐写前言一、实验环境二、实验思路三、实验过程3.1 提取原始载体3.2 使用LSB隐写算法进行隐写3.3 放回含密载体3.4 提取含密载体3.5 使用LSB提取算法进行比对四、碰到的问题以及解决思路4.1 块的结构体发生变化4.1.1 产生的原因4.1.2 解决方法4.2 一个有趣的现象4.2.1 产生的原因4.3 视频产生较大失真4.3.1 产生的原因4.3.2 解决方法五、总结 前言 在前两篇博客中介绍了基于HEVC/H.265视频编解码器的视频隐写的基本思路,本文将详细记录

杨酬勤的博客 1792

有道龙虾LobsterAI vs. OpenClaw:对比与安装部署攻略

LobsterAI是"中国版OpenClaw",更注重易用性和中文场景适配;OpenClaw是技术极客的玩具,需要大量命令行操作。

lpfasd123的博客 2393

数据可视化必须注意的30个小技巧总结

优秀的数据可视化图表只是罗列、总结数据吗?当然不是!数据可视化其真正的价值是设计出可以被读者轻松理解的数据展示,因此在设计过程中,每一个选择,最终都应落脚于读者的体验,而非图表制作者个人。这里给大家总结了数据可视化的制作的30个小技巧,通过列举一些容易被忽略的常见错误,最终能够快速提升和巩固你的可视化制作水平。

qq_27595745的博客 793

ROSTEA软件下载及情感分析详细操作教程(附网盘链接)

原ROST虚拟团队出品的ROST系列文本内容挖掘分析平台,是辅助人文社会科学研究的免费计算平台。该软件可以实现文本预处理、分字、分词、词性识别、特殊名词抽取、词频统计、英文词频统计、情感计算、分类算法、聚类算法等一系列文本挖掘,是人文社科研究和论文写作的一把利器。该软件用户量超过一万人,遍布海内外100多所大学,包括剑桥大学、日本北海道大学、北京大学、清华大学、香港城市大学、澳门大学等众多高校。关于ROSTCM6的安装介绍可以参考之前的文章ROSTCM6软件下载及语义网络分析详细操作教程ROST EA。

m0_64336780的博客 1万+

android 大屏图表 MPAndroidChart 水平柱状图 水平圆角柱状图

MPAndroidChart最重要的核心功能许多不同的图表类型:LineChart(线型图),BarChart(条状图,垂直,水平,堆叠,分组),PieChart(饼图),ScatterChart(散点图),CandleStickChart(K线图、蜡烛图),RadarChart(雷达图、蜘蛛网络图表),BubbleChart(气泡图)组合图表(例如,一条线和一条条)在两个轴上缩放(带有触摸手势,单独的轴或捏缩放)拖动/平移(带有触摸手势)分开的(双)y轴。

代码是贝多芬的音符 2629

YOLOv11改进策略【独家融合改进】| 模型轻量化二次改进:StarNet + FreqFusion,极限降参,适用专栏内所有轻量化模型

FreqFusion是一种旨在解决密集图像预测任务中特征融合问题。

Limiiiing的博客 2123

【KingSCADA】如何建立硬件系统及相关变量

本篇主要讲解如何定义设备,如何定义变量。KingSCADA3.8的采集系统是指负责和现场设备进行通讯,并采集现场数据和控制现场数据的模块,称之为采集器,也叫IOServer应用,它是一组独立的应用程序,可以脱离KingSCADA3.8软件,它依赖于KingSCADA3.8驱动产品,通过驱动与IO设备进行通讯。采集系统由通讯链路,设备,数据块组成。链路:链路是指计算机通过什么方式(接口)与设备进行连接,链路类别:串口,以太网,GPRS,Modem,通信卡,采集卡,无链路。

做有价值的事,积累有价值的笔记! 1万+

使用物价水平修正票房数据,长津湖还是票房冠军吗?

使用物价水平对票房总榜上前500名票房数据进行修正!

None 3625

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Unity UGUI Slider组件深度解析:从进度条到动态血条系统实战

在Unity游戏开发中,UI系统是连接玩家与游戏世界的核心桥梁,其性能与表现力直接影响用户体验。UGUI作为Unity内置的UI解决方案,通过组件化设计将数据、逻辑与视觉表现分离,其中Slider组件便是实现进度可视化的重要基础。其核心原理在于将业务数值映射到标准化范围,并自动驱动UI元素的变换,实现了数据与表现层的解耦。这种设计不仅提升了开发效率,更便于维护和迭代。在技术价值上,合理使用Slider能显著减少冗余代码,结合事件驱动模型可优化性能,而通过图集管理与层级规划则能有效利用UGUI的合批机制,降低

weixin_32631179的博客 342

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Android ProgressBar 详解 改变 ProgressBar 颜色

今天来说说 ProgressBar   这个东西, 之前一种是用的 项目里面 别人写好的直接用, 还没怎么细看这两个东西 ProgressBar 很简单就一进度条 默认情况下, 他是圆形的,  但是它还有另一种 水平长条状的形态 同时还需要了解的有: 1. 水平形状的 ProgressBar 是有两个进度的 向我们看到 视频的精度条, 有一个是当前播放的,还有一个是下载

chen930724的专栏 6万+

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

绿色背景配什么颜色文字_灰色地砖配什么颜色窗帘 地砖的施工工艺

我们在做地面装修的时候,不管要选择瓷砖还是地板都必须要讲究搭配,必须要和客厅的风格所搭配,如果不搭配的话会直接影响后期的效果,这样的话会特别的难看,因此,我们大家可以看一下灰色地砖配什么颜色窗帘比较好,要选择所搭配的颜色,与此同时,地砖的施工工艺有什么。灰色地砖配什么颜色窗帘浅灰色瓷砖拼花的地板,搭配着一条浅棕色的毛绒地毯。上面摆着一张原木色的茶几桌,带来简单时尚个性。蓝色的落地窗帘配合...

weixin_39531229的博客 196
上一篇: canvas.save() canvas.restore() 作用
下一篇: Glide源码解析
hy_programmer
博客等级 码龄12年 5粉丝 100原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值