您的位置:首页 > 移动开发 > Android开发

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

2016-07-28 11:25 435 查看
【原创 转载请标明出处】

自定的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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息