안 드 로 이 드 는 textview 의 최대 디 스 플레이 를 어떻게 가 져 옵 니까?

방법 1
업무 중 에 사용 하 는 방법 중 하 나 는 특별히 정확 하 지 는 않 지만 효과 가 좋 습 니 다.여기 서 공유 하 겠 습 니 다.

    /**
     *   textview        
     * @param text     
     * @param size       
     * @param maxWidth textview     
     * @return
     */
    private float getLineMaxNumber(String text, float size,float maxWidth) {
        if (null == text || "".equals(text)){
            return 0;
        }
        Paint paint = new Paint();
        paint.setTextSize(size);
        //          
        float textWidth = paint.measureText(text);
        // textWidth
        float width = textWidth / text.length();
        float total = maxWidth / width;
        return total;
    }
위의 이 방법 은 정확 하지 않 지만 RecyclerView 나 ListView 에서 사용 하기에 적합 하여 너무 많은 대상 이 생 성 되 지 않도록 합 니 다.
방법 2

/**
     *   textview          (   TextView      )
     *
     * @param text         
     * @param paint    textview.getPaint()
     * @param maxWidth textview.getMaxWidth()/        , 200dp
     */
    private int getLineMaxNumber(String text, TextPaint paint, int maxWidth) {
        if (null == text || "".equals(text)) {
            return 0;
        }
        StaticLayout staticLayout = new StaticLayout(text, paint, maxWidth, Layout.Alignment.ALIGN_NORMAL
                , 1.0f, 0, false);
        //              
        return staticLayout.getLineEnd(0);
    }

Static Layout 를 이용 하면 표시 할 수 있 는 최대 문자 수 를 쉽게 얻 을 수 있 습 니 다.
연장:
한 줄 의 TextView 에 대해 문자열 이 한 줄 을 초과 할 때 표시 되 지 않 은 일부 문자열 을 어떻게 가 져 옵 니까?
textview 에서 최대 줄 수 를 1 로 설정 한 후에 텍스트 가 textview 를 초과 하고 textView 끝 에 생략 번 호 를 표시 합 니 다.저 는 생략 번호 가 대표 하 는 내용 을 알 고 싶 습 니 다.
생각:
TextView 의 폭 이 xml 에 설 치 된 구체 적 인 수치 라 고 가정 합 니 다.예 를 들 어 300 dp,
(이 문 제 를 간소화 하기 위해 match 로 설정 하면parent 혹은 wrapcontent,프로그램 이 실 행 될 때 폭 을 계산 해 야 하 며,getWidth 는 항상 0 으로 돌아 가 는 것 이 번 거 롭 습 니 다.)
예 를 들 어 이렇게 설정 되 어 있 습 니 다.

  <TextView
        android:id="@+id/textView"
        android:layout_width="300dp"
        android:layout_height="wrap_content"
        android:ellipsize="end"
        android:singleLine="true" />
그리고 아주 긴 문자열 을 채 웠 습 니 다.예 를 들 어 다음 과 같 습 니 다.

String str = "If you really want to hear about it, the first thing you'll probably want to know";
          ,   :
If you really want to hear about it, the first thin...

  ,              ,          ,                    。
         ,  n       ,  TextView   ,            。

String str = "If you really want to hear about it, the first thing you'll probably want to know";
mTextView = (TextView) findViewById(R.id.textView);

//   TextView  :xml      300dp,   px
float textViewWidth = convertDpToPixel(300);
float dotWidth = getCharWidth(mTextView, '.');
Log.d(TAG, "TextView width " + textViewWidth);

int sumWidth = 0;
for (int index=0; index<str.length(); index++) {
    //           
    char c = str.charAt(index);
    float charWidth = getCharWidth(mTextView, c);
    sumWidth += charWidth;
    Log.d(TAG, "#" + index + ": " + c + ", width=" + charWidth + ", sum=" + sumWidth);
    
    if (sumWidth + dotWidth*3 >= textViewWidth) {
        Log.d(TAG, "TextView shows #" + index + " char: " + str.substring(0, index));
        break;
    }
}

// Dp Px
private float convertDpToPixel(float dp){
    Resources resources = getResources();
    DisplayMetrics metrics = resources.getDisplayMetrics();
    float px = dp * (metrics.densityDpi / 160f);
    return px;
}

//           
public float getCharWidth(TextView textView, char c) {
    textView.setText(String.valueOf(c));
    textView.measure(0, 0);
    return textView.getMeasuredWidth();
} 

결 과 는 다음 과 같 습 니 다.영광 3C 와 LG G3 에서 테스트 를 통 과 했 습 니 다.
10-22 01:17:42.046: D/Text(21495): TextView width 600.0
10-22 01:17:42.048: D/Text(21495): #0: I, width=8.0, sum=8
10-22 01:17:42.049: D/Text(21495): #1: f, width=9.0, sum=17
10-22 01:17:42.049: D/Text(21495): #2:  , width=7.0, sum=24
10-22 01:17:42.049: D/Text(21495): #3: y, width=14.0, sum=38
......
10-22 01:17:42.053: D/Text(21495): #17: t, width=9.0, sum=213
10-22 01:17:42.053: D/Text(21495): #18:  , width=7.0, sum=220
10-22 01:17:42.053: D/Text(21495): #19: t, width=9.0, sum=229
......
10-22 01:17:42.061: D/Text(21495): #50: n, width=16.0, sum=575
10-22 01:17:42.061: D/Text(21495): #51: g, width=16.0, sum=591
10-22 01:17:42.061: D/Text(21495): TextView shows #51 char: If you really want to hear about it, the first thin
안 드 로 이 드 가 textview 를 가장 많이 가 져 오 는 것 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 안 드 로 이 드 textview 와 관련 된 내용 은 예전 의 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 저 희 를 많이 사랑 해 주세요!

좋은 웹페이지 즐겨찾기