首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

MIDP 2.0 影像像素級處理 (二):漸變透明度動畫實作

     編輯:Java 相關知識

應用場景

遊戲中淡入淡出效果、UI 元件顯示/隱藏動畫、場景切換轉場,皆需影像漸變透明度。

透明度原理

ARGB 像素最高 8 位為 Alpha 通道 (0x00 完全透明 ~ 0xFF 完全不透明)。修改 Alpha 值即可控制透明度:

// 保留原 RGB,僅更新 Alpha
argb[i] = (alpha << 24) | (argb[i] & 0x00FFFFFF);

完整實作:背景執行緒驅動漸變動畫

import java.io.IOException;
import javax.microedition.lcdui.Canvas;
import javax.microedition.lcdui.Graphics;
import javax.microedition.lcdui.Image;

public class FadeCanvas extends Canvas implements Runnable {
    Image image;
    int[] argb;
    int alpha = 0; // 0~255

    public FadeCanvas() {
        try {
            image = Image.createImage("/test.png");
        } catch (IOException e) {
            e.printStackTrace();
        }
        argb = new int[image.getWidth() * image.getHeight()];
        image.getRGB(argb, 0, image.getWidth(), 0, 0,
                     image.getWidth(), image.getHeight());

        // 初始完全透明
        for (int i = 0; i < argb.length; i++) {
            argb[i] = (alpha << 24) | (argb[i] & 0x00FFFFFF);
        }
        new Thread(this).start();
    }

    protected void paint(Graphics g) {
        g.setColor(0xFFFFFF);
        g.fillRect(0, 0, getWidth(), getHeight());
        g.drawImage(image, 0, 0, Graphics.TOP | Graphics.LEFT); // 底圖參考
        g.drawRGB(argb, 0, image.getWidth(), 0, 100,
                  image.getWidth(), image.getHeight(), true);    // 疊加漸變層
        g.drawString(String.valueOf(alpha), 10, 90, Graphics.TOP | Graphics.LEFT);
    }

    public void run() {
        while (alpha < 256) {
            // 更新所有像素 Alpha
            for (int i = 0; i < argb.length; i++) {
                argb[i] = (alpha << 24) | (argb[i] & 0x00FFFFFF);
            }
            repaint(); // 觸發重繪
            alpha++;
            try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); }
        }
    }
}

效果展示

漸變透明動畫效果示意圖

圖片從完全透明 (Alpha=0) 漸變至完全不透明 (Alpha=255),背景白色底圖清晰可見。

關鍵技術點

  1. 像素陣列複用: 僅修改 Alpha 通道,保留原 RGB,避免重複解碼圖片
  2. 背景執行緒: Runnable 配合 repaint() 實現非阻塞動畫
  3. 雙重繪製: 先畫底圖再疊加 drawRGB(),形成淡入效果
  4. 幀率控制: Thread.sleep(100) 約 10 FPS,可依裝置效能調整

擴充應用

  • 淡出: Alpha 從 255 遞減至 0
  • 脈動: 正弦函數驅動 Alpha 週期性變化
  • 多層疊加: 多個不同 Alpha 的像素陣列疊加合成
  • 記憶體注意: 大圖像素陣列佔用 Heap,及時釋放參考避免 OOM

系列文章:(一) 半透明基礎 | (二) 漸變透明動畫 | (三) 灰階轉換 | (四) 動態變色

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved