3
Q
矩形渐变
A
回答
3
你真的不指定你想要什么,但如果是我认为它,那么它有点类似于我在my answer to "How to make gradient border of an image using java?"写道。
这里的技巧是不创建单个渐变颜料,并且不填充单个形状。相反,必须用梯度填充的区域分为8个部分:四个边和四个角。边缘用简单的渐变涂料填充。角落里充满了径向渐变涂料。然后它只是摆弄坐标,但这可以用一种相当通用的方式完成,当内部形状被给出为Rectangle2D
。
然而,结果可能的话,例如,像这样:
import java.awt.Color;
import java.awt.Dimension;
import java.awt.GradientPaint;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.MultipleGradientPaint.CycleMethod;
import java.awt.RadialGradientPaint;
import java.awt.Shape;
import java.awt.geom.Point2D;
import java.awt.geom.Rectangle2D;
import java.awt.geom.RoundRectangle2D;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
public class RectangularGradientTest
{
public static void main(String[] args)
{
SwingUtilities.invokeLater(new Runnable()
{
@Override
public void run()
{
createAndShowGUI();
}
});
}
private static void createAndShowGUI()
{
JFrame f = new JFrame();
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.getContentPane().add(new RectangularGradientTestPanel());
f.pack();
f.setLocationRelativeTo(null);
f.setVisible(true);
}
}
class RectangularGradientTestPanel extends JPanel
{
@Override
protected void paintComponent(Graphics gr)
{
super.paintComponent(gr);
Graphics2D g = (Graphics2D)gr;
Rectangle2D r = new Rectangle2D.Double(100,100,200,100);
draw(g, r, 75);
Shape rr = new RoundRectangle2D.Double(80,80,240,140,20,20);
g.setColor(Color.BLACK);
g.fill(rr);
}
@Override
public Dimension getPreferredSize()
{
if (isPreferredSizeSet())
{
return super.getPreferredSize();
}
return new Dimension(400,300);
}
private static void draw(Graphics2D g, Rectangle2D r, double s)
{
Color c0 = new Color(255,0,0);
Color c1 = new Color(255,0,0,0);
double x0 = r.getMinX();
double y0 = r.getMinY();
double x1 = r.getMaxX();
double y1 = r.getMaxY();
double w = r.getWidth();
double h = r.getHeight();
// Left
g.setPaint(new GradientPaint(
new Point2D.Double(x0, y0), c0,
new Point2D.Double(x0 - s, y0), c1));
g.fill(new Rectangle2D.Double(x0 - s, y0, s, h));
// Right
g.setPaint(new GradientPaint(
new Point2D.Double(x1, y0), c0,
new Point2D.Double(x1 + s, y0), c1));
g.fill(new Rectangle2D.Double(x1, y0, s, h));
// Top
g.setPaint(new GradientPaint(
new Point2D.Double(x0, y0), c0,
new Point2D.Double(x0, y0 - s), c1));
g.fill(new Rectangle2D.Double(x0, y0 - s, w, s));
// Bottom
g.setPaint(new GradientPaint(
new Point2D.Double(x0, y1), c0,
new Point2D.Double(x0, y1 + s), c1));
g.fill(new Rectangle2D.Double(x0, y1, w, s));
float fractions[] = new float[] { 0.0f, 1.0f };
Color colors[] = new Color[] { c0, c1 };
// Top Left
g.setPaint(new RadialGradientPaint(
new Rectangle2D.Double(x0 - s, y0 - s, s + s, s + s),
fractions, colors, CycleMethod.NO_CYCLE));
g.fill(new Rectangle2D.Double(x0 - s, y0 - s, s, s));
// Top Right
g.setPaint(new RadialGradientPaint(
new Rectangle2D.Double(x1 - s, y0 - s, s + s, s + s),
fractions, colors, CycleMethod.NO_CYCLE));
g.fill(new Rectangle2D.Double(x1, y0 - s, s, s));
// Bottom Left
g.setPaint(new RadialGradientPaint(
new Rectangle2D.Double(x0 - s, y1 - s, s + s, s + s),
fractions, colors, CycleMethod.NO_CYCLE));
g.fill(new Rectangle2D.Double(x0 - s, y1, s, s));
// Bottom Right
g.setPaint(new RadialGradientPaint(
new Rectangle2D.Double(x1 - s, y1 - s, s + s, s + s),
fractions, colors, CycleMethod.NO_CYCLE));
g.fill(new Rectangle2D.Double(x1, y1, s, s));
}
}
相关问题
- 1. 渐变色圆形矩形
- 2. 矩形渐变填充
- 3. Android矩形背景渐变
- 4. 矩形的OpenGL渐变不起作用
- 5. Android的矩形渐变centerX不工作
- 6. 在几个矩形上跨度渐变
- 7. 放射渐变的圆角矩形
- 8. 具有圆形矩形路径的水平渐变?
- 9. 将鼠标悬停在标签改变矩形背景渐变
- 10. Python成像库(PIL)绘图 - 带有渐变的圆角矩形
- 11. 画布绘制用线性渐变填充圆角矩形
- 12. 如何创建从左到右具有渐变的矩形
- 13. 如何在PHP中绘制渐变矩形?
- 14. 石英:无法创建带渐变填充的圆角矩形
- 15. 使用HTML5画布元素的矩形渐变
- 16. 数据绑定WPF矩形渐变填充
- 17. 移动一个具有渐变填充的矩形
- 18. 两点之间的矩形对角线渐变画笔
- 19. 如何制作一个三角形渐变的Matlab矩阵?
- 20. 绘制渐变矩形的有效方法
- 21. 渐变平行四边形
- 22. Google maps api圆形渐变?
- 23. GDIPlus渐变沿圆形GraphicsPath
- 24. 渐变笔画形状
- 25. 椭圆形背景渐变
- 26. Highcharts扇形线性渐变
- 27. 圆形渐变 - TeeChart - MonoAndroid
- 28. 圆形渐变和WPF
- 29. 渐变facecolor matplotlib条形图
- 30. CSS3中的圆形渐变
你试过开始红则逐渐淡出为白色? –
我见过的唯一渐变线是线性的或放射状的,但我从来没有见过一种以矩形外形的,所以我不完全确定如何做到这一点。 – Kyranstar
您可以随时创建自己的Paint派生类。如果这是您想要选择的路径,那么请查看Java的Paint,GradientPaint以及类似的类和接口的源代码。 –