Android计算字符串显示宽度

字符串显示时的宽度通过字符串的个数/长度是没有办法取得

因为涉及到字体,大小,全角/半角,

甚至英文字i和T的宽度也是截然不同的。

 

使用下面的方法, 可以取得字符串显示的宽度。

 

TextPaint paint = view.getPaint();

int width = Layout.getDesiredWidth(source, start, index, paint);

 

TextView view是显示字符串的TextView

CharSequence source 是字符串配列

int start是开始位置。

int index是字符个数 

 

使用例:

mainActivity

-------------------------------------------------------------------------------------------------

        mItem = new ArrayList();
        mItem.add("あいうえおーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー");
        if (progDataAryList != null) {
            for (int i = 0; i < progDataAryList.size(); i++) {
             mItem.add(((String[]) progDataAryList.get(i))[1]);
            }
        }

        MyAdapter myAdapter = new MyAdapter(activity, R.layout.simple_list_item, R.id.simple_list_text1, mItem);

        // アダプターを設定します
        listView.setAdapter(myAdapter);

-------------------------------------------------------------------------------------------------

 

private class MyAdapter extends ArrayAdapter {
        private int mResource;
        private int mFieldId;
        private LayoutInflater mInflater;
        private List mStringobjects = new ArrayList();

        public MyAdapter(Context context, int resource, int textViewResourceId, List objects) {
            super(context, resource, textViewResourceId, objects);

            mResource = resource;
            mFieldId = textViewResourceId;
            mInflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            mStringobjects = objects;
        }

        public View getView(int position, View convertView, ViewGroup parent) {

            View view;
            TextView text;

            if (convertView == null) {
                view = mInflater.inflate(mResource, parent, false);
            } else {
                view = convertView;
            }

            try {
                text = (TextView)view.findViewById(mFieldId);
            } catch (ClassCastException e) {
             String stack = Log.getStackTraceString(e);
                SaveLog.put(activity, stack);
                throw new IllegalStateException("resource ID error", e);
            }

            text.setFilters(new InputFilter[] {new LineFeedFilter(text)});
            text.setText(mStringobjects.get(position));

            ListView listView = (ListView) activity.findViewById(R.id.prog_listview1);
            if (position == listView.getCheckedItemPosition()) {
                if (convertView != null) {
                    convertView.setBackgroundResource(R.drawable.textviewtype2);
                }
            } else {
                if (convertView != null) {
                    convertView.setBackgroundColor(Color.TRANSPARENT);
                }
            }

            return view;
        }
    }

-------------------------------------------------------------------------------------------------

private class LineFeedFilter implements InputFilter {
        private final TextView view;

        public LineFeedFilter(TextView view) {
            this.view = view;
        }

        public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {

            TextPaint paint = view.getPaint();
            int width = view.getWidth() - view.getCompoundPaddingLeft() - view.getCompoundPaddingRight();

            if (width <= 0){
             ListView listView = (ListView) activity.findViewById(R.id.prog_listview1);
             width = listView.getWidth() - listView.getPaddingLeft() -listView.getPaddingRight()
               - view.getCompoundPaddingLeft() - view.getCompoundPaddingRight();
            }
            SpannableStringBuilder result = new SpannableStringBuilder();
            for (int index = start; index < end; index++) {
                if (Layout.getDesiredWidth(source, start, index + 1, paint) > width) {
                 // 幅を越えたら改行を挿入
                    result.append(source.subSequence(start, index));
                    result.append("\n");
                    start = index;

                } else if (source.charAt(index) == '\n') {
                 // 改行文字があれば、ここまで出力
                    result.append(source.subSequence(start, index));
                    start = index;
                }
            }

            if (start < end) {
             // 残りの文字を追加
                result.append(source.subSequence(start, end));
            }
            return result;
        }
    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值