Android实战简易教程<四十二>(github实用控件推荐BadgeView-图标左上角消息提示控件)

来源:互联网 发布:禁毒网络知识答题 编辑:程序博客网 时间:2024/06/06 17:43

微信和QQ的左上角消息提示大家都十分有印象,有强迫症的童鞋总是忍不住的要点掉它,我们怎么将这样一个小功能引入到自己的项目中呢?

github上有一款控件可以帮助我们实现这个功能,下面我们就看一下这个控件的使用吧。

下面我们看一下自带的实例,分别介绍了普通控件和ListView控件中如何使用消息提示控件,首先我们看一下普通控件的使用。

一、普通控件引入消息提示控件:

[java] view plaincopy
  1. /* 
  2.  * ViewsFragment.java 
  3.  * BadgeViewDemo 
  4.  *  
  5.  * Copyright (c) 2013 Stefan Jauker. 
  6.  * https://github.com/kodex83/BadgeView 
  7.  *  
  8.  * Licensed under the Apache License, Version 2.0 (the "License"); 
  9.  * you may not use this file except in compliance with the License. 
  10.  * You may obtain a copy of the License at 
  11.  *  
  12.  * http://www.apache.org/licenses/LICENSE-2.0 
  13.  *  
  14.  * Unless required by applicable law or agreed to in writing, software 
  15.  * distributed under the License is distributed on an "AS IS" BASIS, 
  16.  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
  17.  * See the License for the specific language governing permissions and 
  18.  * limitations under the License. 
  19.  */  
  20.   
  21. package com.jauker.badgeview.example;  
  22.   
  23. import android.graphics.Color;  
  24. import android.graphics.Typeface;  
  25. import android.os.Bundle;  
  26. import android.support.v4.app.Fragment;  
  27. import android.util.Log;  
  28. import android.view.Gravity;  
  29. import android.view.LayoutInflater;  
  30. import android.view.View;  
  31. import android.view.View.OnClickListener;  
  32. import android.view.ViewGroup;  
  33.   
  34. import com.jauker.widget.BadgeView;  
  35.   
  36.   
  37. public class ViewsFragment extends Fragment implements OnClickListener {  
  38.   
  39.     private BadgeView backgroundDrawableBadge;  
  40.     private BadgeView backgroundShapeBadge;  
  41.     private BadgeView backgroundDefaultBadge;  
  42.     private BadgeView counterBadge;  
  43.     private BadgeView gravityBadge;  
  44.     private BadgeView textStyleBadge;  
  45.     private BadgeView visibilityBadgeView;  
  46.   
  47.     /* 
  48.      * (non-Javadoc) 
  49.      *  
  50.      * @see android.support.v4.app.Fragment#onCreateView(android.view.LayoutInflater, android.view.ViewGroup, android.os.Bundle) 
  51.      */  
  52.     @Override  
  53.     public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {  
  54.         View layout = inflater.inflate(R.layout.fragment_views, null);  
  55.   
  56.         View backgroundDefaultView = layout.findViewById(R.id.backgroundDefault);  
  57.         backgroundDefaultBadge = new BadgeView(getActivity());//初始化控件  
  58.         backgroundDefaultBadge.setBadgeCount(42);  
  59.         backgroundDefaultBadge.setTargetView(backgroundDefaultView);  
  60.   
  61.         View backgroundDrawableView = layout.findViewById(R.id.backgroundDrawable);  
  62.         backgroundDrawableBadge = new BadgeView(getActivity());  
  63.         backgroundDrawableBadge.setBadgeCount(88);  
  64.         backgroundDrawableBadge.setBackgroundResource(R.drawable.badge_blue);//设置背景  
  65.         backgroundDrawableBadge.setTargetView(backgroundDrawableView);  
  66.   
  67.         View backgroundShapeView = layout.findViewById(R.id.backgroundShape);  
  68.         backgroundShapeBadge = new BadgeView(getActivity());  
  69.         backgroundShapeBadge.setBadgeCount(47);  
  70.         backgroundShapeBadge.setBackground(12, Color.parseColor("#9b2eef"));  
  71.         backgroundShapeBadge.setTargetView(backgroundShapeView);  
  72.   
  73.         View counterView = layout.findViewById(R.id.counter);  
  74.         counterView.setOnClickListener(this);  
  75.         counterBadge = new BadgeView(getActivity());  
  76.         counterBadge.setBadgeCount(-2);  
  77.         counterBadge.setTargetView(counterView);  
  78.   
  79.         View gravityView = layout.findViewById(R.id.gravity);  
  80.         gravityView.setOnClickListener(this);  
  81.         gravityBadge = new BadgeView(getActivity());  
  82.         gravityBadge.setBadgeGravity(Gravity.LEFT | Gravity.BOTTOM);  
  83.         gravityBadge.setBadgeCount(4);  
  84.         gravityBadge.setTargetView(gravityView);  
  85.   
  86.         View textStyleView = layout.findViewById(R.id.textStyle);  
  87.         textStyleView.setOnClickListener(this);  
  88.         textStyleBadge = new BadgeView(getActivity());  
  89.         textStyleBadge.setBadgeCount(18);  
  90.         textStyleBadge.setTargetView(textStyleView);  
  91.         textStyleBadge.setTypeface(Typeface.create(Typeface.SANS_SERIF, Typeface.ITALIC));  
  92.         textStyleBadge.setShadowLayer(2, -1, -1, Color.GREEN);  
  93.   
  94.         View visibilityView = layout.findViewById(R.id.visibility);  
  95.         visibilityView.setOnClickListener(this);  
  96.         visibilityBadgeView = new BadgeView(getActivity());  
  97.         visibilityBadgeView.setBadgeCount(1);  
  98.         visibilityBadgeView.setTargetView(visibilityView);  
  99.   
  100.         return layout;  
  101.     }  
  102.   
  103.     /* 
  104.      * (non-Javadoc) 
  105.      *  
  106.      * @see android.view.View.OnClickListener#onClick(android.view.View) 
  107.      */  
  108.     @Override  
  109.     public void onClick(View v) {  
  110.         switch (v.getId()) {  
  111.             case R.id.counter: {  
  112.                 counterBadge.incrementBadgeCount(1);  
  113.                 break;  
  114.             }  
  115.   
  116.             case R.id.gravity: {  
  117.                 gravityBadge.incrementBadgeCount(1);  
  118.                 Log.d(getClass().getName(), String.valueOf(gravityBadge.getBadgeCount() % 9));  
  119.                 if (gravityBadge.getBadgeCount() % 9 == 0) {  
  120.                     gravityBadge.setBadgeGravity(Gravity.LEFT | Gravity.TOP);  
  121.                 } else if (gravityBadge.getBadgeCount() % 9 == 1) {  
  122.                     gravityBadge.setBadgeGravity(Gravity.RIGHT | Gravity.BOTTOM);  
  123.                 } else if (gravityBadge.getBadgeCount() % 9 == 2) {  
  124.                     gravityBadge.setBadgeGravity(Gravity.LEFT | Gravity.BOTTOM);  
  125.                 } else if (gravityBadge.getBadgeCount() % 9 == 3) {  
  126.                     gravityBadge.setBadgeGravity(Gravity.RIGHT | Gravity.TOP);  
  127.                 } else if (gravityBadge.getBadgeCount() % 9 == 4) {  
  128.                     gravityBadge.setBadgeGravity(Gravity.LEFT | Gravity.CENTER_VERTICAL);  
  129.                 } else if (gravityBadge.getBadgeCount() % 9 == 5) {  
  130.                     gravityBadge.setBadgeGravity(Gravity.RIGHT | Gravity.CENTER_VERTICAL);  
  131.                 } else if (gravityBadge.getBadgeCount() % 9 == 6) {  
  132.                     gravityBadge.setBadgeGravity(Gravity.CENTER);  
  133.                 } else if (gravityBadge.getBadgeCount() % 9 == 7) {  
  134.                     gravityBadge.setBadgeGravity(Gravity.CENTER_HORIZONTAL | Gravity.TOP);  
  135.                 } else if (gravityBadge.getBadgeCount() % 9 == 8) {  
  136.                     gravityBadge.setBadgeGravity(Gravity.CENTER_HORIZONTAL | Gravity.BOTTOM);  
  137.                 }  
  138.                 break;  
  139.             }  
  140.             case R.id.visibility: {  
  141.                 visibilityBadgeView.setVisibility(visibilityBadgeView.getVisibility() == View.GONE ? View.VISIBLE : View.GONE);  
  142.                 break;  
  143.             }  
  144.   
  145.             default:  
  146.                 break;  
  147.         }  
  148.   
  149.     }  
  150. }  

