JavaME UI设计之渐变色处理

鸿蒙UI开发——渐变色效果 线性渐变direction?repeating?: boolean;})线性渐变的起始角度。0点方向顺时针旋转为正向角度。默认值:180,角度为字符串时仅支持类型deg,grad,rad,trun。线性渐变的方向,设置angle后不生效。默认值:GradientDirection.Bottom指定某百分比位置处的渐变色颜色,设置非法颜色直接跳过。为渐变的颜色重复着色。默认值:false角度渐变start?end?rotation?repeating?: boolean;}) 阅读详情

  •  
    移动应用的UI设计通常比较复杂,因为,需要同时考虑设备的内存状况、处理性能,一般情况,效果非常好的UI都需要很多图素,这样就增加了软件包的大小使得用户难以接受,比如,我们需要实现一个全屏幕渐变色的效果,如果选择用图片来实现,随都能做出来,并且也很简单,只需要美术准备好一张渐变色的图片,然后我们用程序drawImage显示上去即可,但是这张图片不仅增加了软件包的大小。而且如果我们需要动态更新一个这个渐变颜色也非常不方便(比如:在一个软件中,我们需要同时有一个水平方向的渐变和一个垂直方向的渐变,难道要准备两张图片吗?),因此,我们可以考虑使用程序直接来绘制渐变色。
    JavaME中有一个函数drawRGB专门用来绘制一个颜色,该函数同能非常强大,在做UI设计时使用非常多,比如:需要调整应用中的一张图片的亮度等,都会使用这个函数,下面是该函数的具体用法:
    drawRGB(int[] rgbData, int offset, int scanlength, int x, int y, int width, int height, boolean processAlpha)
    offset:要绘制的数据在rgbData中的偏移,也就是起始点
    scanlength:每一行起始点的数据在rgbData中的间隔
    x: 表示区域开始的x坐标
    y: 表示区域开始的y坐标
    width:这个区域的宽度
    height: 这个区域的高度
    比如rgbData是一个16*16的颜色矩形。要绘制其中(2,2,4,4)的矩形到点(3,4)则代码如下:
    drawRGB(rgbData,2,16,3,4,4,4,processAlpha)
    最后的processAlpha设置成true,然后前面的颜色为ARGB是可以绘制半透明和透明色的,需要注意在部分机型上对于半透明及透明的支持。
    在MIDP2.0的图片编程中,可以把图片理解为一个int[]数组,数组中的每个数据都与图片中的一个像素对应。数组中的int类型的数据被分为4个部分,每个部分由8bit字节构成,分别代表Alpha通道,red通道,green通道,blue通道。其中,rgb代表图片颜色的组成,A代表图片的透明度。1111 1111代表像素完全不透明,0000 0000代表像素完全透明,介于两者之间的则代表半透明像素。同样的,对于我们要绘制的一块渐变色的区域也可以理解为一个int[]数组,这样我们就只需要计算该数组中的数值为渐变色,然后调用drawRGB函数绘制即可。如下代码所示,我们将计算一个指定颜色的垂直方向的渐变颜色数组。
    public final static int[] getRGBVColor(int color, int h) {
           int[] rgb;
           int RGB_L = h;
           int nRgbData = RGB_L * 4;
           int a;
           rgb = new int[nRgbData];
           for (int i = 0; i < RGB_L; i++) {
                  a = i;
                  if (a > 255) {
                         a = 255;
                  }
                  int col = color | (a << 24);
                  rgb[i * 4] = col;
                  rgb[i * 4 + 1] = col;
                  rgb[i * 4 + 2] = col;
                  rgb[i * 4 + 3] = col;
           }
           return rgb;
    }
    参数color为要渐变的颜色,h为渐变区域的高度,首先构建了一个int[]数组,长度为h*4,然后根据指定颜色改变其r,g,b通道形成新的颜色保存在该int[]数组中,接下来就是调用drawRGB函数来绘制出该数组中的数据即可。代码如下:
    public final static void drawRGBVRect(Graphics g, int color, int x, int y,
                  int width, int height) {
           int[] rgb = getRGBVColor(color, height);
           for (int i = 0; i < width; i += 4) {
                  int nTemp = x + width - (i - x);
                  nTemp = nTemp > 4 ? 4 : nTemp;
                  g.drawRGB(rgb, 0, 4, i, y, nTemp, height, true);
           }
    }
    绘制过程非常简单,通过一个for按照指定的宽度width进行循环绘制即可,比如使用如下代码:
    CrystalRGB.drawRGBVRect(g, 0xff0000, 0, 0, 240, 320);
    绘制一个240*320宽度和高度的渐变矩形框,绘制的效果如图1-1所示。
    图1-1 垂直渐变颜色
    当然,还有其他各种渐变色的绘制,原理都几乎一样,这里我们将一个沿水平方向渐变的代码贴出来,如下代码所示:
    public final static int[] getRGBSColor(int color, int h) {
           int[] rgb;
           int RGB_L = h;
           int nRgbData = RGB_L * 4;
           rgb = new int[nRgbData];
           int alpha = -127;
           for (int i = 0; i < RGB_L; i++) {
                  alpha = -127 + i;
                  int col = color | (128 - alpha << 24);
                  rgb[i] = col;
                  rgb[i + RGB_L] = col;
                  rgb[i + RGB_L * 2] = col;
                  rgb[i + RGB_L * 3] = col;
           }
           return rgb;
    }
    public final static void drawRGBSRect(Graphics g, int color, int x, int y,
                  int width, int height) {
           int[] rgb = getRGBSColor(color, width);
           for (int by = y; by < y + height; by += 4) {
                  int nTemp = y + height - (by - y);
                  nTemp = nTemp > 4 ? 4 : nTemp;
                  g.drawRGB(rgb, 0, width, x, by, width, nTemp, true);
           }
    }
    效果如图1-2所示。
    1-2水平渐变颜色
    最后,给大家列出了另外一种算法,原理差不多,但是可以用来实现某种特殊效果,这里是将生成的颜色数组,通过Image.createRGBImage函数创建为一个Image对象,然后通过drawImage函数将该Image对象绘制出来,并且该函数实现了指定在两种颜色之间的渐变,代码如下:
    private static int[] retrieveRGBComponent(int color) {
           int[] rgb = new int[3];
           rgb[0] = (color & 0x00ff0000) >> 16;
           rgb[1] = (color & 0x0000ff00) >> 8;
           rgb[2] = (color & 0x000000ff);
           return rgb;
    }
    private static int generateFromRGBComponent(int[] rgb) {
           if (rgb == null || rgb.length != 3 || rgb[0] < 0 || rgb[0] > 255
                         || rgb[1] < 0 || rgb[1] > 255 || rgb[2] < 0 || rgb[2] > 255)
                  return 0xfffff;
           return rgb[0] << 16 | rgb[1] << 8 | rgb[2];
    }
    private static int[] generateTransitionalColor(int color1, int color2,int steps) {
           int[] color1RGB = retrieveRGBComponent(color1);
           int[] color2RGB = retrieveRGBComponent(color2);
           if (steps < 3 || color1RGB == null || color2RGB == null)
                  return null;
           int[] colors = new int[steps];
           colors[0] = color1;
           colors[colors.length - 1] = color2;
           steps = steps - 2;
           int redDiff = color2RGB[0] - color1RGB[0];
           int greenDiff = color2RGB[1] - color1RGB[1];
           int blueDiff = color2RGB[2] - color1RGB[2];
           for (int i = 1; i < colors.length - 1; i++) {
                  colors[i] = generateFromRGBComponent(new int[] {
                                color1RGB[0] + redDiff * i / steps,
                                color1RGB[1] + greenDiff * i / steps,
                                color1RGB[2] + blueDiff * i / steps });
           }
           return colors;
    }
    public static void drawSelectedBackground(Graphics g, int x, int y, int width,
                  int height, int TransStart, int TransEnd) {
    //      // 从左到右渐变
    //      int[] line = generateTransitionalColor(TransStart, TransEnd, width);
    //      Image lineImg = Image.createRGBImage(line, line.length, 1, false);
    //      for (int i = 0; i < height; i++) {
    //             g.drawImage(lineImg, x, y + i, Graphics.LEFT | Graphics.TOP);
    //      }
           // 从上到下渐变
           int[] line = generateTransitionalColor(TransStart, TransEnd, height);
           Image lineImg = Image.createRGBImage(line, 1, line.length, false);
           for (int i = 0; i < width; i++) {
                  g.drawImage(lineImg, x + i, y, Graphics.LEFT | Graphics.TOP);
           }
    }
    由于篇幅关系,原理类似的算法,就不在重复分析,效果如下图所示。
     
    评估该帖

 
