採用 BlockingQueue 實現線程安全的圖片緩衝區,防止生產過快導致 OOM:
BlockingQueue<Image> imageQueue = new ArrayBlockingQueue<>(2);
Image eofMarker = new WritableImage(1, 1); // 結束標記
生產者線程循環讀取資源,隊列滿時自動阻塞;讀完所有資源後放入 EOF 標記通知消費者。
繼承 Transition,通過插值器控制弧長變化:
class ArcLengthTransition extends Transition {
private final Arc arc;
public ArcLengthTransition(Duration duration, Arc arc) {
this.arc = arc;
setCycleDuration(duration);
}
@Override protected void interpolate(double frac) {
arc.setLength(frac * 360); // 0~360 度漸變
}
}
利用 BlendMode 實現圖片無縫切換:
// 底圖正常顯示
rootGroup.setBlendMode(BlendMode.SRC_OVER);
// 新圖僅在非透明區域顯示(實現遮罩效果)
nextImageView.setBlendMode(BlendMode.SRC_ATOP);
結合弧形展開與淡入淡出:
FadeTransition fadeOut = new FadeTransition(Duration.seconds(0.2), oldMask);
ParallelTransition parallel = new ParallelTransition(arcTransition, fadeOut);
parallel.play();
完整項目結構建議:loader/(加載器)、transition/(特效)、controller/(播放邏輯),便於擴展百葉窗、立方體翻轉等更多特效。