Android流式标签布局,自定义标签控件tagView

                               我们在一些项目中会用到自定义流式布局,我个人觉得流式布局将呆板的布局错综排列,来提升用户体验度.(还可以不辜负美工妹子们的期望偷笑,人家毕竟也辛辛苦苦设计半天)。今天终于有时间来做做了。写的不好,很多地方值得改进望大家一起交流。

                  这是效果图:

                                         

                  

               实现基本功能:

                                首先来说明几点:

                                1.标签视图TagView直接继承TextView,这样有几个好处:不用去重写onMeasure()接口,                                              不用自己绘制Text,对Text控制也方便;
                                 2.标签布局TagGroup继承ViewGroup,需要重写onMeasure()和onLayout()方法来控制                                                     TagView的显示;

                   

                1. 实现TagView:

                                         

public class TagView extends TextView {

	// 3种模式:圆角矩形、圆弧、直角矩形
	public final static int MODE_ROUND_RECT = 1;
	public final static int MODE_ARC = 2;
	public final static int MODE_RECT = 3;

	private Paint mPaint;
	// 背景色
	private int mBgColor;
	// 边框颜色
	private int mBorderColor;
	// 边框大小
	private float mBorderWidth;
	// 边框角半径
	private float mRadius;
	// Tag内容
	private CharSequence mTagText;
	// 字体水平空隙
	private int mHorizontalPadding;
	// 字体垂直空隙
	private int mVerticalPadding;
	// 边框矩形
	private RectF mRect;
	// 调整标志位,只做一次
	private boolean mIsAdjusted = false;
	// 点击监听器
	private OnTagClickListener mTagClickListener;
	// 显示模式
	private int mTagMode = MODE_ROUND_RECT;

	public TagView(Context context, String text) {
		super(context);
		setText(text);
		_init(context);
	}

	public TagView(Context context, AttributeSet attrs) {
		super(context, attrs);
		_init(context);
	}

	/**
	 * 初始化
	 * 
	 * @param context
	 */
	private void _init(Context context) {
		mRect = new RectF();
		mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
		mTagText = getText();
		// 设置字体占中
		setGravity(Gravity.CENTER);
		setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				if (mTagClickListener != null) {
					mTagClickListener.onTagClick(String.valueOf(mTagText));
				}
			}
		});
		setOnLongClickListener(new OnLongClickListener() {
			@Override
			public boolean onLongClick(View v) {
				if (mTagClickListener != null) {
					mTagClickListener.onTagLongClick(String.valueOf(mTagText));
				}
				return true;
			}
		});
	}

	@Override
	protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
		super.onMeasure(widthMeasureSpec, heightMeasureSpec);
		_adjustText();
	}

	@Override
	protected void onSizeChanged(int w, int h, int oldw, int oldh) {
		super.onSizeChanged(w, h, oldw, oldh);
		// 设置矩形边框
		mRect.set(mBorderWidth, mBorderWidth, w - mBorderWidth, h
				- mBorderWidth);
	}

	@Override
	protected void onDraw(Canvas canvas) {
		// 绘制背景
		mPaint.setStyle(Paint.Style.FILL);
		mPaint.setColor(mBgColor);
		float radius = mRadius;
		if (mTagMode == MODE_ARC) {
			radius = mRect.height() / 2;
		} else if (mTagMode == MODE_RECT) {
			radius = 0;
		}
		canvas.drawRoundRect(m
  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值