java 组件绘制渐变背景色 经常需要实现渐变色效果,试了好多次,终于实现渐变色功能,希望对大家有用,我用这个绘制了好多个图,效果不错 立即下载

相关推荐

告别手动输入!用Burp插件+ddddocr,5分钟搞定图片验证码自动识别

本文详细介绍了如何利用Burp插件和ddddocr开源库快速构建图片验证码自动识别系统,实现高效、零成本的验证码自动化解决方案。通过环境搭建、性能调优和Burp Suite深度集成,显著提升安全测试效率,特别适用于金融和电商系统的批量测试场景。

weixin_29099217的博客 202

Java实现颜色渐变效果

RGB色彩,在自然界中肉眼所能看到的任何色彩都可以由红(R)、绿(G)、蓝(B)这三种色彩混合叠加而成,因此我们只要递增递减的修改其特定值就能得到相应的渐变效果。 运行效果:(图1) 运行5秒后:(图2) Java源代码: 1 import java.awt.Color; 2 import java.awt.Dimension; 3 import java...

weixin_30527551的博客 1684

SAP VF01开票报错:出口贸易数据不完整

找了半天资料,最后发现是没有维护凭证抬头的数据;由于我不是SD模块顾问,整体流程使用的是原本环境里面的数据,用新建工厂引用,所以也不知道为啥会出发这个贸易业务。正常传到FICO模块,生成会计凭证、获利分析、利润中心及CO凭证。需要维护这三个字段后才能正常转到FI生成会计凭证。VF01开票报错:出口贸易数据不完整。

