在 MMAPI 播放視頻或預覽攝像頭時,常需在畫面上疊加選單、十字準星、水印等圖形。Sony Ericsson JP-7 (如 K800, W950) 提供原生支援,JP-6 需技巧繞過。本文詳述兩種平台的實現方案。
VideoControl.initDisplayMode() 參數編碼:
int mode = VideoControl.USE_DIRECT_VIDEO
| (overlay << 8)
| (Sprite.TRANS_ROT90 << 4);
videoControl.initDisplayMode(mode, canvas);
overlay = 1:繪圖覆蓋在視頻之上(透明背景)。overlay = 0:繪圖在視頻之下(被遮擋)。TRANS_ROT90 等),適配橫屏拍攝。之後直接在 Canvas.paint(Graphics g) 繪制即可,系統自動合成。
視頻幀直接寫入顯示控制器,Canvas.paint() 繪制的內容會被下一幀視頻覆蓋。
PlayerListener 同步 + setClip(0,0,0,0)
private boolean videoStarted = false;
public void playerUpdate(Player p, String event, Object obj) {
if (p.getState() == Player.STARTED) {
videoStarted = true; // 視頻已穩定輸出
}
}
public void paint(Graphics g) {
if (camera != null && camera.isInitialized()) {
if (videoStarted && !updateFlag) {
drawOverlay(g); // 繪制選單/十字線
g.setClip(0, 0, 0, 0); // 關鍵:清空裁剪區,防止系統重繪視頻時清除覆蓋層
} else if (updateFlag) {
updateFlag = false; // 外部觸發重繪(如選單切換)
}
}
}
原理:setClip(0,0,0,0) 使後續系統繪制視頻幀時不清除已繪制的覆蓋像素(實測有效,屬廠商實現細節)。

作者提供完整工程:UploadFiles/2007-1/18575526.zip(含 JP-6/JP-7 適配邏輯)。
JP-7 直接使用 overlay 參數最簡潔;JP-6 需監聽 Player 啟動事件並配合 setClip(0,0,0,0) 這一「黑科技」。實際開發建議運行時檢測平台版本動態選擇策略。