Android 사용자 정의 TextView 텍스트 그림 가운데 표시 방법

최근 에 한 가지 수요 가 있 습 니 다.인민폐 의 기호 인'¥'는 안 드 로 이 드 핸드폰 시스템 의 불일치 로 인해 기호 가 똑 같 지 않 기 때문에 미 공 들 이 준 그림 으로 대체 하고 사용 하 는 곳 이 비교적 많다 는 것 을 고려 하여 선형 구 조 를 계승 하 는 조합 제어 부품 을 쓰 려 고 했 습 니 다.나중에 생각해 보 니 안 드 로 이 드 에 TextView 가 있 지 않 습 니까?이 자체 사진 의 컨트롤 을 가지 고 있 습 니 다.나중에 demo 를 썼 습 니 다.제 가 MatchParent 를 사 용 했 기 때문에 문제 가 발생 했 습 니 다.인민폐 기 호 는 문자 와 같은 가운데 가 아니 기 때문에 이 박문 이 생 겼 습 니 다.우 리 는 TextView 를 정의 하 는 데 서 왔 습 니 다.이 장면 은 비교적 많이 사 용 했 습 니 다.
TextView 의 소스 코드 분석
먼저 TextView 의 소스 코드 를 분석 해 보 겠 습 니 다.TextView 는 상하 좌우 네 방향의 그림 이 있 기 때문에 상하 로 는 고려 하지 않 겠 습 니 다.일반적으로 그림 이 수직 으로 가운데 에 있 는 것 은 문제 가 없 기 때문에 우 리 는 이 left,right 방향의 그림 만 처리 합 니 다.우 리 는 TextView 의 ondraw 방법 을 직접 봅 니 다.TextView 도 자체 View 를 계승 하기 때 문 입 니 다.모든 그림 은 여기에서 작 동 합 니 다.

<span style="font-size:18px;">int vspace = bottom - top - compoundPaddingBottom - compoundPaddingTop;
int hspace = right - left - compoundPaddingRight - compoundPaddingLeft;
// IMPORTANT: The coordinates computed are also used in invalidateDrawable()
// Make sure to update invalidateDrawable() when changing this code.
if (dr.mShowing[Drawables.LEFT] != null) {
  canvas.save();
  canvas.translate(scrollX + mPaddingLeft + leftOffset,
           scrollY + compoundPaddingTop +
           (vspace - dr.mDrawableHeightLeft) / 2);
  dr.mShowing[Drawables.LEFT].draw(canvas);
  canvas.restore();
}
// IMPORTANT: The coordinates computed are also used in invalidateDrawable()
// Make sure to update invalidateDrawable() when changing this code.
if (dr.mShowing[Drawables.RIGHT] != null) {
  canvas.save();
  canvas.translate(scrollX + right - left - mPaddingRight
      - dr.mDrawableSizeRight - rightOffset,
       scrollY + compoundPaddingTop + (vspace - dr.mDrawableHeightRight) / 2);
  dr.mShowing[Drawables.RIGHT].draw(canvas);
  canvas.restore();
}</span>
위 에서 볼 수 있 듯 이 canvas.translate 방법 이 있 습 니 다.아마도 save 후 캔버스 를 X 축 과 Y 축 으로 각각 스크롤 X.와 scrollY 를 평평 하 게 옮 긴 후 왼쪽 방향의 그림 을 그 렸 습 니 다.마지막 으로 restore 는 이전 캔버스 에 복원 되 었 습 니 다.Right 는 같 습 니 다.
그러면 우 리 는 기본적으로 원 리 를 알 게 되 었 다.TextView 의 네 가지 방향 은 모두 Canvas 의 translate 를 통 해 문자 의 상하 좌우 로 그 려 졌 다.그러면 우 리 는 이 scrollX 와 scrolly 만 바 꾸 면 우리 의 수 요 를 실현 할 수 있 을 것 이다.
구체 적 실현
1.아래 에 설명 이 적 혀 있 습 니 다.특별히 번 거 롭 지 않 습 니 다.drawableLeft 와 drawableRight 그림,PS,xml 에 Gravity 를 설정 하지 마 십시오.그러면 가운데 에 있 을 수 있 습 니 다.코드 는 다음 과 같 습 니 다.

<span style="font-size:18px;">package com.chaoxing.email.view;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.view.Gravity;
import android.widget.TextView;
/**
 * use in xml
 * use in code
 */
public class EmailCenterTextView extends TextView {
  public EmailCenterTextView(Context context) {
    super(context);
  }
  public EmailCenterTextView(Context context, AttributeSet attrs) {
    super(context, attrs);
  }
  public EmailCenterTextView(Context context, AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);
  }
  @Override
  protected void onDraw(Canvas canvas) {
    Drawable[] drawables = getCompoundDrawables();
    if (null != drawables) {
      Drawable drawableLeft = drawables[0];
      Drawable drawableRight = drawables[2];
      float textWidth = getPaint().measureText(getText().toString());
      if (null != drawableLeft) {
        setGravity(Gravity.START | Gravity.CENTER_VERTICAL);
        float contentWidth = textWidth + getCompoundDrawablePadding() + drawableLeft.getIntrinsicWidth();
        if (getWidth() - contentWidth > 0) {
          canvas.translate((getWidth() - contentWidth - getPaddingRight() - getPaddingLeft()) / 2, 0);
        }
      }
      if (null != drawableRight) {
        setGravity(Gravity.END | Gravity.CENTER_VERTICAL);
        float contentWidth = textWidth + getCompoundDrawablePadding() + drawableRight.getIntrinsicWidth();
        if (getWidth() - contentWidth > 0) {
          canvas.translate(-(getWidth() - contentWidth - getPaddingRight() - getPaddingLeft()) / 2, 0);
        }
      }
      if (null == drawableRight && null == drawableLeft) {
        setGravity(Gravity.CENTER);
      }
    }
    super.onDraw(canvas);
  }
}</span>
업데이트 효과 그림(네티즌 댓 글 을 봤 기 때문에 최근 에 이 블 로 그 를 업데이트 하 는 데 사용 되 었 습 니 다)
title 은 Email Center TextView 를 사용 합 니 다.그 화살 표 는 위 아래 에 설 치 된 drawableRight 입 니 다.보 여 주 는 읽 지 않 음 과 쓰레기통 Email Center TextView 에 그림 이 설정 되 어 있 지 않 습 니 다.

이상 의 안 드 로 이 드 사용자 정의 TextView 가 문자 이미지 가운데 에 표시 되 는 방법 은 바로 작은 편집 이 여러분 에 게 공유 하 는 모든 내용 입 니 다.여러분 께 참고 가 되 고 저 희 를 많이 사랑 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기