j2me颜色渐变的问题

wtobias 2008-06-19 09:12:45
加精
我自己写了一个颜色渐变的方法,如下:
public static void fillLinerRect(Graphics gr, int x, int y, int w, int h,
int startcolor, int endcolor)
{
int r_start = ((startcolor >>> 16) & 0xFF);
int g_start = ((startcolor >>> 8) & 0xFF);
int b_start = ((startcolor >>> 0) & 0xFF);

int r_end = ((endcolor >>> 16) & 0xFF);
int g_end = ((endcolor >>> 8) & 0xFF);
int b_end = ((endcolor >>> 0) & 0xFF);

int c_r = r_end - r_start;
int c_g = g_end - g_start;
int c_b = b_end - b_start;

for (int i = 0; i < h; i++)
{
int r = r_start + c_r * i / h;
int g = g_start + c_g * i / h;
int b = b_start + c_b * i / h;

gr.setColor(r, g, b);
gr.fillRect(x, y + i, x + w, y + i);
}
}
但是实际的渐变效果不平滑,很不好,在网上搜到一个算法,如下:
/**
* 绘制渐变色选择条
* @param g
* @param color
* @param x
* @param y
* @param width
* @param height
*/
public final static void drawRGBRect(Graphics g, int color, int x, int y,int width, int height) {
int[] rgb = getRGBColor(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);
}

}
/**
* 获取颜色渐变RGB数组,
*
* @param width
* @return
*/
public final static int[] getRGBColor(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;
}
这个实现起来效果很平滑,但有一点我怎么改都没改好,就是这个算法实现的效果是从左往右颜色渐变,但我想实现的是从上往下,改了一段时间没改好,哪位高手帮改一下,让效果变成从上往下颜色渐变,另这个算法能在midp1.0上面运行吗
...全文
1807 35 打赏 收藏 转发到动态 举报
写回复
用AI写文章
35 条回复
切换为时间正序
请发表友善的回复…
发表回复
redcurtain 2009-06-04
  • 打赏
  • 举报
回复
很好呀,自己学一下哈
hearrt 2009-02-23
  • 打赏
  • 举报
回复
mark
wenjunsu 2008-11-02
  • 打赏
  • 举报
回复

哇塞!好东西!。。

学习了。。收藏了。。。

up
xpwang168 2008-09-11
  • 打赏
  • 举报
回复
颜色渐变 getRGB(); 得到rgb[] 通过一定规律的方法修改 r g b 再drawRGB();
xpwang168 2008-09-11
  • 打赏
  • 举报
回复
[Quote=引用 29 楼 lixiurui 的回复:]
那3个>>>是什么意思?
[/Quote]

2进制右移 高位补0
xpwang168 2008-09-11
  • 打赏
  • 举报
回复
你的那个方法 只有 endcolor - startcolor 是 h 倍数 才可能 看起来平滑 相等应该是最好的,
lixiurui 2008-07-06
  • 打赏
  • 举报
回复
那3个>>>是什么意思?
yy274107702 2008-07-02
  • 打赏
  • 举报
回复
不错了。。当初我就没有做得到
soleares 2008-06-29
  • 打赏
  • 举报
回复
都别哭^^
总会好的,呵呵!!!
coolgirli 2008-06-27
  • 打赏
  • 举报
回复
好好学习,好东西啊
pigzhutuo 2008-06-27
  • 打赏
  • 举报
回复
好好学习一下
dyw31415926 2008-06-25
  • 打赏
  • 举报
回复
好好学习一下
jackyming 2008-06-24
  • 打赏
  • 举报
回复
基本没看懂啊。。。。刚刚开始。。钻研ING。。。。
yhbbobo 2008-06-24
  • 打赏
  • 举报
回复
初学,顶一下
dyjava01 2008-06-23
  • 打赏
  • 举报
回复
int col = color ¦ (a < < 24);
rgb[i * 4] = col;
rgb[i * 4 + 1] = col;
rgb[i * 4 + 2] = col;
rgb[i * 4 + 3] = col;
}else{
a = 255-i;
if(a <0)
yanziyuhua 2008-06-23
  • 打赏
  • 举报
回复
哈哈。。。刚好学习到了 ,谢谢各位 大侠
lgtwboy 2008-06-20
  • 打赏
  • 举报
回复
rgb[i*4] = col;
rgb[i*4+1] = col;
rgb[i*4+2] = col;
rgb[i*4+3] = col;
----------------------
这是为了速度么
这个应该也行 你试试
public void drawRGBRect(Graphics g, int color, int x, int y, int width,
int height) {
lineColor = new int[height][];
for (int ii = 0; ii < height; ii++) {
for (int i = x; i < width; i++) {
lineColor[ii][i] = getRGBColor(color, height)[ii];
}
}
for (int ii = y; ii < height; ii++) {
g.drawRGB(lineColor[ii], 0, height, x, ii, width, ii, true);
}
}

public int[] getRGBColor(int color, int h) {
int[] rgb;
int RGB_L = h;
rgb = new int[RGB_L];

int alpha = -127;
for (int i = 0; i < RGB_L; i++) {
alpha = -127 + i;
int col = color | (128 - alpha << 24);
rgb[i] = col;
}
return rgb;

编译没报错,但运行时不显示,后来发现是IDE的事
无论运行什么,eclipse老出 ClassNotFound,而且透视图变为调试

wtobias 2008-06-20
  • 打赏
  • 举报
回复
还是要靠自己呀
public final static void drawRGBRect(Graphics g, int color, int x, int y,int width, int height,boolean dir)
{
int[] rgb = getRGBColor(color, height,dir);
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);
}
}
/**
* 获取颜色渐变RGB数组,
*
* @param width
* @return
*/
public final static int[] getRGBColor(int color, int h, boolean dir)
{
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++) {
if(dir==true){

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;
}else{
a = 255-i;
if(a<0)
{
a = 0;
}
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;
}
wtobias 2008-06-19
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 pipi_jf 的回复:]
把y换成x不就行了吗?


Java code
public final static void drawRGBRect(Graphics g, int color, int x, int y,int width, int height) {
int[] rgb = getRGBColor(color, width);
for (int bx = x; bx < x + width; bx += 4) {

int nTemp = x + width - (bx - x);

nTemp = nTemp > 4 ? 4 : nTemp;
g.drawRGB(rgb, 0, width, bx, y, nTemp, height, true);
} …
[/Quote]
------------
不行
wormwormwormworm 2008-06-19
  • 打赏
  • 举报
回复
呵呵,这种效果用在哪里的
加载更多回复(13)

13,100

社区成员

发帖
与我相关
我的任务
社区描述
Java J2ME
社区管理员
  • J2ME社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