📄 imagemap.java
字号:
* The graphical highlight is achieved using the ButtonFilter. */ public void highlight(Graphics g, boolean on) { if (on) { setHighlight(pressed ? downImage : upImage); } super.highlight(g, on); showStatus((on && anchor != null) ? "Go To " + anchor.toExternalForm() : null); } /** * Since the highlight changes when the button is pressed, we need * to record the "pressed" state and induce a repaint. */ public void press() { parent.repaint(); pressed = true; } /** * The new URL is fetched when the user releases the mouse button * only if they are still in the area. */ public void lift(int x, int y) { pressed = false; parent.repaint(); if (inside(x, y) && anchor != null) { showDocument(anchor); } }}/** * An improved, round, "Fetch a URL" ImageArea class. * This class extends the HrefButtonArea Class to make the 3D button * a rounded ellipse. All of the same feedback and operational * charactistics as the HrefButtonArea apply. * * @author Jim Graham * @version %I%, %G% */class RoundHrefButtonArea extends HrefButtonArea { public void makeImages() { upImage = parent.getHighlight(X, Y, W, H, new RoundButtonFilter(false, parent.hlpercent, border, W, H)); downImage = parent.getHighlight(X, Y, W, H, new RoundButtonFilter(true, parent.hlpercent, border, W, H)); }}class HighlightFilter extends RGBImageFilter { boolean brighter; int percent; public HighlightFilter(boolean b, int p) { brighter = b; percent = p; canFilterIndexColorModel = true; } public int filterRGB(int x, int y, int rgb) { int r = (rgb >> 16) & 0xff; int g = (rgb >> 8) & 0xff; int b = (rgb >> 0) & 0xff; if (brighter) { r = (255 - ((255 - r) * (100 - percent) / 100)); g = (255 - ((255 - g) * (100 - percent) / 100)); b = (255 - ((255 - b) * (100 - percent) / 100)); } else { r = (r * (100 - percent) / 100); g = (g * (100 - percent) / 100); b = (b * (100 - percent) / 100); } if (r < 0) r = 0; if (r > 255) r = 255; if (g < 0) g = 0; if (g > 255) g = 255; if (b < 0) b = 0; if (b > 255) b = 255; return (rgb & 0xff000000) | (r << 16) | (g << 8) | (b << 0); }}class ButtonFilter extends RGBImageFilter { boolean pressed; int defpercent; int border; int width; int height; ColorModel models[] = new ColorModel[7]; ColorModel origbuttonmodel; public ButtonFilter(boolean press, int p, int b, int w, int h) { pressed = press; defpercent = p; border = b; width = w; height = h; } public void setHints(int hints) { super.setHints(hints & (~ImageConsumer.COMPLETESCANLINES)); } public void setColorModel(ColorModel model) { if (model instanceof IndexColorModel && true) { IndexColorModel icm = (IndexColorModel) model; models[0] = filterIndexColorModel(icm, false, false, 0); models[1] = filterIndexColorModel(icm, true, !pressed, defpercent); models[2] = null; if (pressed) { models[3] = filterIndexColorModel(icm, true, false, defpercent/2); } else { models[3] = models[0]; } models[4] = null; models[5] = filterIndexColorModel(icm, true, pressed, defpercent); models[6] = models[0]; origbuttonmodel = model; consumer.setColorModel(models[3]); } else { super.setColorModel(model); } } public IndexColorModel filterIndexColorModel(IndexColorModel icm, boolean opaque, boolean brighter, int percent) { byte r[] = new byte[256]; byte g[] = new byte[256]; byte b[] = new byte[256]; byte a[] = new byte[256]; int mapsize = icm.getMapSize(); icm.getReds(r); icm.getGreens(g); icm.getBlues(b); if (opaque) { icm.getAlphas(a); for (int i = 0; i < mapsize; i++) { int rgb = filterRGB(icm.getRGB(i), brighter, percent); a[i] = (byte) (rgb >> 24); r[i] = (byte) (rgb >> 16); g[i] = (byte) (rgb >> 8); b[i] = (byte) (rgb >> 0); } } return new IndexColorModel(icm.getPixelSize(), mapsize, r, g, b, a); } /** * Define the ranges of varying highlight for the button. * ranges is an array of 8 values which split up a scanline into * 7 different regions of highlighting effect: * * ranges[0-1] = area outside of left edge of button * ranges[1-2] = area inside UpperLeft highlight region left of center * ranges[2-3] = area requiring custom highlighting left of center * ranges[3-4] = area inside center of button * ranges[4-5] = area requiring custom highlighting right of center * ranges[5-6] = area inside LowerRight highlight region right of center * ranges[6-7] = area outside of right edge of button * * Note that ranges[0-1] and ranges[6-7] are empty where the edges of * the button touch the left and right edges of the image (everywhere * on a square button) and ranges[2-3] and ranges[4-5] are only nonempty * in those regions where the UpperLeft highlighting has leaked over * the "top" of the button onto parts of its right edge or where the * LowerRight highlighting has leaked under the "bottom" of the button * onto parts of its left edge (can't happen on square buttons, happens * occasionally on round buttons). */ public void buttonRanges(int y, int ranges[]) { ranges[0] = ranges[1] = 0; if (y < border) { ranges[2] = ranges[3] = ranges[4] = ranges[5] = width - y; } else if (y > height - border) { ranges[2] = ranges[3] = ranges[4] = ranges[5] = height - y; } else { ranges[2] = ranges[3] = border; ranges[4] = ranges[5] = width - border; } ranges[6] = ranges[7] = width; } public void setPixels(int x, int y, int w, int h, ColorModel model, byte pixels[], int off, int scansize) { if (model == origbuttonmodel) { int ranges[] = new int[8]; int x2 = x + w; for (int cy = y; cy < y + h; cy++) { buttonRanges(cy, ranges); for (int i = 0; i < 7; i++) { if (x2 > ranges[i] && x < ranges[i+1]) { int cx1 = Math.max(x, ranges[i]); int cx2 = Math.min(x2, ranges[i+1]); if (models[i] == null) { super.setPixels(cx1, cy, cx2 - cx1, 1, model, pixels, off + (cx1 - x), scansize); } else { if (cx1 < cx2) { consumer.setPixels(cx1, cy, cx2 - cx1, 1, models[i], pixels, off + (cx1 - x), scansize); } } } } off += scansize; } } else { super.setPixels(x, y, w, h, model, pixels, off, scansize); } } public int filterRGB(int x, int y, int rgb) { boolean brighter; int percent; if ((x < border && y < height - x) || (y < border && x < width - y)) { brighter = !pressed; percent = defpercent; } else if (x >= width - border || y >= height - border) { brighter = pressed; percent = defpercent; } else if (pressed) { brighter = false; percent = defpercent / 2; } else { return rgb & 0x00ffffff; } return filterRGB(rgb, brighter, percent); } public int filterRGB(int rgb, boolean brighter, int percent) { int r = (rgb >> 16) & 0xff; int g = (rgb >> 8) & 0xff; int b = (rgb >> 0) & 0xff; if (brighter) { r = (255 - ((255 - r) * (100 - percent) / 100)); g = (255 - ((255 - g) * (100 - percent) / 100)); b = (255 - ((255 - b) * (100 - percent) / 100)); } else { r = (r * (100 - percent) / 100); g = (g * (100 - percent) / 100); b = (b * (100 - percent) / 100); } if (r < 0) r = 0; if (g < 0) g = 0; if (b < 0) b = 0; if (r > 255) r = 255; if (g > 255) g = 255; if (b > 255) b = 255; return (rgb & 0xff000000) | (r << 16) | (g << 8) | (b << 0); }}class RoundButtonFilter extends ButtonFilter { int Xcenter; int Ycenter; int Yradsq; int innerW; int innerH; int Yrad2sq; public RoundButtonFilter(boolean press, int p, int b, int w, int h) { super(press, p, b, w, h); Xcenter = w/2; Ycenter = h/2; Yradsq = h * h / 4; innerW = w - border * 2; innerH = h - border * 2; Yrad2sq = innerH * innerH / 4; } public void buttonRanges(int y, int ranges[]) { int yrel = Math.abs(Ycenter - y); int xrel = (int) (Math.sqrt(Yradsq - yrel * yrel) * width / height); int xslash = width - (y * width / height); ranges[0] = 0; ranges[1] = Xcenter - xrel; ranges[6] = Xcenter + xrel; ranges[7] = width; if (y < border) { ranges[2] = ranges[3] = ranges[4] = Xcenter; ranges[5] = ranges[6]; } else if (y + border >= height) { ranges[2] = ranges[1]; ranges[3] = ranges[4] = ranges[5] = Xcenter; } else { int xrel2 = (int) (Math.sqrt(Yrad2sq - yrel * yrel) * innerW / innerH); ranges[3] = Xcenter - xrel2; ranges[4] = Xcenter + xrel2; if (y < Ycenter) { ranges[2] = ranges[3]; ranges[5] = ranges[6]; } else { ranges[2] = ranges[1]; ranges[5] = ranges[4]; } } } private int savedranges[]; private int savedy; private synchronized int[] getRanges(int y) { if (savedranges == null || savedy != y) { if (savedranges == null) { savedranges = new int[8]; } buttonRanges(y, savedranges); savedy = y; } return savedranges; } public int filterRGB(int x, int y, int rgb) { boolean brighter; int percent; int i; int ranges[] = getRanges(y); for (i = 0; i < 7; i++) { if (x >= ranges[i] && x < ranges[i+1]) { break; } } double angle; switch (i) { default: case 0: case 6: return rgb & 0x00ffffff; case 1: brighter = !pressed; percent = defpercent; break; case 5: brighter = pressed; percent = defpercent; break; case 2: angle = Math.atan2(y - Ycenter, Xcenter - x); percent = defpercent - ((int) (Math.cos(angle) * 2 * defpercent)); if (!pressed) { percent = -percent; } if (percent == 0) { return rgb; } else if (percent < 0) { percent = -percent; brighter = false; } else { brighter = true; } break; case 4: angle = Math.atan2(Ycenter - y, x - Xcenter); percent = defpercent - ((int) (Math.cos(angle) * 2 * defpercent)); if (pressed) { percent = -percent; } if (percent == 0) { return rgb; } else if (percent < 0) { percent = -percent; brighter = false; } else { brighter = true; } break; case 3: if (!pressed) { return rgb & 0x00ffffff; } brighter = false; percent = defpercent; break; } return filterRGB(rgb, brighter, percent); }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -