2014-03-19 3 views
0

서클 내부에 숫자를 그리고 텍스트 중심에 문제가 있습니다. 다음 (I 시험 장치에 10 픽셀) I 문제는 그것이 단지 약간 더 아래쪽을 향하고있는 텍스트 뷰Android Text Centering

<RelativeLayout 
    android:id="@+id/label" 
    android:layout_width="72dip" 
    android:layout_height="72dip" 
    android:layout_centerVertical="true" 
    android:layout_alignParentLeft="true" 
    android:layout_margin="8dip" > 

    <View 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:background="@drawable/hole_background" 
     android:layout_centerInParent="true"/> 
    <TextView 
     android:id="@+id/hole" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:textColor="@android:color/white" 
     android:textSize="56sp" 
     android:textStyle="bold" 
     android:gravity="center"/> 
</RelativeLayout> 

에게 표시하는 디스플레이마다 XML이다. 내가보기를 결합하고 here 같은 배경을 사용하거나 글꼴 패딩을 제거하려고했습니다

enter image description here

이 ... 내가 무슨 말 보여줍니다 뷰 계층 뷰어에서 스크린 샷입니다 같은 here 제안하지만 둘은 아래와 같이 글꼴 패딩 결말, 일 ...

enter image description here

나는 현재 바로보고 그것을 조정하는 음의 여백을 사용하고 있어요

을하지만 올바른 아닌 것 같아 그것을하는 방법. 누구든지 텍스트 크기에 따라 수동으로 확인해야하는 음수 여백을 사용하지 않고 텍스트를 중앙에 배치하는 방법에 대한 아이디어가 있습니까? 사전

+2

글꼴 메트릭 문제 일 가능성이 가장 높습니다. 가운데 맞춤은 실제 글리프가 아니라 텍스트 기준선 및 수직 범위를 기반으로합니다. "a"또는 "."를 수직으로 가운데에 배치하면 어떻게 될지 상상해보십시오. 분명히 그들은 중심에 있지 않고 원의 중심선 아래에있을 것이므로 대문자가 더 많이 * 중앙에 표시 될 것입니다. 다른 글꼴로 실험하거나 수동으로 수정하는 것 외에 다른 작업을 수행 할 수있는 것은 무엇인지 모릅니다. – 323go

+1

많은 의미가 있습니다. 캐릭터 크기의 변화가 어떤 역할을하는지 실제로 생각하지 않았습니다. 매우 구체적인 사용 사례가 있으므로 방금 그려지는 텍스트의 실제 높이를 기준으로 가운데 맞춤을 처리하는 사용자 지정보기를 만들었습니다. 의견을 보내 주셔서 감사합니다. – StackJP

답변

1

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

결과가되는

...

enter image description here

덜 구체적인 크기의 사양으로는 잘 작동하는지 잘 모르겠지만 매우 구체적인 사용 사례가 있었지만 나를 대신 할 수있는 방법이었습니다.

0

에서

덕분에 주석으로이를 추가 할 수 있지만, 충분히 평판이 없습니다. 323go의 의견을 바탕으로, 글꼴을 변경하고 수동으로 오프셋을 조정하는 데 많은 시간을 소비하지 않고 번호에 이미지를 사용하는 것이 더 쉬울 수도 있습니다. 한 dpi에서 잘 보일 수도 있고 다른 dpi에서 다시 보일 수도 있습니다.