zoukankan      html  css  js  c++  java
  • BadgeView新提示开源工具类

    BadgeView是使用某个图标作为新功能的提醒,类似于收到短息后短信图标的右上方有信息数目或者其他的显示性提示。BadgeView很好的实现了这个功能,而且进行了拓展,可自定义位置和提示图标。

    工具类源码如下:

    package cn.car273.widget;
    
    
    /*
     * BadgeView.java
     * BadgeView
     * 
     * Copyright (c) 2012 Stefan Jauker.
     * https://github.com/kodex83/BadgeView
     * 
     * Licensed under the Apache License, Version 2.0 (the "License");
     * you may not use this file except in compliance with the License.
     * You may obtain a copy of the License at
     * 
     * http://www.apache.org/licenses/LICENSE-2.0
     * 
     * Unless required by applicable law or agreed to in writing, software
     * distributed under the License is distributed on an "AS IS" BASIS,
     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     * See the License for the specific language governing permissions and
     * limitations under the License.
     */
    
    
    import android.content.Context;
    import android.graphics.Color;
    import android.graphics.Typeface;
    import android.graphics.drawable.ShapeDrawable;
    import android.graphics.drawable.shapes.RoundRectShape;
    import android.util.AttributeSet;
    import android.util.Log;
    import android.util.TypedValue;
    import android.view.Gravity;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.FrameLayout;
    import android.widget.FrameLayout.LayoutParams;
    import android.widget.TabWidget;
    import android.widget.TextView;
    
    
    public class BadgeView extends TextView {
    
        private boolean mHideOnNull = true;
    
        public BadgeView(Context context) {
            this(context, null);
        }
    
        public BadgeView(Context context, AttributeSet attrs) {
            this(context, attrs, android.R.attr.textViewStyle);
        }
    
        public BadgeView(Context context, AttributeSet attrs, int defStyle) {
            super(context, attrs, defStyle);
    
            init();
        }
    
        private void init() {
            if (!(getLayoutParams() instanceof LayoutParams)) {
                LayoutParams layoutParams =
                        new LayoutParams(
                                android.view.ViewGroup.LayoutParams.WRAP_CONTENT,
                                android.view.ViewGroup.LayoutParams.WRAP_CONTENT,
                                Gravity.RIGHT | Gravity.TOP);
                setLayoutParams(layoutParams);
            }
    
            // set default font
            setTextColor(Color.WHITE);
            setTypeface(Typeface.DEFAULT_BOLD);
            setTextSize(TypedValue.COMPLEX_UNIT_SP, 11);
            setPadding(dip2Px(5), dip2Px(1), dip2Px(5), dip2Px(1));
    
            // set default background
            setBackground(9, Color.parseColor("#d3321b"));
    
            setGravity(Gravity.CENTER);
    
            // default values
            setHideOnNull(true);
            setBadgeCount(0);
        }
    
        @SuppressWarnings("deprecation")
        public void setBackground(int dipRadius, int badgeColor) {
            int radius = dip2Px(dipRadius);
            float[] radiusArray = new float[] { radius, radius, radius, radius, radius, radius, radius, radius };
    
            RoundRectShape roundRect = new RoundRectShape(radiusArray, null, null);
            ShapeDrawable bgDrawable = new ShapeDrawable(roundRect);
            bgDrawable.getPaint().setColor(badgeColor);
            setBackgroundDrawable(bgDrawable);
        }
    
        /**
         * @return Returns true if view is hidden on badge value 0 or null;
         */
        public boolean isHideOnNull() {
            return mHideOnNull;
        }
    
        /**
         * @param hideOnNull the hideOnNull to set
         */
        public void setHideOnNull(boolean hideOnNull) {
            mHideOnNull = hideOnNull;
            setText(getText());
        }
    
        /*
         * (non-Javadoc)
         * 
         * @see android.widget.TextView#setText(java.lang.CharSequence, android.widget.TextView.BufferType)
         */
        @Override
        public void setText(CharSequence text, BufferType type) {
            if (isHideOnNull() && (text == null || text.toString().equalsIgnoreCase("0"))) {
                setVisibility(View.GONE);
            } else {
                setVisibility(View.VISIBLE);
            }
            super.setText(text, type);
        }
    
        public void setBadgeCount(int count) {
            setText(String.valueOf(count));
        }
    
        public Integer getBadgeCount() {
            if (getText() == null) {
                return null;
            }
    
            String text = getText().toString();
            try {
                return Integer.parseInt(text);
            } catch (NumberFormatException e) {
                return null;
            }
        }
    
        /** 显示的位置,相对于依附对象 */
        public void setBadgeGravity(int gravity) {
            FrameLayout.LayoutParams params = (LayoutParams) getLayoutParams();
            params.gravity = gravity;
            setLayoutParams(params);
        }
    
        public int getBadgeGravity() {
            FrameLayout.LayoutParams params = (LayoutParams) getLayoutParams();
            return params.gravity;
        }
    
        public void setBadgeMargin(int dipMargin) {
            setBadgeMargin(dipMargin, dipMargin, dipMargin, dipMargin);
        }
    
        public void setBadgeMargin(int leftDipMargin, int topDipMargin, int rightDipMargin, int bottomDipMargin) {
            FrameLayout.LayoutParams params = (LayoutParams) getLayoutParams();
            params.leftMargin = dip2Px(leftDipMargin);
            params.topMargin = dip2Px(topDipMargin);
            params.rightMargin = dip2Px(rightDipMargin);
            params.bottomMargin = dip2Px(bottomDipMargin);
            setLayoutParams(params);
        }
    
        public int[] getBadgeMargin() {
            FrameLayout.LayoutParams params = (LayoutParams) getLayoutParams();
            return new int[] { params.leftMargin, params.topMargin, params.rightMargin, params.bottomMargin };
        }
    
        public void incrementBadgeCount(int increment) {
            Integer count = getBadgeCount();
            if (count == null) {
                setBadgeCount(increment);
            } else {
                setBadgeCount(increment + count);
            }
        }
    
        public void decrementBadgeCount(int decrement) {
            incrementBadgeCount(-decrement);
        }
    
        /*
         * Attach the BadgeView to the TabWidget
         * 
         * @param target the TabWidget to attach the BadgeView
         * 
         * @param tabIndex index of the tab
         */
        public void setTargetView(TabWidget target, int tabIndex) {
            View tabView = target.getChildTabViewAt(tabIndex);
            setTargetView(tabView);
        }
    
        /*
         * Attach the BadgeView to the target view
         * 
         * @param target the view to attach the BadgeView
         */
        public void setTargetView(View target) {
            if (getParent() != null) {
                ((ViewGroup) getParent()).removeView(this);
            }
    
            if (target == null) {
                return;
            }
    
            if (target.getParent() instanceof FrameLayout) {
                ((FrameLayout) target.getParent()).addView(this);
    
            } else if (target.getParent() instanceof ViewGroup) {
                // use a new Framelayout container for adding badge
                ViewGroup parentContainer = (ViewGroup) target.getParent();
                int groupIndex = parentContainer.indexOfChild(target);
                parentContainer.removeView(target);
    
                FrameLayout badgeContainer = new FrameLayout(getContext());
                ViewGroup.LayoutParams parentlayoutParams = target.getLayoutParams();
    
                parentContainer.addView(badgeContainer, groupIndex, parentlayoutParams);
                badgeContainer.addView(target);
    
                badgeContainer.addView(this);
            } else if (target.getParent() == null) {
                Log.e(getClass().getSimpleName(), "ParentView is needed");
            }
    
        }
    
        /*
         * converts dip to px
         */
        private int dip2Px(float dip) {
            return (int) (dip * getContext().getResources().getDisplayMetrics().density + 0.5f);
        }
    }

    具体实现代码如下:

      private void initBadgeView(Context context){
            badgeView = new BadgeView(context);
            badgeView.setBackgroundResource(R.drawable.subscription_num_bg);
            badgeView.setIncludeFontPadding(false);
            badgeView.setGravity(Gravity.CENTER);
            badgeView.setTextSize(8f);
            badgeView.setTextColor(Color.WHITE);
            //设置提示信息
            badgeView.setBadgeCount(23);
            //添加依附的对象View
            badgeView.setTargetView(imgIv);
            
        }
  • 相关阅读:
    BZOJ 1391: [Ceoi2008]order
    BZOJ 4504: K个串
    2019 年百度之星·程序设计大赛
    POJ 2398 Toy Storage (二分 叉积)
    POJ 2318 TOYS (二分 叉积)
    HDU 6697 Closest Pair of Segments (计算几何 暴力)
    HDU 6695 Welcome Party (贪心)
    HDU 6693 Valentine's Day (概率)
    HDU 6590 Code (判断凸包相交)
    POJ 3805 Separate Points (判断凸包相交)
  • 原文地址:https://www.cnblogs.com/ws5861/p/4194268.html
Copyright © 2011-2022 走看看