<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                # 透明度 > 原文: [https://zetcode.com/gfx/java2d/transparency/](https://zetcode.com/gfx/java2d/transparency/) 在 Java 2D 的這一部分中,我們討論透明性。 我們提供一些基本定義和一些有趣的透明效果。 ## 透明度說明 透明性是指能夠透視材料的質量。 了解透明度的最簡單方法是想象一塊玻璃或水。 從技術上講,光線可以穿過玻璃,這樣我們就可以看到玻璃后面的物體。 在計算機圖形學中,我們可以使用 alpha 合成實現透明效果。 Alpha 合成是將圖像與背景組合以創建部分透明外觀的過程。 合成過程使用 alpha 通道。 Alpha 通道是圖形文件格式的 8 位層,用于表達半透明性(透明度)。 每個像素的額外八位用作掩碼,表示 256 級半透明。 (answers.com,wikipedia.org) `AlphaComposite`類用于 Java 2D 中的透明性。 它實現了基本的 alpha 合成規則,用于合并源像素和目標像素,以實現圖形和圖像的融合和透明效果。 要創建`AlphaComposite`,我們提供兩個值:規則指示符和 alpha 值。 該規則指定了我們如何組合源像素和目標像素。 最常見的是`AlphaComposite.SRC_OVER`。 alpha 值的范圍可以從`0.0f`(完全透明)到`1.0f`(完全不透明)。 ## 透明矩形 第一個示例繪制了十個具有不同透明度級別的矩形。 `TransparentRectanglesEx.java` ```java package com.zetcode; import java.awt.AlphaComposite; import java.awt.Color; import java.awt.EventQueue; import java.awt.Graphics; import java.awt.Graphics2D; import javax.swing.JFrame; import javax.swing.JPanel; class Surface extends JPanel { private void doDrawing(Graphics g) { Graphics2D g2d = (Graphics2D) g.create(); g2d.setPaint(Color.blue); for (int i = 1; i <= 10; i++) { float alpha = i * 0.1f; AlphaComposite alcom = AlphaComposite.getInstance( AlphaComposite.SRC_OVER, alpha); g2d.setComposite(alcom); g2d.fillRect(50 * i, 20, 40, 40); } g2d.dispose(); } @Override public void paintComponent(Graphics g) { super.paintComponent(g); doDrawing(g); } } public class TransparentRectanglesEx extends JFrame { public TransparentRectanglesEx() { initUI(); } private void initUI() { add(new Surface()); setTitle("Transparent rectangles"); setSize(590, 120); setLocationRelativeTo(null); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { @Override public void run() { TransparentRectanglesEx ex = new TransparentRectanglesEx(); ex.setVisible(true); } }); } } ``` 在我們的示例中,我們繪制了 10 個具有不同透明度級別的藍色矩形。 ```java float alpha = i * 0.1f; ``` alpha 值在`for`循環中動態變化。 ```java AlphaComposite alcom = AlphaComposite.getInstance( AlphaComposite.SRC_OVER, alpha); ``` `AlphaComposite.getInstance()`方法使用指定的規則和常數 alpha 來創建`AlphaComposite`對象,以與源的 alpha 相乘。 ```java g2d.setComposite(alcom); ``` `setComposite()`方法設置`Graphics2D`對象的復合屬性。 ![Transparent rectangles](https://img.kancloud.cn/e3/88/e388f9f726252a9ffc219ff884d8e809_590x120.jpg) 圖:透明矩形 ## 淡出演示 在下一個示例中,我們將淡出圖像。 圖像將逐漸變得更加透明,直到完全不可見為止。 `FadeOutEx.java` ```java package com.zetcode; import java.awt.AlphaComposite; import java.awt.Dimension; import java.awt.EventQueue; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Image; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.ImageIcon; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.Timer; class Surface extends JPanel implements ActionListener { private Image img; private Timer timer; private float alpha = 1f; private final int DELAY = 40; private final int INITIAL_DELAY = 500; public Surface() { loadImage(); setSurfaceSize(); initTimer(); } private void loadImage() { img = new ImageIcon("mushrooms.jpg").getImage(); } private void setSurfaceSize() { int h = img.getHeight(this); int w = img.getWidth(this); setPreferredSize(new Dimension(w, h)); } private void initTimer() { timer = new Timer(DELAY, this); timer.setInitialDelay(INITIAL_DELAY); timer.start(); } private void doDrawing(Graphics g) { Graphics2D g2d = (Graphics2D) g.create(); AlphaComposite acomp = AlphaComposite.getInstance( AlphaComposite.SRC_OVER, alpha); g2d.setComposite(acomp); g2d.drawImage(img, 0, 0, null); g2d.dispose(); } @Override public void paintComponent(Graphics g) { super.paintComponent(g); doDrawing(g); } private void step() { alpha += -0.01f; if (alpha <= 0) { alpha = 0; timer.stop(); } } @Override public void actionPerformed(ActionEvent e) { step(); repaint(); } } public class FadeOutEx extends JFrame { public FadeOutEx() { initUI(); } private void initUI() { add(new Surface()); pack(); setTitle("Fade out"); setLocationRelativeTo(null); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { @Override public void run() { FadeOutEx ex = new FadeOutEx(); ex.setVisible(true); } }); } } ``` 使用`AlphaComposite`,我們逐漸淡出面板上的圖像。 ```java private void setSurfaceSize() { int h = img.getHeight(this); int w = img.getWidth(this); setPreferredSize(new Dimension(w, h)); } ``` `setSurfaceSize()`方法找出圖像的大小并為面板設置首選大小。 首選大小與`pack()`方法的組合將顯示恰好足以顯示整個圖像的窗口。 ```java private void initTimer() { timer = new Timer(DELAY, this); timer.setInitialDelay(INITIAL_DELAY); timer.start(); } ``` `initTimer()`方法啟動一個計時器。 計時器在指定的初始延遲后觸發操作事件。 在事件之間延遲之后會生成連續的動作事件。 為了響應動作事件,我們將更改 Alpha 值并重新繪制面板。 ```java AlphaComposite acomp = AlphaComposite.getInstance( AlphaComposite.SRC_OVER, alpha); g2d.setComposite(acomp); g2d.drawImage(img, 0, 0, null); ``` 此代碼在面板上繪制具有增加的透明度的圖像。 ```java private void step() { alpha += -0.01f; if (alpha <= 0) { alpha = 0; timer.stop(); } } ``` `step()`方法代表淡出周期。 `alpha`逐漸降低。 請注意,alpha 值不得為負。 當達到零時,計時器停止。 ```java repaint(); ``` `repaint()`方法重新繪制組件。 它調用面板組件的`paint()`方法,然后又調用`paintComponent()`方法。 ## 等待演示 在此示例中,我們使用透明效果創建一個等待演示。 我們繪制了 8 條逐漸消失的線,從而產生了一條線在移動的錯覺。 此類效果通常用于通知用戶幕后正在進行繁重的任務。 例如,通過互聯網流式傳輸視頻時。 `WaitingEx.java` ```java package com.zetcode; import java.awt.AlphaComposite; import java.awt.BasicStroke; import java.awt.EventQueue; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.RenderingHints; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.Timer; class Surface extends JPanel implements ActionListener { private Timer timer; private int count; private final int INITIAL_DELAY = 200; private final int DELAY = 80; private final int NUMBER_OF_LINES = 8; private final int STROKE_WIDTH = 3; private final double[][] trs = { {0.0, 0.15, 0.30, 0.5, 0.65, 0.80, 0.9, 1.0}, {1.0, 0.0, 0.15, 0.30, 0.5, 0.65, 0.8, 0.9}, {0.9, 1.0, 0.0, 0.15, 0.3, 0.5, 0.65, 0.8}, {0.8, 0.9, 1.0, 0.0, 0.15, 0.3, 0.5, 0.65}, {0.65, 0.8, 0.9, 1.0, 0.0, 0.15, 0.3, 0.5}, {0.5, 0.65, 0.8, 0.9, 1.0, 0.0, 0.15, 0.3}, {0.3, 0.5, 0.65, 0.8, 0.9, 1.0, 0.0, 0.15}, {0.15, 0.3, 0.5, 0.65, 0.8, 0.9, 1.0, 0.0} }; public Surface() { initTimer(); } private void initTimer() { timer = new Timer(DELAY, this); timer.setInitialDelay(INITIAL_DELAY); timer.start(); } private void doDrawing(Graphics g) { Graphics2D g2d = (Graphics2D) g.create(); g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); g2d.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY); int width = getWidth(); int height = getHeight(); g2d.setStroke(new BasicStroke(STROKE_WIDTH, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND)); g2d.translate(width / 2, height / 2); for (int i = 0; i < NUMBER_OF_LINES; i++) { float alpha = (float) trs[count % NUMBER_OF_LINES][i]; AlphaComposite acomp = AlphaComposite.getInstance( AlphaComposite.SRC_OVER, alpha); g2d.setComposite(acomp); g2d.rotate(Math.PI / 4f); g2d.drawLine(0, -10, 0, -40); } g2d.dispose(); } @Override public void paintComponent(Graphics g) { super.paintComponent(g); doDrawing(g); } @Override public void actionPerformed(ActionEvent e) { repaint(); count++; } } public class WaitingEx extends JFrame { public WaitingEx() { initUI(); } private void initUI() { add(new Surface()); setTitle("Waiting"); setSize(300, 200); setLocationRelativeTo(null); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { @Override public void run() { WaitingEx ex = new WaitingEx(); ex.setVisible(true); } }); } } ``` 我們用八個不同的 alpha 值繪制八條線。 ```java private final double[][] trs = { ... }; ``` 這是此演示中使用的透明度值的二維數組。 有 8 行,每行一種狀態。 8 行中的每行將連續使用這些值。 ```java g2d.setStroke(new BasicStroke(STROKE_WIDTH, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND)); ``` 我們使線條更粗一些,以便更好地顯示它們。 我們用圓帽畫線。 ```java g2d.rotate(Math.PI/4f); g2d.drawLine(0, -10, 0, -40); ``` 這段代碼繪制了八行。 `rotate()`方法用于沿直線旋轉線。 ![Waiting](https://img.kancloud.cn/a0/64/a064c804a16067009945220bceba7b4d_300x200.jpg) 圖:等待 在 Java 2D 教程的這一部分中,我們討論了透明性。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看