Android TextView 不同主题下两边对齐


问题描述

这两天遇到了一个TextView字体对齐的问题,就是两个汉字,三个汉字和四个汉字对齐的问题,之前我采用的方法是用空格(使用\t是不可行的)或者两个字与四个字对齐时使用全角中文打空格,但是三个字就不好对齐,所以最后我选择了空格,但现在出现一个问题是Android主题修改的问题,有的主题自带的字体所占据宽度的是不一样的,导致本应该对齐的而无法对齐。

解决方法

这种情况要做各个屏幕和主题适配工作,解决方法是自定义TextView,比如:平均间距 =(四个字的宽度-两个字的宽度)/ (2-1)然后设置每个字的间距为平均间距:

public class JustifyTextView extends TextView {

    private int mLineY;
    private float mViewWidth = 0;

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

    @Override
    protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
        super.onLayout(changed, left, top, right, bottom);
    }

    @Override
    protected void onDraw(Canvas canvas) {

        TextPaint paint = getPaint();
        paint.setColor(getCurrentTextColor());
        paint.drawableState = getDrawableState();
        String text = (String) getText();
        mLineY = 0;
        mLineY += getTextSize();
        float width = StaticLayout.getDesiredWidth(text, 0, text.length(), getPaint());
        drawScaledText(canvas, text, width);
        Paint.FontMetrics fm = paint.getFontMetrics();
        int textHeight = (int) fm.top;
        mLineY += textHeight;
    }

    private void drawScaledText(Canvas canvas, String line, float lineWidth) {
        float x = 0;
        float d = (mViewWidth - lineWidth) / (line.length() - 1);

        for (int i = 0; i < line.length(); i++) {
            String c = String.valueOf(line.charAt(i));
            float cw = StaticLayout.getDesiredWidth(c, getPaint());
            canvas.drawText(c, x, mLineY, getPaint());
            x += cw + d;
        }
    }

    public void setTitleWidth( TextView tv ){
        String text = (String) tv.getText();
        float width = StaticLayout.getDesiredWidth(text, 0, text.length(), tv.getPaint());
        mViewWidth = width;
        setWidth((int) mViewWidth);
        invalidate();
    }

}
在使用的地方这样使用:

<com.yitu8.client.application.views.JustifyTextView
                        android:id="@+id/tv_hb"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:layout_marginLeft="30dp"
                        android:text="航班"
                        android:textColor="@color/home_text"
                        android:textSize="@dimen/font_14_size"
                         />
在组件中调用setTitleWith()将宽度设置成较长的标题:

tv_hb.setTitleWidth(tv_ycsj);
tv_mdd.setTitleWidth(tv_ycsj);




评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值