这里主要有几个方法需要注意:

1.

[java] view plaincopy
  1. setBadgeCount(42);//一般用来表示消息的个数  

2.

[java] view plaincopy
  1. setBackgroundResource(R.drawable.badge_blue);//设置消息提示背景图片  
3.

[java] view plaincopy
  1. setBadgeGravity(Gravity.LEFT | Gravity.BOTTOM);//设置消息提示的位置  
4.

[java] view plaincopy
  1. setBackground(12, Color.parseColor("#9b2eef"));//设置背景颜色  
5.

[java] view plaincopy
  1. setTypeface(Typeface.create(Typeface.SANS_SERIF, Typeface.ITALIC));//设置显示字体  
6.

[java] view plaincopy
  1. setTargetView(counterView);//不要忘了添加这个,设置显示在哪个控件上  
运行效果如下:


二、ListView引入消息提示控件:

代码如下:

[java] view plaincopy
  1. /* 
  2.  * ListFragment.java 
  3.  * BadgeViewDemo 
  4.  *  
  5.  * Copyright (c) 2013 Stefan Jauker. 
  6.  * https://github.com/kodex83/BadgeView 
  7.  *  
  8.  * Licensed under the Apache License, Version 2.0 (the "License"); 
  9.  * you may not use this file except in compliance with the License. 
  10.  * You may obtain a copy of the License at 
  11.  *  
  12.  * http://www.apache.org/licenses/LICENSE-2.0 
  13.  *  
  14.  * Unless required by applicable law or agreed to in writing, software 
  15.  * distributed under the License is distributed on an "AS IS" BASIS, 
  16.  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
  17.  * See the License for the specific language governing permissions and 
  18.  * limitations under the License. 
  19.  */  
  20.   
  21. package com.jauker.badgeview.example;  
  22.   
  23. import android.content.Context;  
  24. import android.os.Bundle;  
  25. import android.view.Gravity;  
  26. import android.view.LayoutInflater;  
  27. import android.view.View;  
  28. import android.view.ViewGroup;  
  29. import android.widget.BaseAdapter;  
  30. import android.widget.TextView;  
  31.   
  32. import com.jauker.widget.BadgeView;  
  33.   
  34.   
  35. /** 
  36.  * Demonstrates the BadgeView with a ListView. 
  37.  * Based on Android API-Demos -> List14 
  38.  */  
  39. public class ListFragment extends android.support.v4.app.ListFragment {  
  40.   
  41.     @Override  
  42.     public void onCreate(Bundle savedInstanceState) {  
  43.         super.onCreate(savedInstanceState);  
  44.         setListAdapter(new ListAdapter(getActivity()));  
  45.     }  
  46.   
  47.     private static class ListAdapter extends BaseAdapter {  
  48.         private static final String[] DATA = Cheeses.sCheeseStrings;  
  49.   
  50.         private LayoutInflater mInflater;  
  51.         private Context mContext;  
  52.   
  53.         public ListAdapter(Context context) {  
  54.             // Cache the LayoutInflate to avoid asking for a new one each time.  
  55.             mInflater = LayoutInflater.from(context);  
  56.             mContext = context;  
  57.         }  
  58.   
  59.         /** 
  60.          * The number of items in the list is determined by the number of speeches 
  61.          * in our array. 
  62.          *  
  63.          * @see android.widget.ListAdapter#getCount() 
  64.          */  
  65.         @Override  
  66.         public int getCount() {  
  67.             return DATA.length;  
  68.         }  
  69.   
  70.         /** 
  71.          * Since the data comes from an array, just returning the index is 
  72.          * sufficent to get at the data. If we were using a more complex data 
  73.          * structure, we would return whatever object represents one row in the 
  74.          * list. 
  75.          *  
  76.          * @see android.widget.ListAdapter#getItem(int) 
  77.          */  
  78.         @Override  
  79.         public Object getItem(int position) {  
  80.             return position;  
  81.         }  
  82.   
  83.         /** 
  84.          * Use the array index as a unique id. 
  85.          *  
  86.          * @see android.widget.ListAdapter#getItemId(int) 
  87.          */  
  88.         @Override  
  89.         public long getItemId(int position) {  
  90.             return position;  
  91.         }  
  92.   
  93.         /** 
  94.          * Make a view to hold each row. 
  95.          *  
  96.          * @see android.widget.ListAdapter#getView(int, android.view.View, android.view.ViewGroup) 
  97.          */  
  98.         @Override  
  99.         public View getView(int position, View convertView, ViewGroup parent) {  
  100.             ViewHolder holder;  
  101.   
  102.             if (convertView == null) {  
  103.                 convertView = mInflater.inflate(R.layout.list_row_badge, null);  
  104.                 holder = new ViewHolder();  
  105.                 holder.text = (TextView) convertView.findViewById(android.R.id.text1);  
  106.                 holder.badge = new BadgeView(mContext);  
  107.                 holder.badge.setTargetView(holder.text);  
  108.                 holder.badge.setBadgeGravity(Gravity.CENTER_VERTICAL | Gravity.RIGHT);//设置显示位置  
  109.                 holder.badge.setBadgeMargin(0080);//设置边距  
  110.                 convertView.setTag(holder);  
  111.             } else {  
  112.                 holder = (ViewHolder) convertView.getTag();  
  113.             }  
  114.   
  115.             holder.text.setText(DATA[position]);  
  116.             holder.badge.setBadgeCount(DATA[position].length());//字母长度  
  117.   
  118.             return convertView;  
  119.         }  
  120.   
  121.         static class ViewHolder {  
  122.             TextView text;  
  123.             BadgeView badge;  
  124.         }  
  125.     }  
  126. }  
注意几个方法:

1.

[java] view plaincopy
  1. setBadgeGravity(Gravity.CENTER_VERTICAL | Gravity.RIGHT);//设置显示位置  
2.
[java] view plaincopy
  1. setBadgeMargin(0080);//设置边距  
3.

[java] view plaincopy
  1. setBadgeCount(DATA[position].length());//设置显示的数字为字母长度  

运行实例:


最后再介绍一下引入工程的方法:

将工程:


拷入到你的项目的同级目录,然后导入:


你就可以像上面Demo那样使用本控件了。

0 0
原创粉丝点击