📄 colorselector.java
字号:
package com.ismyway.anyview;
import javax.microedition.lcdui.*;
/**
* <p>Title: AnyView</p>
*
* <p>Description: E680(I) Reader</p>
*
* <p>Copyright: Copyright (c) 2005</p>
*
* <p>Company: www.ismyway.com</p>
*
* @author ZhangJian
* @version 1.0
*/
public class ColorSelector extends AbstractWindow {
private int ANCHOR = Graphics.LEFT | Graphics.TOP;
private String title = "拾色器 0.1";
public final static int[] colors = {0X000000, 0X000033, 0X000066, 0X000099,
0X0000CC, 0X0000FF, 0X003300, 0X003333,
0X003366, 0X003399, 0X0033CC, 0X0033FF,
0X006600, 0X006633, 0X006666, 0X006699,
0X0066CC, 0X0066FF, 0X009900, 0X009933,
0X009966, 0X009999, 0X0099CC, 0X0099FF,
0X00CC00, 0X00CC33, 0X00CC66, 0X00CC99,
0X00CCCC, 0X00CCFF, 0X00FF00, 0X00FF33,
0X00FF66, 0X00FF99, 0X00FFCC, 0X00FFFF,
0X330000, 0X330033, 0X330066, 0X330099,
0X3300CC, 0X3300FF, 0X333300, 0X333333,
0X333366, 0X333399, 0X3333CC, 0X3333FF,
0X336600, 0X336633, 0X336666, 0X336699,
0X3366CC, 0X3366FF, 0X339900, 0X339933,
0X339966, 0X339999, 0X3399CC, 0X3399FF,
0X33CC00, 0X33CC33, 0X33CC66, 0X33CC99,
0X33CCCC, 0X33CCFF, 0X33FF00, 0X33FF33,
0X33FF66, 0X33FF99, 0X33FFCC, 0X33FFFF,
0X660000, 0X660033, 0X660066, 0X660099,
0X6600CC, 0X6600FF, 0X663300, 0X663333,
0X663366, 0X663399, 0X6633CC, 0X6633FF,
0X666600, 0X666633, 0X666666, 0X666699,
0X6666CC, 0X6666FF, 0X669900, 0X669933,
0X669966, 0X669999, 0X6699CC, 0X6699FF,
0X66CC00, 0X66CC33, 0X66CC66, 0X66CC99,
0X66CCCC, 0X66CCFF, 0X66FF00, 0X66FF33,
0X66FF66, 0X66FF99, 0X66FFCC, 0X66FFFF,
0X990000, 0X990033, 0X990066, 0X990099,
0X9900CC, 0X9900FF, 0X993300, 0X993333,
0X993366, 0X993399, 0X9933CC, 0X9933FF,
0X996600, 0X996633, 0X996666, 0X996699,
0X9966CC, 0X9966FF, 0X999900, 0X999933,
0X999966, 0X999999, 0X9999CC, 0X9999FF,
0X99CC00, 0X99CC33, 0X99CC66, 0X99CC99,
0X99CCCC, 0X99CCFF, 0X99FF00, 0X99FF33,
0X99FF66, 0X99FF99, 0X99FFCC, 0X99FFFF,
0XCC0000, 0XCC0033, 0XCC0066, 0XCC0099,
0XCC00CC, 0XCC00FF, 0XCC3300, 0XCC3333,
0XCC3366, 0XCC3399, 0XCC33CC, 0XCC33FF,
0XCC6600, 0XCC6633, 0XCC6666, 0XCC6699,
0XCC66CC, 0XCC66FF, 0XCC9900, 0XCC9933,
0XCC9966, 0XCC9999, 0XCC99CC, 0XCC99FF,
0XCCCC00, 0XCCCC33, 0XCCCC66, 0XCCCC99,
0XCCCCCC, 0XCCCCFF, 0XCCFF00, 0XCCFF33,
0XCCFF66, 0XCCFF99, 0XCCFFCC, 0XCCFFFF,
0XFF0000, 0XFF0033, 0XFF0066, 0XFF0099,
0XFF00CC, 0XFF00FF, 0XFF3300, 0XFF3333,
0XFF3366, 0XFF3399, 0XFF33CC, 0XFF33FF,
0XFF6600, 0XFF6633, 0XFF6666, 0XFF6699,
0XFF66CC, 0XFF66FF, 0XFF9900, 0XFF9933,
0XFF9966, 0XFF9999, 0XFF99CC, 0XFF99FF,
0XFFCC00, 0XFFCC33, 0XFFCC66, 0XFFCC99,
0XFFCCCC, 0XFFCCFF, 0XFFFF00, 0XFFFF33,
0XFFFF66, 0XFFFF99, 0XFFFFCC, 0XFFFFFF};
private Image colorSelector;
private int itemIndex = 0;
private int itemPages = 0;
private int topIndex = 0;
final static int ButtonHeight = 20; //滚动条需要空间的高
private Image cube;
private boolean pageup = false, pagedown = false; //记录用户点击触摸屏时的动作
private int ShowItems = 15;
final static int HorPad = 10;
int VecPad = 25;
final static int LinePad = 1;
final static int CubeHeight = 15;
public ColorSelector() {
this( -1);
}
public ColorSelector(int defaultIndex) {
WINDOW_STATE = OPENING;
if (defaultIndex < 0 || defaultIndex > colors.length - 1) {
itemIndex = 0;
topIndex = 0;
} else {
itemIndex = defaultIndex;
topIndex = itemIndex;
}
//确定当前窗口显示的条目
if (AnyView.readType == 1) { //横屏
ShowItems = (AnyView.ScreenWidth - HorPad - VecPad -
ButtonHeight) / (CubeHeight + LinePad);
} else {
ShowItems = (AnyView.ScreenHeight - HorPad - VecPad -
ButtonHeight) / (CubeHeight + LinePad);
}
//确定标题栏的高
VecPad = AnyView.cf.FontHeight + 10;
this.width = 135 + (HorPad << 1);
this.height = ShowItems * (CubeHeight + LinePad) + VecPad + 10 +
ButtonHeight;
if (AnyView.readType == 1) { //横屏
this.LEFT = (AnyView.ScreenWidth - this.height) >> 1;
this.TOP = (AnyView.ScreenHeight + this.width) >> 1;
} else {
this.LEFT = (AnyView.ScreenWidth - this.width) >> 1;
this.TOP = (AnyView.ScreenHeight - this.height) >> 1;
}
this.LEFT = this.LEFT < 0 ? 0 : this.LEFT;
this.TOP = this.TOP < 0 ? 0 : this.TOP;
int[] c = new int[(width - 9) * CubeHeight];
for (int i = 0; i < c.length; i++) {
c[i] = 0x7FFFFFFF;
}
cube = Image.createRGBImage(c, (width - 9), CubeHeight, true);
c = null;
itemPages = colors.length / ShowItems;
if (colors.length > ShowItems * itemPages) {
itemPages++;
}
refreshList();
}
void refreshList() {
Image img;
colorSelector = Image.createImage(width, height);
Graphics g = colorSelector.getGraphics();
//绘制窗口背景
g.setColor(AnyView.background);
g.fillRect(0, 0, width, height);
g.setColor(AnyView.bordorcolor);
g.drawRect(0, 0, width - 1, height - 1);
g.drawLine(0, VecPad, width, VecPad);
//绘制窗口标题
byte[] t = AnyView.cf.str2bytes(title);
int w = t.length * AnyView.cf.AsciiWidth;
int x = (width - w) >> 1;
AnyView.cf.setColor(0);
img = AnyView.cf.buildImage(title);
g.drawImage(img, x, 5, ANCHOR);
//绘制按钮
g.setColor(AnyView.bordorcolor);
g.drawLine(0, height - ButtonHeight, width, height - ButtonHeight);
g.drawLine(width >> 1, height - ButtonHeight, width >> 1, height);
g.drawLine(width - 5, VecPad + 1, width - 5, height - ButtonHeight);
x = ((width >> 1) - 11) >> 1;
int y = height - ButtonHeight + 7;
g.drawImage(AnyView.UpArrow, x, y, ANCHOR);
x += width >> 1;
g.drawImage(AnyView.DownArrow, x, y, ANCHOR);
int top = VecPad + 5;
int offset = topIndex;
for (int i = 0; i < ShowItems && offset < colors.length; i++) {
g.setColor(colors[offset++]);
g.fillRect(HorPad, top, width - (HorPad << 1), CubeHeight);
top += CubeHeight + LinePad;
}
}
protected Image getWindow() {
Image img = Image.createImage(width, height);
Graphics g = img.getGraphics();
g.drawImage(colorSelector, 0, 0, ANCHOR);
//绘制选择时背景
int off = itemIndex - topIndex;
int y = VecPad + off * (CubeHeight + LinePad) + 5;
g.drawImage(cube, 2, y, ANCHOR);
g.setStrokeStyle(Graphics.DOTTED);
g.setColor(0xffffff);
g.drawRoundRect(2, y, width - 9, CubeHeight, 8, 8);
//绘制滚动条
g.setStrokeStyle(Graphics.SOLID);
g.setColor(AnyView.bordorcolor);
int h = height - VecPad - ButtonHeight - 4;
int x = itemIndex * h / colors.length;
y = (itemIndex + ShowItems) * h / colors.length;
g.drawLine(width - 3, VecPad + 2 + x, width - 3, VecPad + 2 + y);
return img;
}
public int getSelectedIndex() {
return itemIndex;
}
public void destroy() {
colorSelector = null;
}
public boolean bof() {
return (topIndex == 0);
}
public void keyUp() {
itemIndex--;
if (itemIndex < 0) {
itemIndex = 0;
return;
}
if (itemIndex < topIndex) {
topIndex -= ShowItems;
topIndex = topIndex < 0 ? 0 : topIndex;
refreshList();
}
}
public void keyDown() {
itemIndex++;
if (itemIndex == colors.length) { //已到达最后一项
itemIndex = colors.length - 1;
return;
}
if (itemIndex - topIndex == ShowItems) {
topIndex++;
refreshList();
}
}
public void keyLeft() {
if (bof()) {
WINDOW_STATE = CLOSED;
return;
}
if (topIndex == 0) { //向上翻页无效
return;
}
topIndex -= ShowItems;
topIndex = topIndex < 0 ? 0 : topIndex;
itemIndex = topIndex;
refreshList();
}
public void keyRight() {
if (topIndex + ShowItems >= colors.length) { //翻页无效
return;
}
topIndex += ShowItems;
if (topIndex + ShowItems > colors.length) { //到顶了
topIndex = colors.length - ShowItems;
}
itemIndex = topIndex;
refreshList();
}
public void keyFire() {
WINDOW_STATE = CLOSED;
}
protected void pointerPressed(int x, int y) {
super.pointerPressed(x, y);
if (!contains(PRESSED_X, PRESSED_Y)) {
//WINDOW_STATE = CLOSED;
return;
}
//首先检查是不是翻页
pageup = false;
pagedown = false;
int top = height - ButtonHeight;
if (PRESSED_Y > top && PRESSED_Y < height) { //在翻页按钮的Y轴范围内
if (PRESSED_X > width >> 1) { //向下翻
pagedown = true;
} else if (PRESSED_X > 0) { //向上翻
pageup = true;
}
}
//判断用户当前的选择项
int find = -1;
for (int i = 0; i < ShowItems && find == -1; i++) {
top = VecPad + i * (CubeHeight + LinePad) - 1;
if (PRESSED_Y > top && PRESSED_Y < top + CubeHeight) {
find = topIndex + i;
itemIndex = topIndex + i;
//System.out.println("pressed: itemIndex = " + itemIndex);
}
}
}
protected void pointerDragged(int x, int y) {
}
protected void pointerReleased(int x, int y) {
TOUCH_EVENT = false;
super.pointerReleased(x, y);
if (!contains(RELEASE_X, RELEASE_Y) && !contains(PRESSED_X, PRESSED_Y)) {
WINDOW_STATE = CLOSED;
return;
}
//首先检查是不是翻页
int top = height - ButtonHeight;
if (RELEASE_Y > top && RELEASE_Y < height) { //在翻页按钮的Y轴范围内
if (RELEASE_X > width >> 1) { //向下翻
if (!pagedown) { //按下时的动作并不是向下翻页
return;
}
if (topIndex + ShowItems >= colors.length) { //翻页无效
return;
}
topIndex += ShowItems;
if (topIndex + ShowItems > colors.length) { //到顶了
topIndex = colors.length - ShowItems;
}
itemIndex = topIndex;
refreshList();
} else if (RELEASE_X > 0) { //向上翻
if (!pageup) { //按下时的动作并不是向上翻页
return;
}
if (topIndex == 0) { //向上翻页无效
return;
}
topIndex -= ShowItems;
topIndex = topIndex < 0 ? 0 : topIndex;
itemIndex = topIndex;
refreshList();
}
}
//判断用户当前的选择项
int find = -1;
for (int i = 0; i < ShowItems && find == -1; i++) {
top = VecPad + i * (CubeHeight + LinePad) - 1;
if (RELEASE_Y > top && RELEASE_Y < top + CubeHeight) {
find = i + topIndex;
//System.out.println("released: find = " + find);
}
}
if (find == -1) {
return;
}
if (find == itemIndex) { //用户确认选择功能
TOUCH_EVENT = true;
keyFire();
}
else {
itemIndex = find;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -