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. Android矩形背景漸變
- 3. 矩形漸變填充
- 4. 放射漸變的圓角矩形
- 5. 在幾個矩形上跨度漸變
- 6. 矩形的OpenGL漸變不起作用
- 7. Android的矩形漸變centerX不工作
- 8. 具有圓形矩形路徑的水平漸變?
- 9. 將鼠標懸停在標籤改變矩形背景漸變
- 10. 移動一個具有漸變填充的矩形
- 11. 如何創建從左到右具有漸變的矩形
- 12. 石英:無法創建帶漸變填充的圓角矩形
- 13. 使用HTML5畫布元素的矩形漸變
- 14. 如何製作一個三角形漸變的Matlab矩陣?
- 15. 畫布繪製用線性漸變填充圓角矩形
- 16. 繪製漸變矩形的有效方法
- 17. 兩點之間的矩形對角線漸變畫筆
- 18. 如何在PHP中繪製漸變矩形?
- 19. 數據綁定WPF矩形漸變填充
- 20. Python成像庫(PIL)繪圖 - 帶有漸變的圓角矩形
- 21. 漸變平行四邊形
- 22. Google maps api圓形漸變?
- 23. GDIPlus漸變沿圓形GraphicsPath
- 24. 圓形漸變 - TeeChart - MonoAndroid
- 25. 橢圓形背景漸變
- 26. 漸變筆畫形狀
- 27. Highcharts扇形線性漸變
- 28. 漸變facecolor matplotlib條形圖
- 29. CSS3中的圓形漸變
- 30. 圓形漸變和WPF
你試過開始紅則逐漸淡出爲白色? –
我見過的唯一漸變線是線性的或放射狀的,但我從來沒有見過一種以矩形外形的,所以我不完全確定如何做到這一點。 – Kyranstar
您可以隨時創建自己的Paint派生類。如果這是您想要選擇的路徑,那麼請查看Java的Paint,GradientPaint以及類似的類和接口的源代碼。 –