Browse Source

REPORT-1096 实现第一个界面(下拉颜色选择框)里的取色器功能

master
plough 8 years ago
parent
commit
85a6a6076d
  1. BIN
      designer_base/src/com/fr/design/images/gui/colorSelectPane/colorPicker.png
  2. BIN
      designer_base/src/com/fr/design/images/gui/colorSelectPane/colorPickerCustom.png
  3. 205
      designer_base/src/com/fr/design/style/color/ColorPicker.java
  4. 34
      designer_base/src/com/fr/design/style/color/NewColorSelectPane.java

BIN
designer_base/src/com/fr/design/images/gui/colorSelectPane/colorPicker.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 332 B

BIN
designer_base/src/com/fr/design/images/gui/colorSelectPane/colorPickerCustom.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 432 B

205
designer_base/src/com/fr/design/style/color/ColorPicker.java

@ -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);
}
}

34
designer_base/src/com/fr/design/style/color/NewColorSelectPane.java

@ -17,6 +17,7 @@ import javax.swing.JPanel;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import com.fr.base.BaseUtils;
import com.fr.design.constants.UIConstants;
import com.fr.design.border.UIRoundedBorder;
import com.fr.design.gui.ibutton.UIButton;
@ -78,10 +79,29 @@ public class NewColorSelectPane extends BasicPane implements ColorSelectable {
// center
JPanel centerPane = FRGUIPaneFactory.createY_AXISBoxInnerContainer_S_Pane();
this.add(centerPane, BorderLayout.CENTER);
// 第一行,1个取色按钮 + 7个最近使用的颜色
JPanel row1Pane = new JPanel(FRGUIPaneFactory.createBorderLayout());
row1Pane.setBorder(BorderFactory.createEmptyBorder(8, 8, 0, 0));
row1Pane.setPreferredSize(new Dimension(135, 16)); // 宽度为 16 * 8 + 7
centerPane.add(row1Pane);
// 取色按钮
UIButton pickColorButton = new UIButton(BaseUtils.readIcon("/com/fr/design/images/gui/colorSelectPane/colorPicker.png"));
pickColorButton.setPreferredSize(new Dimension(16, 16));
pickColorButton.setCursor(new Cursor(Cursor.HAND_CURSOR));
pickColorButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
doPickColor();
}
});
row1Pane.add(pickColorButton, BorderLayout.WEST);
// 最近使用
usedColorPane = new UsedColorPane(1, 8, ColorSelectConfigManager.getInstance().getColors(),this);
centerPane.add(usedColorPane.getPane());
usedColorPane = new UsedColorPane(1, 7, ColorSelectConfigManager.getInstance().getColors(),this);
usedColorPane.getPane().setBorder(BorderFactory.createEmptyBorder(0, 1, 0, 8));
row1Pane.add(usedColorPane.getPane());
JPanel menuColorPane1 = new JPanel();
centerPane.add(menuColorPane1);
@ -204,4 +224,12 @@ public class NewColorSelectPane extends BasicPane implements ColorSelectable {
usedColorPane.updateUsedColor();
}
/**
* 打开取色框开始取色
*/
public void doPickColor() {
ColorPicker colorPicker = new ColorPicker(this);
colorPicker.start();
}
}
Loading…
Cancel
Save