使用 canvas.drawArc 繪製括號(如 `(` `)`),曲線銳利、線條粗細不均、端點不圓滑,視覺效果差。
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) 保證彎頭不變形、直線段拉伸。VectorDrawable (.xml) 完美縮放,無位圖模糊,推薦長期演進方向。| 方案 | 視覺質量 | 性能 | 維護成本 |
|---|---|---|---|
| drawArc | 差(銳角、抖動) | 高 | 低(純代碼) |
| PNG 縮放 | 優(設計師可控) | 高(緩存後) | 中(需圖片資源) |
| VectorDrawable | 完美(無限縮放) | 中(解析開銷) | 低(XML 可編輯) |
**結論:短期上線用 PNG 縮放最穩妥,長期遷移至 VectorDrawable 實現完美適配。**