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

Android Canvas 繪製精美括號:PNG 縮放替代 drawArc 方案

     編輯:程式設計疑難解答

問題背景

使用 canvas.drawArc 繪製括號(如 `(` `)`),曲線銳利、線條粗細不均、端點不圓滑,視覺效果差。

核心思路:高清 PNG + 九宮格/等比縮放

  1. 設計師提供**足夠大**的括號 PNG(如 100×200px),透明背景,曲線平滑。
  2. 代碼根據目標高度動態縮放,**寬度固定或等比**,保持視覺一致性。
  3. 繪製時用 canvas.drawBitmap,性能極高,無幾何計算誤差。

完整實現

private static final int MAX_BRACKET_H = dip2px(20);
private static final int MAX_BRACKET_W = dip2px(10);
private static Bitmap leftBracket, rightBracket;

static {
    leftBracket  = BitmapFactory.decodeResource(res, R.drawable.bracket_left);
    rightBracket = BitmapFactory.decodeResource(res, R.drawable.bracket_right);
}

public static void drawLeftBracket(Canvas canvas, int x, int y, int height) {
    Bitmap bmp;
    if (height > MAX_BRACKET_H) {
        bmp = Bitmap.createScaledBitmap(leftBracket, MAX_BRACKET_W, height, true);
    } else {
        float scale = (float) height / leftBracket.getHeight();
        bmp = Bitmap.createScaledBitmap(leftBracket,
                (int)(leftBracket.getWidth() * scale), height, true);
    }
    canvas.drawBitmap(bmp, x, y, null);
}

// 右括號同理,x 為右側邊界 - 寬度

優化建議

  • 緩存縮放結果:用 LruCache<Integer, Bitmap> 緩存不同高度的 Bitmap,避免頻繁創建對象觸發 GC。
  • 九宮格:若括號包含直線段,用 NinePatch (.9.png) 保證彎頭不變形、直線段拉伸。
  • 矢量替代:API 21+ 可用 VectorDrawable (.xml) 完美縮放,無位圖模糊,推薦長期演進方向。

對比總結

方案視覺質量性能維護成本
drawArc差(銳角、抖動)高低(純代碼)
PNG 縮放優(設計師可控)高(緩存後)中(需圖片資源)
VectorDrawable完美(無限縮放)中(解析開銷)低(XML 可編輯)

**結論:短期上線用 PNG 縮放最穩妥,長期遷移至 VectorDrawable 實現完美適配。**

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