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

J2ME StringItem 長文本跑馬燈效果實現:基於線程的座標位移方案

     編輯:J2ME

問題場景

J2ME 標準 StringItem 無法自動滾動過長文本。需在標題欄或表單中實現「文字超寬時自動左右滾動」的跑馬燈效果。

核心思路

  • 使用獨立線程週期性更新文本繪製 X 座標(moveX)。
  • 當文本寬度超過可視區域(left ~ right)時,啟動滾動;否則靜止顯示。
  • 滾動邏輯:moveX += 1,超出右邊界則重置至初始 tempX 形成循環。
  • 僅在組件獲得焦點(isFocused)時啟動,釋放焦點即停止。

關鍵代碼結構

class MoveItemContentTask implements Runnable {
    private boolean ismoving;
    private int moveX, tempX, left, right;

    public void movingPain(int x, int y, int leftBorder, int rightBorder,
                           boolean isFocused, Graphics g) {
        moveX = tempX = x;
        left = leftBorder; right = rightBorder;
        ismoving = isFocused;
        paintContent(moveX, y, left, right, g); // 實際繪製調用
    }

    public void run() {
        changeX(moveX);
        try { Thread.sleep(50); } catch (InterruptedException e) { e.printStackTrace(); }
    }

    private void changeX(int x) {
        if (ismoving) {
            if (x < left || x > right) x = tempX;
            else x += 1;
        }
    }
}

整合要點

  1. 在自定義 Canvas 或 CustomItem 的 paint() 中調用 movingPain()。
  2. paintContent() 需自行實現:g.drawString(text, moveX, y, Graphics.TOP | Graphics.LEFT) 並設置裁剪區 g.setClip(left, 0, right-left, height)。
  3. 焦點變化時(pointerPressed、keyPressed)更新 ismoving 狀態。

優化建議

  • 使用 Timer + TimerTask 替代手動 sleep,控制更精準。
  • 引入「暫停 → 滾動 → 暫停」節奏:首尾各停留 1.5 秒,體驗更自然。
  • 計算文本像素寬度 Font.stringWidth(text),僅在 width > visibleWidth 時啟動線程,節省資源。

總結

以輕量級線程驅動座標位移,配合裁剪區繪製,即可在受限的 J2ME 環境實現流暢的跑馬燈效果。核心在於「狀態機控制 + 週期性重繪」的簡潔模式。

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