2012-03-15 7 views
7

Tôi đang tìm cách để thay đổi kích thước màn hình, nó sẽ cân đối kích thước văn bản. Hiện tại tôi đã thử Auto Scale TextView Text to Fit within Bounds nhưng có vẻ như nó không hoạt động. nhưng tôi không chắc mình có làm đúng hay không. Tôi bây giờ đang gọi bởiKích thước văn bản quy mô tự động

AutoResizeTextView test = new AutoResizeTextView(this); 
test=(AutoResizeTextView)findViewById(R.id.test456); 
test.resizeText(); // I call this to resize.. am I right? 

XML

<com.mypackage.AutoResizeTextView 
android:id="@+id/test456" 
android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:layout_weight="1" /> 

Trả lời

34

Bạn không cần phải gọi AutoResizeTextView test, bạn có thể nói TextView kể từ khi lớp học kéo dài TextView. Tôi không hiểu tại sao bạn cũng cần phải gọi số resizeText().

Dù bằng cách nào, đây là lớp tùy chỉnh tôi muốn sử dụng để tự động thay đổi kích thước văn bản.

public class AutoFitTextView extends TextView { 

public AutoFitTextView(Context context) { 
    super(context); 
    init(); 
} 

public AutoFitTextView(Context context, AttributeSet attrs) { 
    super(context, attrs); 
    init(); 
} 

private void init() { 

    maxTextSize = this.getTextSize(); 
    if (maxTextSize < 35) { 
     maxTextSize = 30; 
    } 
    minTextSize = 20; 
} 

private void refitText(String text, int textWidth) { 
    if (textWidth > 0) { 
     int availableWidth = textWidth - this.getPaddingLeft() 
       - this.getPaddingRight(); 
     float trySize = maxTextSize; 

     this.setTextSize(TypedValue.COMPLEX_UNIT_PX, trySize); 
     while ((trySize > minTextSize) 
       && (this.getPaint().measureText(text) > availableWidth)) { 
      trySize -= 1; 
      if (trySize <= minTextSize) { 
       trySize = minTextSize; 
       break; 
      } 
      this.setTextSize(TypedValue.COMPLEX_UNIT_PX, trySize); 
     } 
     this.setTextSize(TypedValue.COMPLEX_UNIT_PX, trySize); 
    } 
} 

@Override 
protected void onTextChanged(final CharSequence text, final int start, 
     final int before, final int after) { 
    refitText(text.toString(), this.getWidth()); 
} 

@Override 
protected void onSizeChanged(int w, int h, int oldw, int oldh) { 
    if (w != oldw) { 
     refitText(this.getText().toString(), w); 
    } 
} 

@Override 
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 
    super.onMeasure(widthMeasureSpec, heightMeasureSpec); 
    int parentWidth = MeasureSpec.getSize(widthMeasureSpec); 
    refitText(this.getText().toString(), parentWidth); 
} 

public float getMinTextSize() { 
    return minTextSize; 
} 

public void setMinTextSize(int minTextSize) { 
    this.minTextSize = minTextSize; 
} 

public float getMaxTextSize() { 
    return maxTextSize; 
} 

public void setMaxTextSize(int minTextSize) { 
    this.maxTextSize = minTextSize; 
} 

private float minTextSize; 
private float maxTextSize; 

} 
+0

Tôi đang gọi qua lớp khác vì vậy tôi cần gọi điện cho tôi đúng không? Có phải tất cả những gì tôi cần là để bố trí xml n sử dụng lớp tùy chỉnh làm tiêu đề? – user1235085

+1

Btw mã của bạn hoạt động hoàn hảo cho tôi cảm ơn :) – user1235085

+0

Có vẻ như bạn đã nhận được nó, nhưng phải rõ ràng; bạn thêm lớp tùy chỉnh trong XML của bạn thay cho 'TextView', sau đó trong mã của bạn, bạn tham chiếu nó giống như một' TextView' bình thường. – adneal

2

Tôi sử dụng điều này, tương ứng ở độ rộng của màn hình.

DisplayMetrics displaymetrics = new DisplayMetrics(); 
     getWindowManager().getDefaultDisplay().getMetrics(displaymetrics); 
     width_screen=displaymetrics.widthPixels; 
Mytext.setTextSize(TypedValue.COMPLEX_UNIT_PX, (width_screen/CONST)); 

CONST là số tôi sử dụng để chia tỷ lệ phông chữ, theo thứ nguyên tôi muốn. Nó phù hợp với nhu cầu của tôi.