因此,基於LairdPleng和323go的評論,我最終創建了一個自定義視圖。下面的視圖會做定心正是基於數量正在繪製的高度...
public class Label extends View {
private static final int TEXT_SIZE = 56;
private String mText;
private float mCenterX;
private float mCenterY;
private float mRadius;
private Paint mCirclePaint;
private Paint mTextPaint;
private Rect mTextBounds;
public HoleLabel(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
setupCanvasComponents(context);
}
public HoleLabel(Context context, AttributeSet attrs) {
super(context, attrs);
setupCanvasComponents(context);
}
public HoleLabel(Context context) {
super(context);
setupCanvasComponents(context);
}
public void setText(String text) {
if (!StringUtils.equals(mText, text)) {
mText = text;
invalidate();
}
}
private void setupCanvasComponents(Context context) {
mCirclePaint = new Paint(Paint.ANTI_ALIAS_FLAG);
mCirclePaint.setColor(Color.BLACK);
mCirclePaint.setStyle(Paint.Style.FILL);
Typeface font = Typeface.createFromAsset(context.getAssets(), "fonts/CustomFont.otf");
DisplayMetrics displayMetrics = new DisplayMetrics();
((WindowManager) getContext().getSystemService(Context.WINDOW_SERVICE))
.getDefaultDisplay().getMetrics(displayMetrics);
float scaledDensity = displayMetrics.scaledDensity;
mTextPaint = new Paint(Paint.ANTI_ALIAS_FLAG | Paint.LINEAR_TEXT_FLAG);
mTextPaint.setColor(Color.WHITE);
mTextPaint.setStyle(Paint.Style.FILL);
mTextPaint.setTextSize(TEXT_SIZE * scaledDensity);
mTextPaint.setTypeface(font);
mTextPaint.setTextAlign(Align.CENTER);
mTextBounds = new Rect();
}
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
mCenterX = w/2.0f;
mCenterY = h/2.0f;
mRadius = w/2.0f;
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
// Draw the background
canvas.drawCircle(mCenterX, mCenterY, mRadius, mCirclePaint);
// Draw the text
if (mText != null) {
mTextPaint.getTextBounds(mText, 0, mText.length(), mTextBounds);
canvas.drawText(mText, mCenterX, (mCenterY + mTextBounds.height()/2), mTextPaint);
}
}
}
以XML ...
<com.example.widget.Label
android:id="@+id/label"
android:layout_width="72dip"
android:layout_height="72dip"
android:layout_centerVertical="true"
android:layout_alignParentLeft="true"
android:layout_margin="8dip" />
結果是...
我有一個非常具體的用例,所以我不知道如果它能夠很好地工作,如果使用較不嚴格的尺寸規格,但它是我的方式。
這很可能是一個字體指標問題 - 居中不是基於實際字形,而是基於文本基線和垂直範圍。想象一下,如果你垂直居中「a」或「。」,會發生什麼。 - 顯然,它們不會位於中心,而是位於圓圈的中心線之下,因此大寫字符會顯示爲*更多*居中。我不知道除了嘗試使用不同的字體或手動修改之外,您還可以做其他任何事情。 – 323go
這樣做很有意義,我並沒有真正考慮不同字符大小如何起作用。由於我有一個非常具體的用例,我只創建了一個自定義視圖,該視圖基於所繪文本的實際高度來處理居中。感謝您的意見 – StackJP