MaiKouBei的博客 1540

JavaME UI设计之透明图片处理

在开发J2ME手机程序的时候,尤其是在开发游戏的时候,透明图片几乎是一种必然的需求,但是在游戏开发中我们会采用Sprite精灵来做图形元素的绘制,而这些图片素材可能都是来自于资源中的文件,这些文件如果采用PNG等支持透明设置的格式的话,透明的处理就会被精灵类自动实现,不需要我们特别处理了。如果遇到一些特殊需求,比如某些图片可能需要通过程序来绘制,或者开发者希望用程序来绘制,那么这时候自己绘制的图片

alleniversoncomputer的专栏 812

干货满满!AI应用架构师分享AI驱动虚拟展示干货

虚拟展示(Virtual Presentation):用数字技术将物理对象/场景转化为可交互的虚拟内容(比如3D文物、虚拟试衣间);AI驱动(AI-Powered):通过AI技术实现实时交互、智能决策、个性化生成,让虚拟内容“活”起来;AI驱动虚拟展示:以用户体验为核心,将“3D渲染+AI理解+实时数据”融合,形成“感知-决策-反馈”的闭环系统。前端交互层是用户直接体验到的部分,再厉害的AI和渲染,只要前端交互烂,用户都会跑。我见过很多团队为了“炫技”做了复杂的AI功能,结果用户不会用。

AI大模型应用之禅 536

AUTOSAE软件配置-项目标准配置 (PSC) 导入达芬奇( DaVinci Configurator)

文件是“可拆分的”,这意味着如果格式符合 AUTOSAR 拆分规则,则可以与其他。)是一个ARXML文件,主要由OEM提供,其中包含。)工件,可以作为输入文件导入到达芬奇配置器专业版。导入的参数将以只读方式处理。不允许在多个 ARXML 文件中导入一个。的已存在数据或从输入文件派生的数据。可以作为输入文件导入到另一个。文件会覆盖用户配置的基本。元素和诊断数据预配置。定义 [数据结构]。中,可以导出一个或多个。

m0_49148264的博客 1010

JavaME UI设计之低级界面文本控件

在做某些应用时,我们通常需要处理显示大量的文字,例如,要实现一个电子书阅读器,需要处理的文字非常多,这时我们应该会需要一系列的文本控件,比如:菜单,列表、文本显示等,这里我们主要分析实现一个用于文本显示的控件,他需要提供自动换行,翻页等功能,在网上看到很多人在询问如何实现这样的控件,并且网上提供的大多数是自动换行,没有实现翻页,并且实现的效率也不是很高,所以这里我们再次通过一个简单的算法来实现这样

