그래서 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