带背景显示文字,自动换行的MultipleTextView

【原创 转载请标明出处】

自定的RelativeLayout,可实现带背景显示文字,自动换行。

直接上代码。拿过去就可以用。

package net.masonliu.multipletextview.library;

import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.util.AttributeSet;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewTreeObserver;
import android.widget.RelativeLayout;
import android.widget.TextView;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class MultipleTextViewGroup extends RelativeLayout {

    private Context context;
    private float textSize;
    private int textColor;
    private int wordMargin;
    private int lineMargin;
    private int textPaddingLeft;
    private int textPaddingRight;
    private int textPaddingTop;
    private int textPaddingBottom;
    private boolean overspread;
    private int columnNum;
    private int textBackground;

    private int layout_width;
    private int marginRight;
    private int marginLeft;

    private OnMultipleTVItemClickListener listener;

    public MultipleTextViewGroup(Context context, AttributeSet attrs) {
        super(context, attrs);
        this.context = context;

        TypedArray array = context.obtainStyledAttributes(attrs,
                R.styleable.MultipleTextViewGroup);
        textColor = array.getColor(R.styleable.MultipleTextViewGroup_textColor, 0XFF00FF00); // 提供默认值,放置未指定
        textSize = array.getDimension(R.styleable.MultipleTextViewGroup_textSize, 24);
        textSize = px2sp(context, textSize);
        wordMargin = array.getDimensionPixelSize(R.styleable.MultipleTextViewGroup_textWordMargin, 0);
        lineMargin = array.getDimensionPixelSize(R.styleable.MultipleTextViewGroup_textLineMargin, 0);
        textBackground = array.getResourceId(R.styleable.MultipleTextViewGroup_textBackground, -1);
        //array.getc
        textPaddingLeft = array.getDimensionPixelSize(R.styleable.MultipleTextViewGroup_textPaddingLeft, 0);
        textPaddingRight = array.getDimensionPixelSize(R.styleable.MultipleTextViewGroup_textPaddingRight, 0);
        textPaddingTop = array.getDimensionPixelSize(R.styleable.MultipleTextViewGroup_textPaddingTop, 0);
        textPaddingBottom = array.getDimensionPixelSize(R.styleable.MultipleTextViewGroup_textPaddingBottom, 0);
        overspread = array.getBoolean(R.styleable.MultipleTextViewGroup_overspread, false);
        columnNum = array.getInteger(R.styleable.MultipleTextViewGroup_columnNum, 1000);
        array.recycle();
        //下边是获取系统属性
        int[] attrsArray = new int[]{android.R.attr.id, // 0
                android.R.attr.background, // 1
                android.R.attr.layout_width, // 2
                android.R.attr.layout_height, // 3
                android.R.attr.layout_marginLeft, // 4
                android.R.attr.layout_marginRight // 5
        };
        TypedArray ta = context.obtainStyledAttributes(attrs, attrsArray);
        layout_width = ta.getLayoutDimension(2, ViewGroup.LayoutParams.MATCH_PARENT);
        marginRight = ta.getDimensionPixelSize(4, 0);
        marginLeft = ta.getDimensionPixelSize(5, 0);
        validateMargin();
        ta.recycle();
    }

    public static int px2sp(Context context, float pxValue) {
        final float fontScale = context.getResources().getDisplayMetrics().scaledDensity;
        return (int) (pxValue / fontScale + 0.5f);
    }

    public OnMultipleTVItemClickListener getOnMultipleTVItemClickListener() {
        return listener;
    }

    public void setOnMultipleTVItemClickListener(
            OnMultipleTVItemClickListener listener) {
        this.listener = listener;
    }

    private void validateMargin() {
        layout_width = layout_width - marginRight - marginLeft;
    }

    public void setTextViews(final List<String> dataList) {
        if (layout_width >= 0) {
            setTextViewsTrue(dataList);
        } else {
            ViewTreeObserver viewTreeObserver = getViewTreeObserver();
            if (viewTreeObserver.isAlive()) {
                viewTreeObserver.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
                    @Override
                    public void onGlobalLayout() {
                        getViewTreeObserver().removeGlobalOnLayoutListener(this);
                        layout_width = ((ViewGroup) getParent()).getWidth();
                        validateMargin();
                        setTextViewsTrue(dataList);
                    }
                });
            }
        }
    }

    private void setTextViewsTrue(List<String> dataList) {
        ViewGroup parentView = (ViewGroup) getParent();
        parentView.getWidth();
        if (dataList == null || dataList.size() == 0) {
            return;
        }

        int line = 0;
        Map<Integer, List<TextView>> lineMap = new HashMap<Integer, List<TextView>>();
        List<TextView> lineList = new ArrayList<TextView>();
        lineMap.put(0, lineList);

        int x = 0;
        int y = 0;

        for (int i = 0; i < dataList.size(); i++) {
            TextView tv = new TextView(context);
            tv.setText(dataList.get(i));
            tv.setTextSize(textSize);
            if (textBackground != -1)
                tv.setBackgroundResource(textBackground);

            tv.setTextColor(textColor);
            tv.setPadding(textPaddingLeft, textPaddingTop, textPaddingRight, textPaddingBottom);
            tv.setTag(i);// 标记position
            tv.setOnClickListener(new OnClickListener() {
                @Override
                public void onClick(View v) {
                    if (listener != null) {
                        listener.onMultipleTVItemClick(v, (Integer) v.getTag());
                    }
                }
            });

            int w = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED);
            int h = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED);
            tv.measure(w, h);
            int tvh = tv.getMeasuredHeight();
            int tvw = getMeasuredWidth(tv);

            RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(
                    LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
            if (x + tvw > layout_width || lineMap.get(line).size() >= columnNum) {
                x = 0;
                y = y + tvh + lineMargin;

                line++;
                lineMap.put(line, new ArrayList<TextView>());
            }
            lp.leftMargin = x;
            lp.topMargin = y;
            x = x + tvw + wordMargin;
            tv.setLayoutParams(lp);
            lineMap.get(line).add(tv);
        }

        for (int i = 0; i <= line; i++) {
            int padding = 0;
            if (overspread) {
                // 该行最后一个位置
                int len = lineMap.get(i).size();
                TextView tView = lineMap.get(i).get(len - 1);

                RelativeLayout.LayoutParams lp = (RelativeLayout.LayoutParams) tView.getLayoutParams();
                int right = lp.leftMargin + getMeasuredWidth(tView);
                int emptyWidth = layout_width - right;
                padding = emptyWidth / (len * 2);
            }


            int leftOffset = 0;
            for (int j = 0; j < lineMap.get(i).size(); j++) {
                TextView tView2 = lineMap.get(i).get(j);

                if (overspread) {
                    RelativeLayout.LayoutParams lp2 = (RelativeLayout.LayoutParams) tView2.getLayoutParams();
                    lp2.leftMargin = lp2.leftMargin + leftOffset;
                    leftOffset = (j + 1) * 2 * padding;
                }

                tView2.setPadding(
                        tView2.getPaddingLeft() + padding,
                        tView2.getPaddingTop(),
                        tView2.getPaddingRight() + padding,
                        tView2.getPaddingBottom());

                addView(tView2);
            }
        }
    }

    @Override
    protected void dispatchDraw(Canvas canvas) {
        super.dispatchDraw(canvas);

    }

    public int getMeasuredWidth(View v) {
        return v.getMeasuredWidth();
    }

    public interface OnMultipleTVItemClickListener {
        void onMultipleTVItemClick(View view, int position);
    }
}
里面用到的一些attrs,copy到values文件下,创建一个attrs.xml文件。把下面的代码粘进去就ok了。当然也可以改高啊,宽啊啥的