alleniversoncomputer的专栏 675

LeetCode 热题 100 回顾

力扣最受刷题发烧友欢迎的 100 道题 LeetCode 热题 100 : 题目回顾、解题思路、复杂度分析、代码实现、验证算法

曾经“等你生日那天”都遥远得像未来,如今却可欢愉的挥手说“下个十年见” 9万+

JavaME UI设计之图像特效二

上一篇我们分析了处理图片特效的原理,通常是将图像数据转换为一个int[]数组,然后再操作这个int[]数组,最后将操作之后的int[]数组转换为一个Image即可。本文我们接着分析另外几种常用特效的实现原理。 负片特效 要在图像处理软件中将图片处理为负片特效,非常简单,但是这些图像处理软件也是通过程序来实现的,其实现原理通常是用255来减去图像数据的r,g,b值,得到一个新的r,g,b值,再将

alleniversoncomputer的专栏 1199

在iPad上使用Python进行编程

如果你拥有一台iPad,并且想在上面编写和运行Python代码,你会发现iPad提供了一些适用的工具和应用程序来满足你的需求。安装一个Python解释器应用程序,编写和运行Python代码,使用第三方库和模块,以及存储和共享代码,这些步骤将帮助你在iPad上进行Python编程。要在iPad上运行Python代码,首先需要安装一个Python解释器。这些应用程序提供了一个交互式的开发环境,允许你编写、编辑和运行Python代码。一旦你安装了Python解释器应用程序,你可以开始编写Python代码了。

2301_79366435的博客 4626

选择的 Python 解释器无效,请尝试更改解释器以启用 IntelliSense、Lint 分析和调试等功能。请查看输出,详细了解解释器无效的原因。

摘要:在VS Code中配置Anaconda Python解释器时若出现"解释器无效"错误,可通过修改用户设置解决。具体步骤:1) 按Ctrl+Shift+P打开命令面板;2) 搜索并打开用户设置JSON文件;3) 添加conda路径配置项,示例格式为"python.condaPath": "D:\\Anaconda\\setup\\Scripts\\conda.exe";4) 同时启用环境激活选项"python.terminal.act

猿小白的博客 844

4.3-笔刷Brush

Brush用于定义控件的外轮廓、背景等属性的值,是为属性赋值的。如Shape类控件的Stroke或Fill属性、Border控件的Stroke属性、Shadow的Brush属性、VisualElement派生类控件的Background属性等,同时在MAUI的Microsoft.Maui.Graphics画布中也有用到。MAUI为我们提供了三种类型的笔刷:(1)纯色笔刷:SolidColorBrush;(2)线性渐变笔刷:LinearGradientBrush;

天之梅子的博客 352

Oracle11g下载与安装(windows)

一、Oracle11g下载 二、安装准备 三、执行安装步骤 四、测试连接 附:Oracle11g服务说明

欢迎订阅我的“JAVA全栈开发笔记(全)”专栏,价格优惠,仅需19.9元。 2万+

JavaFX史上最全教程 - Shape - JavaFX渐变颜色

通过将proportional属性设置为true,梯度轴线开始点和结束点将被表示为单位平方坐标。起点和终点的x,y坐标必须在0.0和1.0之间(double)。要创建线性渐变绘制,我们为开始点和结束点指定startX,startY,endX和endY。通过将proportional属性设置为false,我们可以基于标准屏幕(x,y)坐标将渐变轴设置为具有起点和终点。以下代码使用在对角线方向上的绿色和黑色创建具有渐变的重复图案的矩形。开始X,Y和结束X,Y值设置在对角线位置,循环方法设置为反映。

GaoshangD1209的博客 620

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

SwiftUI中三大渐变色的介绍

在SwiftUI中,渐变色是一种常用的视觉效果,用于创建平滑过渡的颜色变化。通过使用渐变色,我们可以实现丰富多彩的界面设计,增强用户体验。

郭永明的技术专栏 1921

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

Java 为图形填充渐变色

1. 首先在项目中创建一个继承 JFrame 类的 FillGradientFrame 窗体类 2. 在 FillGradientFrame 窗体类中,创建内部面板类 FillGradientFrame ,并重写 JComponent 类的 paint() 方法,在该方法中使用 Graphics2D 类的 setPaint() 方法设置封装了渐变色的对象,该对象是通过 GradientPai...

