Viewbadger项目的下载地址https://github.com/jgilfelt/android-viewbadger
首先是使用方法
BadgeView badgeView = new BadgeView(this, iv1);
//设置消息内容 badge.setText("1"); //设置消息内容的字体大小 badgeView.setTextSize(8.5f); badgeView2.setBackgroundResource(R.drawable.noread); //设置消息内容的字体颜色 badgeView.setTextColor(Color.DKGRAY); badge.show(); //隐藏badgeView
</pre><pre>
badgeView.sethide(); badgeView.setVisibility(View.GONE);
上面是一些属性设置的使用方法,接下来解析一下BadgeView的实现原理:
BadgeView继承自textview,只不过在他的parentview和自己之间再加了一层framelayout,从BadgeView的显示效果上来看,我们也基本尚能看出他的结构:framelayout上一个要显示消息提示的view,一个BadgeView显示提示的消息。具体实现:在BadgeView的构造方法中new BadgeView(this,targetview),targetview是和BadgeView绑定的view,首先主要做的事情就是得到targetview的parentview,从这个parentview中移除targetview,并添加一个framelayout取而代之,之后在这个framelayout中添加被移除的targetview以及BadgeView自身:
private void applyTo(View target) { LayoutParams lp = target.getLayoutParams(); ViewParent parent = target.getParent(); FrameLayout container = new FrameLayout(context); if (target instanceof TabWidget) { // set target to the relevant tab child container target = ((TabWidget) target).getChildTabViewAt(targetTabIndex); this.target = target; ((ViewGroup) target).addView(container, new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT)); this.setVisibility(View.GONE); container.addView(this); } else { // TODO verify that parent is indeed a ViewGroup ViewGroup group = (ViewGroup) parent; int index = group.indexOfChild(target); group.removeView(target); group.addView(container, index, lp); container.addView(target); this.setVisibility(View.GONE); container.addView(this); group.invalidate(); } }
随后在显示的时候设置一些BadgeView在framelayout中的显示属性(背景,字体颜色等)。。。。这样就完成了BadgeView,比较的简单,源码中也就一个类。
补上加了注释的源码:http://download.csdn.net/detail/u012806692/9453562