最近总感觉写博客的激情不高,不知道为啥。放上效果图,demo在最下面
图上那个切换按钮的作用呢,就是模拟改变标签的个数动态变化整个控件的高度。
其实这个控件也算很简单的控件了。关键点只有两个
- 如何控制标签自动换行
- 切换数据源时动态改变控件的高度
再简单的控件也需要一点一点的码出来,咱就从最基础的属性设置开始。
public FlowTagView textColor(int defaultColor, int selectedColor){
this.textColorDefault = defaultColor;
this.textColorSelected = selectedColor;
return this;
}
public FlowTagView textSize(int textSize){
this.textSize = textSize;
return this;
}
public FlowTagView backgroundColor(int defaultColor, int selectedColor){
this.backgroundColorDefault = defaultColor;
this.backgroundColorSelected = selectedColor;
return this;
}
public FlowTagView padding(int horizontalPadding, int verticalPadding, int textHorizontalPadding){
this.horizontalPadding = horizontalPadding;
this.verticalPadding = verticalPadding;
this.textHorizontalPadding = textHorizontalPadding;
return this;
}
public FlowTagView itemHeight(int height){
this.itemHeight = height;
return this;
}
public FlowTagView datas(String[] datas){
this.datas = datas;
return this;
}
public FlowTagView listener(OnTagSelectedListener listener){
this.listener = listener;
return this;
}
上面设置了字体颜色啊,背景颜色啊,标签Item的高度啊,内补白和外部白的一些值,还有一个监听器。有的朋友就说了,我比较懒,就想快点看到效果,不想设置怎么办?怎么办?给默认值呗。
//常亮默认值,这些参数若不调用方法传递,则直接使用默认值
public static final int ROUND_RADIUS = 30;
public static final int TEXT_COLOR_DEFAULT = Color.BLACK;
public static final int TEXT_COLOR_SELECTED = Color.WHITE;
public static final int TEXT_SIZE = 30;
public static final int BACKGROUND_COLOR_DEFAULT = Color.GRAY;
public static final int BACKGROUND_COLOR_SELECTED = Color.GREEN;
public static final int HORIZONTAL_PADDING = 30;
public static final int VERTICAL_PADDING = 30;
public static final int TEXT_HORIZONTAL_PADDING = 30;
public static final int ITEM_HEIGHT = 60;
private Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
private int textColorDefault = TEXT_COLOR_DEFAULT;
private int textColorSelected = TEXT_COLOR_SELECTED;
private int textSize = TEXT_SIZE;
private int backgroundColorDefault = BACKGROUND_COLOR_DEFAULT;
private int backgroundColorSelected = BACKGROUND_COLOR_SELECTED;
//Tag之间的横向和纵向的间隔
private int horizontalPadding = HORIZONTAL_PADDING;
private int verticalPadding = VERTICAL_PADDING;
//每个Tag内部的横向间隔
private int textHorizontalPadding = TEXT_HORIZONTAL_PADDING;
//每个Tag的高度
private int itemHeight = ITEM_HEIGHT;
好了,基本的属性设置的代码完成了,那么就用软件的高内聚低耦合的思想封装一个标签类吧。
public class Tag{
//文本属性
public String text;
public int textColorDefault;
public int textColorSelected;
public int backgroundColorDefault;
public int backgroundColorSelected;
public boolean isSelected;
public Paint paint;
//文本的绘制起点
public int drawX;
public int drawY;
//整个Tag占用的坐标范围
public RectF rect = new RectF();
public Tag(String text, int textSize, int textColorDefault, int textColorSelected,
int backgroundColorDefault, int backgroundColorSelected,
Paint paint, int height, int horizontalPadding, int startX, int startY){
this.text = text;
this.textColorDefault = textColorDefault;
this.textColorSelected = textColorSelected;
this.backgroundColorDefault = backgroundColorDefault;
this.backgroundColorSelected = backgroundColorSelected;
this.paint = paint;
//求出整个Tag的宽度
paint.setTextSize(textSize);
int textWidth = (int)paint.measureText(text);
int width = textWidth + 2 * horizontalPadding;
//计算坐标范围,startX,staryY是指左上角的起点
rect.left = startX;
rect.top = startY;
rect.right = startX + width;
rect.bottom = startY + height;
//计算居中绘制时的绘制起点
drawX = startX + horizontalPadding;
Paint.FontMetrics metrics = paint.getFontMetrics();
drawY = (int)(startY + height / 2 + (metrics.b