Ibelievesunshine的博客 5098

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

Java绘制图形(正方形/三角形/圆/网以及填充颜色)

Java绘制图形(正方形/三角形/圆/网以及填充颜色) 首先用EasyGraphics确定图片大小 然后用setcolor来设置图象主题颜色 也可以给特定大的点设置颜色 例如: g.setColor(200,0,0); g.plot(100,100) 这代表在(100,100)这个位置的点颜色为红色。 重点: •屏幕上有一个不可见的图形光标当前像素,初始设置为原点 •我们可以根据需要将其移动到一个新的(x,y)位置 跟随或移动它并画一条线使用lineTo方法 替代方法 1.moveTo和lineTo方法可

kirsten111111的博客 1万+

java 绘图 渐变_如何在Java 2D中创建渐变绘画?

要更改图形形状的颜色,我们可以使用setPaint()方法。对于简单的着色,我们可以将颜色对象传递给此方法,例如Color.RED或Color.GREEN。如果要使用渐变绘画进行绘画,则可以使用GradientPaint类。此类提供了一种使用线性颜色渐变图案填充形状的方法。要创建渐变颜色图案,可以将以下参数传递给对象构造函数。x1:用户空间中第一个指定点的x坐标y1:用户空间中第一个指定点的y坐标...

weixin_39633452的博客 489

java bufferedimage颜色_使用BufferedImage进行渐变色操作

序本文主要简述一下如何使用BufferedImage进行渐变色操作。GradientPaintjava/awt/GradientPaint.javapublic class GradientPaint implements Paint {Point2D.Float p1;Point2D.Float p2;Color color1;Color color2;boolean cyclic;//.......

weixin_34589862的博客 1556

java 实现 线性渐变色计算方法

 java根据value值 计算线性渐变色 绘制出的图片效果 2019/02/04 14:00 全国温度插值图颜色插值实现部分代码 /* 传入的参数格式 String[] breakArray = "-999,0,3,5,10,15,20,30".split(","); String colorStr = "[[0,0,0,0],[74,1...

FlyDanke的博客 2192

java颜色渐变组件的实现

下面是本人写的一个简单的渐变组件,它的渐变方向只是一个方向上的线性渐变,有高手能实现全方位渐变的指点下:import java.awt.Color;import java.awt.GradientPaint;import java.awt.Graphics;import java.awt.Graphics2D;import java.awt.geom.*;import ja

东篱小屋 2338

UI设计流行渐变配色素材,轻松驾驭色彩

近年来在APP中以暗色调背景作为烘托,搭配紫色、蓝色、洋红为主的冷暖色,是霓虹色渐变 经典的应用方式。在暗色背景下运用霓虹色渐变,通过明暗的强对比突出页面关键元素,对用 户进行视觉引导,同时丰富页面层次,增强页面的视觉冲击力及艺术感染力。 (更多配色素材到搜UI (SOOUI) 寻找宝藏)设计师轻松驾驭色彩 桌面渐变 渐变包// FREE Colorstopper渐变 桌面渐变 生动地勾勒渐变 中性渐变 颜色渐变为2017年 素描渐变 Coolhu

awayaya1的博客 683

java窗体背景渐变色_实时改变视图渐变背景

原因view.layer.insertSublayer(gradientLayer, at: 0)将始终在索引0处插入渐变图层 . 最初,您创建了一个黑白颜色的图层并添加到位置0.现在,当用户选择新颜色时,您创建一个新图层并添加索引0,使黑白图层成为因此,只有黑色和白色层才会出现Solution:删除旧图层并添加新图层 .Step 1:将gradientLayer声明为实例变量class View...

weixin_39867212的博客 260

# WPF ComboBox 控件详解与使用 —WPF 中的控件(7)--下拉框选项列表控件( ComboBox)

ComboBox`(下拉框选项列表)是 WPF 中最常用的选择类控件之一,它在有限空间内提供下拉选项列表,支持**单选、可编辑输入、数据绑定、自定义项外观**等核心能力,继承自 `System.Windows.Controls.Primitives.Selector`。 本文将从基础属性、核心事件、基础用法、数据绑定、自定义模板、高级定制到最佳实践,逐一带代码注解进行讲解。

yunmaowu0917的博客 160
上一篇: 男人与酒
下一篇: JavaME UI设计之透明图片处理
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值