⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 colorchooser.java

📁 一个非常全面的手机性能测试项目
💻 JAVA
字号:
/* * @(#)ColorChooser.java	1.12 01/08/21 * Copyright (c) 2000-2001 Sun Microsystems, Inc. All Rights Reserved. * * This software is the confidential and proprietary information of Sun * Microsystems, Inc. ("Confidential Information").  You shall not * disclose such Confidential Information and shall use it only in * accordance with the terms of the license agreement you entered into * with Sun. * * SUN MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF THE * SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR * PURPOSE, OR NON-INFRINGEMENT. SUN SHALL NOT BE LIABLE FOR ANY DAMAGES * SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR DISTRIBUTING * THIS SOFTWARE OR ITS DERIVATIVES. */package example.chooser;import javax.microedition.midlet.*;import javax.microedition.lcdui.*;/** * A Color chooser.  This screen can be used to display and * choose colors.  The current color is always available * via the getColor and getGrayScale methods.  It can be * set with setColor. * A palette provides some reuse of colors, the current * index in the palette can get set and retrieved. * When the chooser is active the user may set the index * in the palette, and change the red, green, and blue * components.   * The application using the chooser must add commands * to the chooser as appropriate to terminate selection * and to change to other screens. * The chooser adapts to the available screen size * and font sizes. */public class ColorChooser extends Canvas {    private int width, height;	// Width and height of canvas    private Font font;    private int label_w;	// width of "999"    private int label_h;	// height of "999"    private int gray;    private int rgbColor;    private int radix = 10;	// radix to display numbers (10 or 16)    private int delta = 0x20;	// default increment/decrement    private int ndx = 0;	// 0 == blue, 1 == green, 2 == red    private boolean isColor;    private int numColors;    private int pndx;    private int[] palette = {0xffff00,		     0x00ffff, 0xff00ff, 0xffff00,		     0xc00000, 0x00c000, 0x0000c0,		     0x80ffff, 0xff80ff, 0xffff80};		             public ColorChooser(boolean isColor, int numColors) {	this.isColor = isColor;	this.numColors = numColors;	ndx = 0;	pndx = 0;	setColor(palette[pndx]);	width = getWidth();	height = getHeight();	font = Font.getDefaultFont();	label_h = font.getHeight();	if (label_h > (height / 6)) {	    font = Font.getFont(Font.FACE_SYSTEM,				Font.STYLE_PLAIN,				Font.SIZE_SMALL);	    label_h = font.getHeight();	}	label_w = font.stringWidth("999");    }    /**     * Select which entry in the Palette to use for the current color.     * @param index index into the palette; 0..10.     */    public boolean setPaletteIndex(int index) {	if (index >= palette.length)	    return false;	pndx = index;	setColor(palette[index]);	return true;    }    /**     * Get the current palette index.     * @return the current index in the palette.     */    public int getPaletteIndex() {	return ndx;    }    /**     * Sets the current color to the specified RGB values.     * @param red The red component of the color being set in range 0-255.     * @param green The green component of the color being set in range 0-255.     * @param blue The blue component of the color being set in range 0-255.     */    public void setColor(int red, int green, int blue) {	red   = (red   < 0) ? 0 : (red   & 0xff);	green = (green < 0) ? 0 : (green & 0xff);	blue  = (blue  < 0) ? 0 : (blue  & 0xff);	setColor((red << 16) | (green << 8) | blue);    }    /**     * Sets the current color to the specified RGB values. All subsequent     * rendering operations will use this specified color. The RGB value     * passed in is interpreted with the least significant eight bits     * giving the blue component, the next eight more significant bits     * giving the green component, and the next eight more significant     * bits giving the red component. That is to say, the color component     * is specified like 0x00RRGGBB.     * @param RGB The color being set.     */    public void setColor(int RGB) {	rgbColor = RGB & 0x00ffffff;	palette[pndx] = rgbColor;	updateGray();    }    /*     * Compute the gray value from the RGB value.     */    private void updateGray() {	/*	 * REMIND: change this, if the spec allows it	 *	 * Gray is the value according to HSV.  I think it would	 * make more sense to use NTSC gray, but that's not what	 * is currently in the spec.   -- rib 20 Mar 2000	 */	gray = Math.max((rgbColor >> 16) & 0xff,			Math.max((rgbColor >> 8) & 0xff, rgbColor & 0xff));    }    /**     * Gets the current color.     * @return an integer in form 0x00RRGGBB     * @see #setColor(int, int, int)     */    public int getColor() {        return rgbColor;    }    /**      * Gets the red component of the current color.	     * @return integer value in range 0-255     * @see #setColor(int, int, int)     */    public int getRedComponent() {        return (rgbColor >> 16) & 0xff;    }    /**      * Gets the green component of the current color.     * @return integer value in range 0-255     * @see #setColor(int, int, int)     */    public int getGreenComponent() {        return (rgbColor >> 8) & 0xff;    }    /**     * Gets the blue component of the current color.     * @return integer value in range 0-255     * @see #setColor(int, int, int)     */    public int getBlueComponent() {        return rgbColor & 0xff;    }    /*     * Get the current grayscale value.     */    public int getGrayScale() {	return gray;    }    /**     * Sets the current grayscale.     * For color the value is used to set each component.     * @param the value in range 0-255     */    public void setGrayScale(int value) {        setColor(value, value, value);    }    /**     * The canvas is being displayed.  Compute the      * relative placement of items the depend on the screen size.     */    protected void showNotify() {    }    /*     * Paint the canvas with the current color and controls to change it.     */    protected void paint(Graphics g) {	if (isColor) {	    colorPaint(g);	} else {	    grayPaint(g);	}    }    /**     * Set the radix used to display numbers.     * The default is decimal (10).     */    public void setRadix(int rad) {	if (rad != 10 && rad != 16) {	    throw new IllegalArgumentException();	}	radix = rad;    }    /**     * Get the radix used to display numbers.     */    public int getRadix() {	return radix;    }    /**     * Set the delta used to increment/decrement.     * The default is 32.     */    public void setDelta(int delta) {	if (delta > 0 && delta <= 128) {	    this.delta = delta;	}    }    /**     * Get the delta used to increment/decrement.     */    public int getDelta() {	return delta;    }    /*     * Use Integer toString to convert.     * padding may be required.     */    private String format(int num) {	String s = Integer.toString(num, radix);	if (radix == 10 || s.length() >= 2)	    return s;	return "0" + 2;    }    static final int BORDER = 2;    private void colorPaint(Graphics g) {	// Scale palette cells to fit 10 across	int p_w = width / palette.length;	int p_h = (height - (BORDER*3)) / 4;	int usable_w = p_w * palette.length;	int sample_w = p_w * palette.length - 1;	int sample_h = p_h;	int sample_x = (width - usable_w) / 2;	int sample_y = 0;	int p_x = sample_x;	int p_y = sample_y + sample_h + 4;	// Fill the background	g.setColor(0xffffff);	g.fillRect(0, 0, width, height);	// Fill in the color sample	g.setColor(rgbColor);	gray = g.getGrayScale();	g.fillRect(sample_x, sample_y, sample_w, sample_h);	g.setColor((ndx < 0) ? 0x000000 : 0x808080);	g.drawRect(sample_x, sample_y, sample_w-1, sample_h-1);	// Draw the palette	for (int i = 0; i < palette.length; i++) {	    g.setColor(palette[i]);	    int shift = ((i == pndx) ? BORDER*2 : 0);	    g.fillRect(p_x + i*p_w, p_y-shift, p_w-1, p_h);	    // If the palette is selected, outline it	    if (i == pndx) {		g.setColor((ndx < 0) ? 0x000000 : 0x808080);		g.drawRect(p_x + i*p_w, p_y-shift-1, p_w-2, p_h+1);	    }	}	int bars_x = sample_x;	int bars_y = p_y + p_h + BORDER;	int bar_h = label_h + BORDER;	int bar_w = usable_w - label_w - BORDER;	int b_x = label_w + BORDER;	int b_y = bars_y + BORDER;	int g_y = b_y + bar_h;	int r_y = g_y + bar_h;	// Draw the colorbars	g.setColor(0, 0, 255);	int b_w = (bar_w * getBlueComponent()) / 255;	g.fillRect(b_x, b_y, b_w, bar_h - BORDER);	g.setColor((ndx == 0) ? 0x000000 : 0xa0ffa0);	g.drawRect(b_x, b_y, bar_w - 1, bar_h - BORDER - 1);	int g_w = (bar_w * getGreenComponent()) / 255;	g.setColor(0, 255, 0);	g.fillRect(b_x, g_y, g_w, bar_h - BORDER);	g.setColor((ndx == 1) ? 0x000000 : 0xa0ffa0);	g.drawRect(b_x, g_y, bar_w - 1, bar_h - BORDER - 1);	int r_w = (bar_w * getRedComponent()) / 255;	g.setColor(255, 0, 0);	g.fillRect(b_x, r_y, r_w, bar_h - BORDER);	g.setColor((ndx == 2) ? 0x000000 : 0xffa0a0);	g.drawRect(b_x, r_y, bar_w - 1, bar_h - BORDER - 1);	g.setFont(font);	g.setColor(0, 0, 0);	g.drawString(format(getBlueComponent()), 		     label_w, b_y+bar_h,  Graphics.BOTTOM|Graphics.RIGHT);	g.drawString(format(getGreenComponent()),		     label_w, g_y+bar_h,  Graphics.BOTTOM|Graphics.RIGHT);	g.drawString(format(getRedComponent()),		     label_w, r_y+bar_h,  Graphics.BOTTOM|Graphics.RIGHT);    }    private void grayPaint(Graphics g) {	int sample_w = width;	int sample_h = height / 2;	int g_y = height / 2;	int g_w = width - (label_w + BORDER);	int g_h = label_h + BORDER;	// Fill the background	g.setGrayScale(0xff);	g.fillRect(0, 0, width, height);	// Fill in the gray sample	g.setGrayScale(gray);	g.fillRect(0, 0, sample_w, sample_h);	g.setGrayScale(0);	g.drawRect(0, 0, sample_w-1, sample_h-1);	// Fill in the gray bar	g.setGrayScale(0);	g.fillRect(label_w+BORDER, g_y + BORDER, (g_w * gray) / 255, g_h);	g.drawRect(label_w+BORDER, g_y + BORDER, g_w-1, g_h-1);	g.drawString(format(gray), label_w,		     g_y+BORDER + g_h,  Graphics.BOTTOM|Graphics.RIGHT);    }    /*     * Handle repeat as in pressed.     */    public void keyRepeated(int key) {	keyPressed(key);    }    /*     * Left and Right are used to change which color bar to change     * Up and Down are used to increase/decrease the value of that bar.     */    protected void keyPressed(int key) {	int action = getGameAction(key);	int dir = 0;	switch (action) {	case RIGHT: dir += 1; break;	case LEFT: dir -= 1; break;	case UP: ndx -= 1; break;	case DOWN: ndx += 1; break;	default:	    return;		// nothing we recognize, exit	}		// Gray scale event handling is simpler than color	if (isColor) {	    // Limit selection to r,g,b and palette 	    if (ndx < -1)		ndx = -1;	    if (ndx > 2)		ndx = 2;	    if (ndx >= 0) {		int v = (rgbColor >> (ndx*8)) & 0xff;		v += dir * delta;		if (v < 0)		    v = 0;		if (v > 255)		    v = 255;		int mask = 0xff << (ndx*8);		rgbColor = (rgbColor & ~mask) | v << (ndx*8);		palette[pndx] = rgbColor;	    } else {		pndx += dir;		if (pndx < 0)		    pndx = 0;		if (pndx >= palette.length)		    pndx = palette.length-1;		rgbColor = palette[pndx];	    }	} else {	    /*	     * Gray scale; multiple dir and add to gray	     * ignore (up/down) there is only one thing to select.	     */	    gray += dir * delta;	    if (gray < 0)		gray = 0;	    if (gray > 255)		gray = 255;	}	repaint();    }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -