Justifying text in Android

后端 未结 6 689
佛祖请我去吃肉
佛祖请我去吃肉 2020-12-20 01:42

I need to justify some text (RTL), which is a string (S1) from the server. But a TextView can\'t justify text, so I have to use a WebView

6条回答
  •  爱一瞬间的悲伤
    2020-12-20 01:57

    i made simple class.
    this can be used just like TextView

    import android.content.Context;
    import android.graphics.Paint;
    import android.util.AttributeSet;
    import android.widget.TextView;
    
    /**
     * text justifying
     * you can just use like TextView
     * @author hyunsikkim
     *
     */
    public class JustifiedTextView extends TextView {
    
    public JustifiedTextView(Context context) {
        super(context);
    }
    
    public JustifiedTextView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }
    
    private void setBreakText(String text) {
        if(text == null) return;
    
        String breakText = breakText(getPaint(), text, 
                getWidth()-this.getPaddingLeft()-this.getPaddingRight());
    
        if(breakText.equals(getText()) == false) {
            setText(breakText);
        }
    }
    
    public String breakText(Paint textPaint, String strText, int breakWidth) { 
        StringBuilder sb = new StringBuilder(); 
        int endValue = 0; 
        final String NEW_LINE = "\n";
        do{ 
            endValue = textPaint.breakText(strText, true, breakWidth, null); 
            if(endValue > 0) {
                /**
                 * handle if text contains NEW_LINE
                 */
                final int index = strText.indexOf(NEW_LINE);
                if(0<=index && index <= endValue) {
                    endValue = index + NEW_LINE.length();
                }
                final String sub = strText.substring(0, endValue);
                sb.append(sub);
                /**
                 * handle breaked text endWidth NEW_LINE
                 */
                if(sub.endsWith(NEW_LINE) == false) {
                    if(strText.length() != endValue) {
                        sb.append(NEW_LINE);
                    }
                }
    
                strText = strText.substring(endValue); 
            } 
        } while(endValue > 0);
        return sb.toString();
    } 
    
    public String breakText(Paint textPaint, int id, int breakWidth) {
        String strText = getResources().getString(id);
        return breakText(textPaint, strText, breakWidth);
    }
    
    @Override
    protected void onTextChanged(CharSequence text, int start,
            int lengthBefore, int lengthAfter) {
        super.onTextChanged(text, start, lengthBefore, lengthAfter);
        /**
         * this control changes from setText(Charsequence text)
         */
        if(getWidth() != 0) {
            setBreakText(text.toString());
        }
    }
    
    @Override
    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
        super.onSizeChanged(w, h, oldw, oldh);
        /**
         * this help to break initial text.
         */
        if(w != oldw) {
            setBreakText(getText().toString());
        }
    }
    
    
    }
    

提交回复
热议问题