Android TagFlowLayout完全解析 一款针对Tag的布局

}

@Override

public void onChanged()

{

changeAdapter();

}

ok,可以看到当你调用setAdapter进来,首先我们会注册mTagAdapter.setOnDataChangedListener这个回调,主要是用于响应notifyDataSetChanged()。然后进入changeAdapter方法,在这里首先移除所有的子View,然后根据mAdapter.getView的返回,开始逐个构造子View,然后进行添加。

这里注意下:我们的上述的代码,对mAdapter.getView返回的View,外围报了一层TagView,这里暂时不要去想,我们后面会细说。

到此,我们的Adapter添加完毕。


三、支持onTagClickListener


ok,这个接口也非常重要,当然我私下了解了下,很多同学都加上了,但是基本都是对单个标签View去setOnClickListener,然后去比对Tag确定点击的是哪个标签,最后回调出来。当然,我们这里考虑一种更优雅的方式:

我们从父控件下手,当我们确定用户点击在我们的TagFlowLayout上时,我们根据用户点击的坐标,看看是否点击的是我们的某个View,然后进行click回调。是不是有点像事件分发,哈,我们这里可以称为点击分发。

那么,我们需要关注的就是onTouchEventperformClick方法。

@Override

public boolean onTouchEvent(MotionEvent event)

{

if (event.getAction() == MotionEvent.ACTION_UP)

{

mMotionEvent = MotionEvent.obtain(event);

}

return super.onTouchEvent(event);

}

@Override

public boolean performClick()

{

if (mMotionEvent == null) return super.performClick();

int x = (int) mMotionEvent.getX();

int y = (int) mMotionEvent.getY();

mMotionEvent = null;

TagView child = findChild(x, y);

int pos = findPosByView(child);

if (child != null)

{

doSelect(child, pos);

if (mOnTagClickListener != null)

{

return mOnTagClickListener.onTagClick(child.getTagView(), pos, this);

}

}

return super.performClick();

}

private TagView findChild(int x, int y)

{

final int cCount = getChildCount();

for (int i = 0; i < cCount; i++)

{

TagView v = (TagView) getChildAt(i);

if (v.getVisibility() == View.GONE) continue;

Rect outRect = new Rect();

v.getHitRect(outRect);

if (outRect.contains(x, y))

{

return v;

}

}

return null;

}

可以看到我们这里巧妙的利用了performClick这个回调,来确定的确是触发了click事件,而不是自己去判断什么算click的条件。但是呢,我们的performClick没有提供MotionEvent的参数,不过不要紧,我们都清楚click的事件发生在ACTION_UP之后,所以我们提供一个变量去记录最后

  • 29
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值