0
点赞
收藏
分享

微信扫一扫

Android计算字符串显示宽度


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

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

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

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

TextPaint paint = view.getPaint();

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

TextView view是显示字符串的TextView

CharSequence source 是字符串配列

int start是开始位置。

使用例:

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 条评论