• androi自定义自动换行的View(类似网页的标签Tag)


    看来只有礼拜天才有时间写点博客啊,平时只能埋头苦干了。今天在公司加班,遇到一个需求,就是自动换行的TextView,有点像网页的tag标签,点击一下,就自动加上去了,不过这个是根据后台拿来的数据来显示多少个View,在网上找找,看见了许多,我自己也封装写一个吧,以便以后需要...开工

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    package com.woyou.ui.component;
     
    import android.content.Context;
    import android.util.AttributeSet;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.TextView;
     
    import com.citaq.ideliver.R;
     
    /**
     * 自动换行的View
     *
     * @author shenzhou 2015年1月11日
     */
    public class WordWrapView extends ViewGroup {
        private static final int PADDING_HOR = 10;// 水平方向padding
        private static final int PADDING_VERTICAL = 15;// 垂直方向padding
        private static final int SIDE_MARGIN = 10;// 左右间距
        private static final int TEXT_MARGIN = 10;
     
        public WordWrapView(Context context) {
            super(context);
        }
     
        public WordWrapView(Context context, AttributeSet attrs) {
            super(context, attrs);
        }
     
        public WordWrapView(Context context, AttributeSet attrs, int defStyle) {
            super(context, attrs, defStyle);
        }
     
        @Override
        protected void onLayout(boolean changed, int l, int t, int r, int b) {
            int childCount = getChildCount();
            int autualWidth = r - l;
            int x = SIDE_MARGIN;// 横坐标开始
            int y = 0;// 纵坐标开始
            int rows = 1;
            for (int i = 0; i < childCount; i++) {
                View view = getChildAt(i);
                view.setBackgroundResource(R.drawable.shopdetail_keytag_bg);
                int width = view.getMeasuredWidth();
                int height = view.getMeasuredHeight();
                x += width + TEXT_MARGIN;
                if (x > autualWidth) {
                    x = width + SIDE_MARGIN;
                    rows++;
                }
                y = rows * (height + TEXT_MARGIN);
                if (i == 0) {
                    view.layout(x - width - TEXT_MARGIN, y - height, x
                            - TEXT_MARGIN, y);
                } else {
                    view.layout(x - width, y - height, x, y);
                }
            }
     
        }
     
        @Override
        protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
            int x = 0;// 横坐标
            int y = 0;// 纵坐标
            int rows = 1;// 总行数
            int specWidth = MeasureSpec.getSize(widthMeasureSpec);
            int actualWidth = specWidth - SIDE_MARGIN * 2;// 实际宽度
            int childCount = getChildCount();
            for (int index = 0; index < childCount; index++) {
                View child = (TextView) getChildAt(index);
                child.setPadding(PADDING_HOR, PADDING_VERTICAL, PADDING_HOR,
                        PADDING_VERTICAL);
                child.measure(MeasureSpec.UNSPECIFIED, MeasureSpec.UNSPECIFIED);
                int width = child.getMeasuredWidth();
                int height = child.getMeasuredHeight();
                x += width + TEXT_MARGIN;
                if (x > actualWidth) {// 换行
                    x = width;
                    rows++;
                }
                y = rows * (height + TEXT_MARGIN);
            }
            setMeasuredDimension(actualWidth, y);
        }
     
    }

    具体使用:

    我的项目的布局文件太长了,我就说了

    1
    <com.woyou.ui.component.wordwrapview style="@style/shopDetailTextStyle" android:id="@+id/shopdetail_container" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" android:paddingleft="@dimen/dp20" android:paddingright="@dimen/dp20" android:paddingtop="@dimen/dp10"></com.woyou.ui.component.wordwrapview>

    把这段布局文件加到你要把文字自动换行的地方。java文件中的使用:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    if ( !TextUtils.isEmpty(shopDetail.getInfo()) ) {
                        infoLin.setVisibility(View.VISIBLE);
                        //店铺关键字
                        String key = shopDetail.getKey();
                        strs = key.split("\|");
                        for (int i = 0; i < strs.length; i++) {
                              TextView textview = new TextView(mActivity);
                              textview.setText(strs[i]);
                              wordWrapView.addView(textview);
                        }
                        LogUtil.i(TAG, "tags:" + strs.toString());

    前面还有找到控件什么的,我相信大家都是知道的。这只是核心代码,效果图如下:

    加载中...

    <喎�"http://www.2cto.com/kf/ware/vc/" target="_blank" class="keylink">vcD4KPHA+KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKjwvcD4KPHA+KioqKioqKioqKioqKioqKioqKioqKr3pydzB7c3i0rvW1re9t6ijrMrHxLO49rTzyfHQtLXEo6yyu7n9w7u34tewo6y5qbTzvNKyzr+8KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKio8L3A+CjxwPioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKio8L3A+CjxwPjxwcmUgY2xhc3M9"brush:java;"> /** 标签之间的间距 px */ private final int itemMargins = (int) getContext().getResources().getDimension(R.dimen.dp15); /** 标签的行间距 px */ private final int lineMargins = (int) getContext().getResources().getDimension(R.dimen.dp10);

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    /**
         * 加载店铺关键字
         * @param tags
         */
        private void loadShopKeys (String[] tags) {
            if ( tags == null )
                return;
            final int containerWidth = container.getMeasuredWidth() - container.getPaddingRight()  - container.getPaddingLeft(); 
            final LayoutInflater inflater = mActivity.getLayoutInflater(); 
     
            /** 用来测量字符的宽度 */ 
            final Paint paint = new Paint(); 
            final TextView textView = (TextView) inflater.inflate(R.layout.item_textviewtag_lv, null); 
            final int itemPadding = textView.getCompoundPaddingLeft() + textView.getCompoundPaddingRight(); 
            final LinearLayout.LayoutParams tvParams = new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT,  LayoutParams.WRAP_CONTENT); 
            tvParams.setMargins(0, 0, itemMargins, 0); 
     
            paint.setTextSize(textView.getTextSize()); 
            LinearLayout layout = new LinearLayout(getContext()); 
            layout.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT)); 
            layout.setOrientation(LinearLayout.HORIZONTAL); 
            container.addView(layout); 
     
            final LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT); 
            params.setMargins(0, lineMargins, 0, 0); 
     
            /** 一行剩下的空间 **/ 
            int remainWidth = containerWidth; 
     
            for (int i = 0; i < tags.length; ++i) { 
                final String text = tags[i]; 
                final float itemWidth = paint.measureText(text) + itemPadding; 
                if (remainWidth > itemWidth) { 
                    addItemView(inflater, layout, tvParams, text); 
                } else
                    resetTextViewMarginsRight(layout); 
                    layout = new LinearLayout(getContext()); 
                    layout.setLayoutParams(params); 
                    layout.setOrientation(LinearLayout.HORIZONTAL); 
     
                    /** 将前面那一个textview加入新的一行 */ 
                    addItemView(inflater, layout, tvParams, text); 
                    container.addView(layout); 
                    remainWidth = containerWidth; 
                
                remainWidth = (int) (remainWidth - itemWidth + 0.5f) - itemMargins; 
            
            resetTextViewMarginsRight(layout); 
        
         
        /***************** 将每行最后一个textview的MarginsRight去掉 *********************************/ 
        private void resetTextViewMarginsRight(ViewGroup viewGroup) { 
            final TextView tempTx = (TextView) viewGroup.getChildAt(viewGroup.getChildCount() - 1); 
            tempTx.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)); 
        
       
        private void addItemView(LayoutInflater inflater, ViewGroup viewGroup, android.widget.LinearLayout.LayoutParams tvParams, String text) { 
            final TextView itemTx = (TextView) inflater.inflate(R.layout.item_textviewtag_lv, null); 
            itemTx.setText(text); 
            viewGroup.addView(itemTx, tvParams); 
        

    推推族,免费得门票,游景区:www.tuituizu.com

    结伴旅游,一个免费的交友网站:www.jieberu.com

  • 相关阅读:
    Mac开发者常用的工具
    10个常见的缓存使用误区
    果壳摘选
    WPF 无缝图片滚动
    WinForm 子线程修改主线程(UI线程)
    如何在WinForm中发送HTTP请求
    新闻接口调用之新浪滚动新闻
    使用json-lib进行Java和JSON之间的转换
    转载 一位程序员的妻子讲述她老公教给她了什么
    sae 上传文件 java实现
  • 原文地址:https://www.cnblogs.com/rabbit-bunny/p/4220673.html
Copyright © 2020-2023  润新知