forked from fanruan/design
4 changed files with 236 additions and 3 deletions
After Width: | Height: | Size: 332 B |
After Width: | Height: | Size: 432 B |
@ -0,0 +1,205 @@ |
|||||||
|
package com.fr.design.style.color; |
||||||
|
|
||||||
|
/** |
||||||
|
* Created by plough on 2016/12/22. |
||||||
|
*/ |
||||||
|
import java.awt.*; |
||||||
|
import java.awt.event.*; |
||||||
|
import java.awt.geom.Ellipse2D; |
||||||
|
import java.awt.image.BufferedImage; |
||||||
|
import javax.swing.*; |
||||||
|
|
||||||
|
/** |
||||||
|
* 取色框 |
||||||
|
*/ |
||||||
|
public class ColorPicker extends JDialog implements ActionListener |
||||||
|
{ |
||||||
|
private Container container = getContentPane(); // 主容器
|
||||||
|
private int setCoordinateX; // 取色框x坐标
|
||||||
|
private int setCoordinateY; // 取色框y坐标
|
||||||
|
private int colorPickerSize = 190; // 取色框尺寸
|
||||||
|
private int scaleFactor = 16; // 放大倍数
|
||||||
|
private ColorPickerPanel colorPickerPanel = new ColorPickerPanel(scaleFactor); // 取色框内容面板
|
||||||
|
|
||||||
|
private Timer timer; // 用于定时重绘
|
||||||
|
private int FPS = 45; // 重绘取色器的频率
|
||||||
|
|
||||||
|
private ColorSelectable colorSelectable; |
||||||
|
private Point mousePos; // 鼠标的绝对坐标
|
||||||
|
private Color colorToSet; // 暂存要设置的颜色值
|
||||||
|
|
||||||
|
/** |
||||||
|
* 构造函数,创建一个取色框窗体 |
||||||
|
*/ |
||||||
|
public ColorPicker(ColorSelectable colorSelectable) |
||||||
|
{ |
||||||
|
setUndecorated(true); // 去掉窗体边缘
|
||||||
|
setResizable(false); |
||||||
|
Shape shape = new Ellipse2D.Double(0, 0, colorPickerSize, colorPickerSize); |
||||||
|
setShape(shape); |
||||||
|
container.add(colorPickerPanel); |
||||||
|
addMouseListener(new MouseFunctions()); |
||||||
|
addMouseMotionListener(new MouseMotionFunctions()); |
||||||
|
updateSize(colorPickerSize); |
||||||
|
this.colorSelectable = colorSelectable; |
||||||
|
this.setAlwaysOnTop(true); |
||||||
|
this.setVisible(true); |
||||||
|
this.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE); |
||||||
|
} |
||||||
|
|
||||||
|
public void start() { |
||||||
|
timer = new Timer(1000/FPS, this); |
||||||
|
timer.start(); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 执行Timer要执行的部分, |
||||||
|
*/ |
||||||
|
@Override |
||||||
|
public void actionPerformed(ActionEvent e) { |
||||||
|
updateLocation(); |
||||||
|
colorToSet = colorPickerPanel.getPixelColor(mousePos); |
||||||
|
} |
||||||
|
|
||||||
|
public void updateLocation() { |
||||||
|
mousePos = MouseInfo.getPointerInfo().getLocation(); |
||||||
|
setCoordinateX = mousePos.x - getSize().width/2; |
||||||
|
setCoordinateY = mousePos.y- getSize().height/2; |
||||||
|
colorPickerPanel.setMagnifierLocation(setCoordinateX, |
||||||
|
setCoordinateY); |
||||||
|
setLocation(setCoordinateX, setCoordinateY); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 更新窗体 |
||||||
|
* |
||||||
|
* @param colorPickerSize 取色框尺寸 |
||||||
|
*/ |
||||||
|
public void updateSize(int colorPickerSize) |
||||||
|
{ |
||||||
|
colorPickerPanel.setColorPickerSize(colorPickerSize); |
||||||
|
setSize(colorPickerSize, colorPickerSize); |
||||||
|
validate(); // 更新所有子控件
|
||||||
|
} |
||||||
|
|
||||||
|
public void pickComplete() { |
||||||
|
timer.stop(); |
||||||
|
colorSelectable.setColor(colorToSet); |
||||||
|
this.dispose(); |
||||||
|
} |
||||||
|
|
||||||
|
// 隐藏鼠标光标
|
||||||
|
public void hideCursor() { |
||||||
|
Image imageCursor = Toolkit.getDefaultToolkit().getImage(""); |
||||||
|
// Image img = new BufferedImage()
|
||||||
|
Cursor cu = Toolkit.getDefaultToolkit().createCustomCursor(imageCursor, new Point(0,0), "cursor"); |
||||||
|
// setCursor(Toolkit.getDefaultToolkit().createCustomCursor(
|
||||||
|
// imageCursor, new Point(16, 16), "stick"));
|
||||||
|
setCursor(cu); |
||||||
|
} |
||||||
|
|
||||||
|
private class MouseFunctions extends MouseAdapter |
||||||
|
{ |
||||||
|
public void mousePressed(MouseEvent e) |
||||||
|
{ |
||||||
|
pickComplete(); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
private class MouseMotionFunctions extends MouseMotionAdapter |
||||||
|
{ |
||||||
|
// public void mouseMoved(MouseEvent e) {
|
||||||
|
// hideCursor();
|
||||||
|
// }
|
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
class ColorPickerPanel extends JPanel |
||||||
|
{ |
||||||
|
private BufferedImage screenImage; |
||||||
|
private int colorPickerSize; // 取色框尺寸
|
||||||
|
private int locationX; // 取色框 x 坐标
|
||||||
|
private int locationY; // 取色框 y 坐标
|
||||||
|
private int scaleFactor; // 放大倍数
|
||||||
|
private Robot robot; |
||||||
|
|
||||||
|
/** |
||||||
|
* 带参数的构造函数 |
||||||
|
* @param scaleFactor 放大倍数 |
||||||
|
*/ |
||||||
|
public ColorPickerPanel(int scaleFactor) |
||||||
|
{ |
||||||
|
try |
||||||
|
{ |
||||||
|
robot = new Robot(); |
||||||
|
} |
||||||
|
catch (AWTException e) |
||||||
|
{ |
||||||
|
} |
||||||
|
// 截屏幕
|
||||||
|
screenImage = robot.createScreenCapture(new Rectangle(0, 0, Toolkit |
||||||
|
.getDefaultToolkit().getScreenSize().width, Toolkit |
||||||
|
.getDefaultToolkit().getScreenSize().height)); |
||||||
|
this.scaleFactor = scaleFactor; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 设置取色框的位置 |
||||||
|
* @param locationX x坐标 |
||||||
|
* @param locationY y坐标 |
||||||
|
*/ |
||||||
|
public void setMagnifierLocation(int locationX, int locationY) |
||||||
|
{ |
||||||
|
this.locationX = locationX; |
||||||
|
this.locationY = locationY; |
||||||
|
repaint(); // 注意重画控件
|
||||||
|
} |
||||||
|
|
||||||
|
public Color getPixelColor(Point mousePos) { |
||||||
|
int rgb = screenImage.getRGB(mousePos.x, mousePos.y); |
||||||
|
int R = (rgb & 0xff0000) >> 16; |
||||||
|
int G = (rgb & 0xff00) >> 8; |
||||||
|
int B = (rgb & 0xff); |
||||||
|
return new Color(R, G, B); |
||||||
|
} |
||||||
|
|
||||||
|
public void setColorPickerSize(int colorPickerSize) |
||||||
|
{ |
||||||
|
this.colorPickerSize = colorPickerSize; |
||||||
|
} |
||||||
|
|
||||||
|
public void paintComponent(Graphics g) |
||||||
|
{ |
||||||
|
Graphics2D g2d = (Graphics2D) g; |
||||||
|
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON); |
||||||
|
double pixelCount = (double)colorPickerSize / scaleFactor; // 取色器一条边上的放大后的像素点个数(可以是小数)
|
||||||
|
// 关键处理代码
|
||||||
|
g2d.drawImage( |
||||||
|
screenImage, // 要画的图片
|
||||||
|
0, // 目标矩形的第一个角的x坐标
|
||||||
|
0, // 目标矩形的第一个角的y坐标
|
||||||
|
colorPickerSize, // 目标矩形的第二个角的x坐标
|
||||||
|
colorPickerSize, // 目标矩形的第二个角的y坐标
|
||||||
|
locationX + (int)((colorPickerSize - pixelCount) * 0.5) + 1, // 源矩形的第一个角的x坐标
|
||||||
|
locationY + (int)((colorPickerSize - pixelCount) * 0.5) + 1, // 源矩形的第一个角的y坐标
|
||||||
|
locationX + (int)((colorPickerSize + pixelCount) * 0.5) + 1, // 源矩形的第二个角的x坐标
|
||||||
|
locationY + (int)((colorPickerSize + pixelCount) * 0.5) + 1, // 源矩形的第二个角的y坐标
|
||||||
|
this |
||||||
|
); |
||||||
|
|
||||||
|
g2d.setColor(Color.black); |
||||||
|
g2d.drawOval(0, 0, 190, 190); |
||||||
|
g2d.setColor(Color.white); |
||||||
|
g2d.drawOval(1, 1, 188, 188); |
||||||
|
g2d.drawOval(2, 2, 186, 186); |
||||||
|
g2d.setColor(Color.black); |
||||||
|
g2d.drawOval(3, 3, 184, 184); |
||||||
|
|
||||||
|
g2d.setColor(Color.white); |
||||||
|
g2d.drawRect(86, 86, 18, 18); |
||||||
|
g2d.setColor(Color.black); |
||||||
|
g2d.drawRect(87, 87, 16, 16); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
} |
Loading…
Reference in new issue