<resources>

    <declare-styleable name="MultipleTextViewGroup">
        <attr name="textColor" format="color" />
        <attr name="textSize" format="dimension" />
        <attr name="textWordMargin" format="dimension" />
        <attr name="textLineMargin" format="dimension" />
        <attr name="textBackground" format="reference" />

        <attr name="textPaddingLeft" format="dimension" />
        <attr name="textPaddingRight" format="dimension" />
        <attr name="textPaddingTop" format="dimension" />
        <attr name="textPaddingBottom" format="dimension" />

        <attr name="overspread" format="boolean" />
        <attr name="columnNum" format="integer" />
    </declare-styleable>

</resources>
自定义的背景边框

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">

    <stroke
        android:width="0.5px"
        android:color="#ddd" />
    <corners
        android:radius="150dp">

    </corners>
    <solid android:color="#eee" />

</shape>
使用的时候,直接上。

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/container"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <net.masonliu.multipletextview.library.MultipleTextViewGroup xmlns:app="http://schemas.android.com/apk/res-auto"
        android:id="@+id/main_rl"
        android:layout_width="wrap_content"
        android:layout_marginLeft="10dp"
        android:layout_marginRight="10dp"
        android:layout_height="wrap_content"
        app:textSize="12sp"
        app:textWordMargin="10dp"
        app:textLineMargin="10dp"
        app:textColor="#ff0000"
        app:textBackground="@drawable/shape_tag_grey_with_border"
        app:textPaddingLeft="10dp"
        app:textPaddingRight="10dp"
        app:textPaddingTop="10dp"
        app:textPaddingBottom="10dp"
        app:overspread="false" />

</LinearLayout>

附上git;

https://github.com/SingleShu/MultipleTextView




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值