一行代碼給你的控件加上徽章(Badge)
不廢話,先上圖
其實在開發眾多APP中,可能我們都需要用到這種BadgeView控件,以前可能是在需要的地方加個圖標上去,這樣每次有這樣的需求的時候就需要在布局里寫個控件上去,很麻煩。網上看了其他庫也是在封裝成一個父布局控件,在XML里面還需要寫一次。后面想能不能不用綁定布局直接以一種最簡單的辦法加上這個徽章。于是我的BadgeView誕生了。
先說使用方法
復雜一點的寫法:
BadgeFactory.create(this) .setTextColor(Color.White) .setWidthAndHeight(25,25) .setBadgeBackground(Color.Red) .setTextSize(10) .setBadgeGravity(Gravity.Right|Gravity.Top) .setBadgeCount(20) .setShape(BadgeView.SHAPE_CIRCLE) .setSpace(10,10) //設置綁定的view和badgeview之間的空隙 .bind(view);
BadgeFactory內置了幾個封裝好的構造方法,可以直接一步到位,于是:
BadgeFactory.createDot(this).setBadgeCount(20).bind(imageView); BadgeFactory.createCircle(this).setBadgeCount(20).bind(imageView); BadgeFactory.createRectangle(this).setBadgeCount(20).bind(imageView); BadgeFactory.createOval(this).setBadgeCount(20).bind(imageView); BadgeFactory.createSquare(this).setBadgeCount(20).bind(imageView); BadgeFactory.createRoundRect(this).setBadgeCount(20).bind(imageView);
是不是覺得很簡單多了,不再需要寫進XML布局。當你需要取消綁定的時候直接調用
badgeView.unbind();
原理
其實原理也很簡單,首先判斷要綁定的view是否有父布局包裹著,有就取出view,將view和badgeview包裹一起之后再放回去。
先取出view并判斷在父布局中的位置
ViewGroupparentContainer=(ViewGroup) view.getParent(); int viewIndex=((ViewGroup) view.getParent()).indexOfChild(view); ((ViewGroup) view.getParent()).removeView(view);
然后設置一些寬高位置屬性之后(代碼太多就不貼了),最后將兩個view放進一個FrameLayout里面,然后FrameLayout添加進原來的布局中。
container.addView(view); container.addView(this); parentContainer.addView(container, viewIndex);
想要更詳細了解控件,可以直接去github上查看
傳送門
各位看官覺老爺得不錯star小弟一波,(__) 。同時希望關注下我的其他項目。