`

ViewBadger为其他View添加角标

阅读更多
项目地址:https://github.com/jgilfelt/android-viewbadger

以前都是自己写的,一不小心网上找到这个,觉得不错,以后直接copy了,方便快捷!







package com.readystatesoftware.viewbadger;

import android.content.Context;
import android.content.res.Resources;
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.TypedValue;
import android.view.Gravity;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewGroup.LayoutParams;
import android.view.ViewParent;
import android.view.animation.AccelerateInterpolator;
import android.view.animation.AlphaAnimation;
import android.view.animation.Animation;
import android.view.animation.DecelerateInterpolator;
import android.widget.FrameLayout;
import android.widget.TabWidget;
import android.widget.TextView;

/**
 * A simple text label view that can be applied as a "badge" to any given {@link android.view.View}. 
 * This class is intended to be instantiated at runtime rather than included in XML layouts.
 * 
 * @author Jeff Gilfelt
 */
public class BadgeView extends TextView {

	public static final int POSITION_TOP_LEFT = 1;
	public static final int POSITION_TOP_RIGHT = 2;
	public static final int POSITION_BOTTOM_LEFT = 3;
	public static final int POSITION_BOTTOM_RIGHT = 4;
	public static final int POSITION_CENTER = 5;
	
	private static final int DEFAULT_MARGIN_DIP = 5;
	private static final int DEFAULT_LR_PADDING_DIP = 5;
	private static final int DEFAULT_CORNER_RADIUS_DIP = 8;
	private static final int DEFAULT_POSITION = POSITION_TOP_RIGHT;
	private static final int DEFAULT_BADGE_COLOR = Color.parseColor("#CCFF0000"); //Color.RED;
	private static final int DEFAULT_TEXT_COLOR = Color.WHITE;
	
	private static Animation fadeIn;
	private static Animation fadeOut;
	
	private Context context;
	private View target;
	
	private int badgePosition;
	private int badgeMarginH;
	private int badgeMarginV;
	private int badgeColor;
	
	private boolean isShown;
	
	private ShapeDrawable badgeBg;
	
	private int targetTabIndex;
	
	public BadgeView(Context context) {
		this(context, (AttributeSet) null, android.R.attr.textViewStyle);
	}
	
	public BadgeView(Context context, AttributeSet attrs) {
		 this(context, attrs, android.R.attr.textViewStyle);
	}
	
	/**
     * Constructor -
     * 
     * create a new BadgeView instance attached to a target {@link android.view.View}.
     *
     * @param context context for this view.
     * @param target the View to attach the badge to.
     */
	public BadgeView(Context context, View target) {
		 this(context, null, android.R.attr.textViewStyle, target, 0);
	}
	
	/**
     * Constructor -
     * 
     * create a new BadgeView instance attached to a target {@link android.widget.TabWidget}
     * tab at a given index.
     *
     * @param context context for this view.
     * @param target the TabWidget to attach the badge to.
     * @param index the position of the tab within the target.
     */
	public BadgeView(Context context, TabWidget target, int index) {
		this(context, null, android.R.attr.textViewStyle, target, index);
	}
	
	public BadgeView(Context context, AttributeSet attrs, int defStyle) {
		this(context, attrs, defStyle, null, 0);
	}
	
	public BadgeView(Context context, AttributeSet attrs, int defStyle, View target, int tabIndex) {
		super(context, attrs, defStyle);
		init(context, target, tabIndex);
	}

	private void init(Context context, View target, int tabIndex) {
		
		this.context = context;
		this.target = target;
		this.targetTabIndex = tabIndex;
		
		// apply defaults
		badgePosition = DEFAULT_POSITION;
		badgeMarginH = dipToPixels(DEFAULT_MARGIN_DIP);
		badgeMarginV = badgeMarginH;
		badgeColor = DEFAULT_BADGE_COLOR;
		
		setTypeface(Typeface.DEFAULT_BOLD);
		int paddingPixels = dipToPixels(DEFAULT_LR_PADDING_DIP);
		setPadding(paddingPixels, 0, paddingPixels, 0);
		setTextColor(DEFAULT_TEXT_COLOR);
		
		fadeIn = new AlphaAnimation(0, 1);
		fadeIn.setInterpolator(new DecelerateInterpolator());
		fadeIn.setDuration(200);

		fadeOut = new AlphaAnimation(1, 0);
		fadeOut.setInterpolator(new AccelerateInterpolator());
		fadeOut.setDuration(200);
		
		isShown = false;
		
		if (this.target != null) {
			applyTo(this.target);
		} else {
			show();
		}
		
	}

	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();
			
		}
		
	}
	
	/**
     * Make the badge visible in the UI.
     * 
     */
	public void show() {
		show(false, null);
	}
	
	/**
     * Make the badge visible in the UI.
     *
     * @param animate flag to apply the default fade-in animation.
     */
	public void show(boolean animate) {
		show(animate, fadeIn);
	}
	
	/**
     * Make the badge visible in the UI.
     *
     * @param anim Animation to apply to the view when made visible.
     */
	public void show(Animation anim) {
		show(true, anim);
	}
	
	/**
     * Make the badge non-visible in the UI.
     * 
     */
	public void hide() {
		hide(false, null);
	}
	
	/**
     * Make the badge non-visible in the UI.
     *
     * @param animate flag to apply the default fade-out animation.
     */
	public void hide(boolean animate) {
		hide(animate, fadeOut);
	}
	
	/**
     * Make the badge non-visible in the UI.
     *
     * @param anim Animation to apply to the view when made non-visible.
     */
	public void hide(Animation anim) {
		hide(true, anim);
	}
	
	/**
     * Toggle the badge visibility in the UI.
     * 
     */
	public void toggle() {
		toggle(false, null, null);
	}
	
	/**
     * Toggle the badge visibility in the UI.
     * 
     * @param animate flag to apply the default fade-in/out animation.
     */
	public void toggle(boolean animate) {
		toggle(animate, fadeIn, fadeOut);
	}
	
	/**
     * Toggle the badge visibility in the UI.
     *
     * @param animIn Animation to apply to the view when made visible.
     * @param animOut Animation to apply to the view when made non-visible.
     */
	public void toggle(Animation animIn, Animation animOut) {
		toggle(true, animIn, animOut);
	}
	
	private void show(boolean animate, Animation anim) {
		if (getBackground() == null) {
			if (badgeBg == null) {
				badgeBg = getDefaultBackground();
			}
			setBackgroundDrawable(badgeBg);
		}
		applyLayoutParams();
		
		if (animate) {
			this.startAnimation(anim);
		}
		this.setVisibility(View.VISIBLE);
		isShown = true;
	}
	
	private void hide(boolean animate, Animation anim) {
		this.setVisibility(View.GONE);
		if (animate) {
			this.startAnimation(anim);
		}
		isShown = false;
	}
	
	private void toggle(boolean animate, Animation animIn, Animation animOut) {
		if (isShown) {
			hide(animate && (animOut != null), animOut);	
		} else {
			show(animate && (animIn != null), animIn);
		}
	}
	
	/**
     * Increment the numeric badge label. If the current badge label cannot be converted to
     * an integer value, its label will be set to "0".
     * 
     * @param offset the increment offset.
     */
	public int increment(int offset) {
		CharSequence txt = getText();
		int i;
		if (txt != null) {
			try {
				i = Integer.parseInt(txt.toString());
			} catch (NumberFormatException e) {
				i = 0;
			}
		} else {
			i = 0;
		}
		i = i + offset;
		setText(String.valueOf(i));
		return i;
	}
	
	/**
     * Decrement the numeric badge label. If the current badge label cannot be converted to
     * an integer value, its label will be set to "0".
     * 
     * @param offset the decrement offset.
     */
	public int decrement(int offset) {
		return increment(-offset);
	}
	
	private ShapeDrawable getDefaultBackground() {
		
		int r = dipToPixels(DEFAULT_CORNER_RADIUS_DIP);
		float[] outerR = new float[] {r, r, r, r, r, r, r, r};
        
		RoundRectShape rr = new RoundRectShape(outerR, null, null);
		ShapeDrawable drawable = new ShapeDrawable(rr);
		drawable.getPaint().setColor(badgeColor);
		
		return drawable;
		
	}
	
	private void applyLayoutParams() {
		
		FrameLayout.LayoutParams lp = new FrameLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
		
		switch (badgePosition) {
		case POSITION_TOP_LEFT:
			lp.gravity = Gravity.LEFT | Gravity.TOP;
			lp.setMargins(badgeMarginH, badgeMarginV, 0, 0);
			break;
		case POSITION_TOP_RIGHT:
			lp.gravity = Gravity.RIGHT | Gravity.TOP;
			lp.setMargins(0, badgeMarginV, badgeMarginH, 0);
			break;
		case POSITION_BOTTOM_LEFT:
			lp.gravity = Gravity.LEFT | Gravity.BOTTOM;
			lp.setMargins(badgeMarginH, 0, 0, badgeMarginV);
			break;
		case POSITION_BOTTOM_RIGHT:
			lp.gravity = Gravity.RIGHT | Gravity.BOTTOM;
			lp.setMargins(0, 0, badgeMarginH, badgeMarginV);
			break;
		case POSITION_CENTER:
			lp.gravity = Gravity.CENTER;
			lp.setMargins(0, 0, 0, 0);
			break;
		default:
			break;
		}
		
		setLayoutParams(lp);
		
	}

	/**
     * Returns the target View this badge has been attached to.
     * 
     */
	public View getTarget() {
		return target;
	}

	/**
     * Is this badge currently visible in the UI?
     * 
     */
	@Override
	public boolean isShown() {
		return isShown;
	}

	/**
     * Returns the positioning of this badge.
     * 
     * one of POSITION_TOP_LEFT, POSITION_TOP_RIGHT, POSITION_BOTTOM_LEFT, POSITION_BOTTOM_RIGHT, POSTION_CENTER.
     * 
     */
	public int getBadgePosition() {
		return badgePosition;
	}

	/**
     * Set the positioning of this badge.
     * 
     * @param layoutPosition one of POSITION_TOP_LEFT, POSITION_TOP_RIGHT, POSITION_BOTTOM_LEFT, POSITION_BOTTOM_RIGHT, POSTION_CENTER.
     * 
     */
	public void setBadgePosition(int layoutPosition) {
		this.badgePosition = layoutPosition;
	}

	/**
     * Returns the horizontal margin from the target View that is applied to this badge.
     * 
     */
	public int getHorizontalBadgeMargin() {
		return badgeMarginH;
	}
	
	/**
     * Returns the vertical margin from the target View that is applied to this badge.
     * 
     */
	public int getVerticalBadgeMargin() {
		return badgeMarginV;
	}

	/**
     * Set the horizontal/vertical margin from the target View that is applied to this badge.
     * 
     * @param badgeMargin the margin in pixels.
     */
	public void setBadgeMargin(int badgeMargin) {
		this.badgeMarginH = badgeMargin;
		this.badgeMarginV = badgeMargin;
	}
	
	/**
     * Set the horizontal/vertical margin from the target View that is applied to this badge.
     * 
     * @param horizontal margin in pixels.
     * @param vertical margin in pixels.
     */
	public void setBadgeMargin(int horizontal, int vertical) {
		this.badgeMarginH = horizontal;
		this.badgeMarginV = vertical;
	}
	
	/**
     * Returns the color value of the badge background.
     * 
     */
	public int getBadgeBackgroundColor() {
		return badgeColor;
	}

	/**
     * Set the color value of the badge background.
     * 
     * @param badgeColor the badge background color.
     */
	public void setBadgeBackgroundColor(int badgeColor) {
		this.badgeColor = badgeColor;
		badgeBg = getDefaultBackground();
	}
	
	private int dipToPixels(int dip) {
		Resources r = getResources();
		float px = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dip, r.getDisplayMetrics());
		return (int) px;
	}

}


用法:
package viewbadger.demo;

import android.app.TabActivity;
import android.content.Context;
import android.graphics.Color;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.view.animation.BounceInterpolator;
import android.view.animation.TranslateAnimation;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.ListView;
import android.widget.TabHost;
import android.widget.TabWidget;
import android.widget.TextView;
import android.widget.Toast;

import com.readystatesoftware.viewbadger.BadgeView;
import com.readystatesoftware.viewbadger.R;

public class DemoActivity extends TabActivity {
    
	private static final String[] DATA = Cheeses.sCheeseStrings;
	
	Button btnPosition;
	Button btnColour;
	Button btnAnim1;
	Button btnAnim2;
	Button btnCustom;
	Button btnClick;
	Button btnTab;
	Button btnIncrement;
	
	ListView listDemo;
	
	BadgeView badge1;
	BadgeView badge2;
	BadgeView badge3;
	BadgeView badge4;
	BadgeView badge5;
	BadgeView badge6;
	BadgeView badge7;
	BadgeView badge8;
	
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        final TabHost tabHost = getTabHost();

        tabHost.addTab(tabHost.newTabSpec("demos")
                .setIndicator("Badge Demos")
                .setContent(R.id.tab1));

        tabHost.addTab(tabHost.newTabSpec("adapter")
                .setIndicator("List Adapter")
                .setContent(R.id.tab2));
        
        tabHost.addTab(tabHost.newTabSpec("tests")
                .setIndicator("Layout Tests")
                .setContent(R.id.tab3));
       
        // *** default badge ***
        
		View target = findViewById(R.id.default_target);
		BadgeView badge = new BadgeView(this, target);
		badge.setText("1");
		badge.show();
        
        // *** set position ***
		
        btnPosition = (Button) findViewById(R.id.position_target);
        badge1 = new BadgeView(this, btnPosition);
        badge1.setText("12");
        badge1.setBadgePosition(BadgeView.POSITION_CENTER);
        btnPosition.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				badge1.toggle();
			}
		});
        
        // *** badge/text size & colour ***
        
    	btnColour = (Button) findViewById(R.id.colour_target);
    	badge2 = new BadgeView(this, btnColour);
    	badge2.setText("New!");
    	badge2.setTextColor(Color.BLUE);
    	badge2.setBadgeBackgroundColor(Color.YELLOW);
    	badge2.setTextSize(12);
    	btnColour.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				badge2.toggle();
			}
		});
    	
    	// *** default animation ***
    	
    	btnAnim1 = (Button) findViewById(R.id.anim1_target);
        badge3 = new BadgeView(this, btnAnim1);
        badge3.setText("84");
        btnAnim1.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				badge3.toggle(true);
			}
		});
    	
        // *** custom animation ***
        
    	btnAnim2 = (Button) findViewById(R.id.anim2_target);
        badge4 = new BadgeView(this, btnAnim2);
    	badge4.setText("123");
    	badge4.setBadgePosition(BadgeView.POSITION_TOP_LEFT);
    	badge4.setBadgeMargin(15, 10);
    	badge4.setBadgeBackgroundColor(Color.parseColor("#A4C639"));
    	btnAnim2.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				TranslateAnimation anim = new TranslateAnimation(-100, 0, 0, 0);
		        anim.setInterpolator(new BounceInterpolator());
		        anim.setDuration(1000);
		    	badge4.toggle(anim, null);
			}
		});
        
    	// *** custom background ***
    	
        btnCustom = (Button) findViewById(R.id.custom_target);
        badge5 = new BadgeView(this, btnCustom);
        badge5.setText("37");
        badge5.setBackgroundResource(R.drawable.badge_ifaux);
    	badge5.setTextSize(16);
    	btnCustom.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				badge5.toggle(true);
			}
		});
    	
    	// *** clickable badge ***
    	
    	btnClick = (Button) findViewById(R.id.click_target);
    	badge6 = new BadgeView(this, btnClick);
    	badge6.setText("click me");
    	badge6.setBadgeBackgroundColor(Color.BLUE);
    	badge6.setTextSize(16);
    	badge6.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				Toast.makeText(DemoActivity.this, "clicked badge", Toast.LENGTH_SHORT).show();
			}
		});
    	btnClick.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				badge6.toggle();
			}
		});
    	
    	// *** tab ***
    	
    	TabWidget tabs = (TabWidget) findViewById(android.R.id.tabs);
    	
        btnTab = (Button) findViewById(R.id.tab_btn);
        badge7 = new BadgeView(this, tabs, 0);
        badge7.setText("5");
        btnTab.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				badge7.toggle();
			}
		});
        
        // *** increment ***
        
        btnIncrement = (Button) findViewById(R.id.increment_target);
        badge8 = new BadgeView(this, btnIncrement);
        badge8.setText("0");
        btnIncrement.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				if (badge8.isShown()) {
					badge8.increment(1);
				} else {
					badge8.show();
				}
			}
		});
        
        // *** list adapter ****
        
        listDemo = (ListView) findViewById(R.id.tab2);
        listDemo.setAdapter(new BadgeAdapter(this));
    	
    }

	@Override
	protected void onResume() {
		super.onResume();
		
		BadgeView badge;
		View target;
		
		// *** test linear layout container ***
		
		target = findViewById(R.id.linear_target);
		badge = new BadgeView(this, target);
		badge.setText("OK");
		badge.show();
		
		// *** test relative layout container ***
		
		target = findViewById(R.id.relative_target);
		badge = new BadgeView(this, target);
		badge.setText("OK");
		badge.show();
		
		// *** test frame layout container ***
		
		target = findViewById(R.id.frame_target);
		badge = new BadgeView(this, target);
		badge.setText("OK");
		badge.show();
		
		// *** test table layout container ***
		
		target = findViewById(R.id.table_target);
		badge = new BadgeView(this, target);
		badge.setText("OK");
		badge.show();
		
		// *** test linear layout ***
		
		target = findViewById(R.id.linear_group_target);
		badge = new BadgeView(this, target);
		badge.setText("OK");
		badge.show();
		
		// *** test relative layout ***
		
		target = findViewById(R.id.relative_group_target);
		badge = new BadgeView(this, target);
		badge.setText("OK");
		badge.show();
		
		// *** test frame layout ***
		
		target = findViewById(R.id.frame_group_target);
		badge = new BadgeView(this, target);
		badge.setText("OK");
		badge.show();
		
		// *** test table layout ***
		
		target = findViewById(R.id.tablerow_group_target);
		badge = new BadgeView(this, target);
		badge.setText("OK");
		badge.show();
		
	}
    
    private static class BadgeAdapter extends BaseAdapter {
        private LayoutInflater mInflater;
        private Context mContext;
        private static final int droidGreen = Color.parseColor("#A4C639");
        
        public BadgeAdapter(Context context) {
            mInflater = LayoutInflater.from(context);
            mContext = context;
        }

        public int getCount() {
            return DATA.length;
        }

        public Object getItem(int position) {
            return position;
        }
        
        public long getItemId(int position) {
            return position;
        }

        public View getView(int position, View convertView, ViewGroup parent) {
            ViewHolder holder;

            if (convertView == null) {
                convertView = mInflater.inflate(android.R.layout.simple_list_item_2, null);
                holder = new ViewHolder();
                holder.text = (TextView) convertView.findViewById(android.R.id.text1);
                holder.badge = new BadgeView(mContext, holder.text);
                holder.badge.setBadgeBackgroundColor(droidGreen);
                holder.badge.setTextColor(Color.BLACK);
                convertView.setTag(holder);
            } else {
                holder = (ViewHolder) convertView.getTag();
            }

            holder.text.setText(DATA[position]);
            
            if (position % 3 == 0) {
            	holder.badge.setText(String.valueOf(position));
            	holder.badge.show();
            } else {
            	holder.badge.hide();
            }
            
            
            return convertView;
        }

        static class ViewHolder {
            TextView text;
            BadgeView badge;
        }
    }
    
}



Android系统 小米/三星/索尼 应用启动图标未读消息数(BadgeNumber)动态提醒
http://blog.csdn.net/janice0529/article/details/44344169
  • 大小: 86.2 KB
  • 大小: 75.8 KB
分享到:
评论

相关推荐

    Android 给view加红色数字提醒角标.zip

    本项目是一个给view添加红色数字标签的小例子源码,这个开源项目提供了一种简便的方式,能够在运行期对任意给定的Android view添加徽章, 而不必配合它的布局。可添加的标签包括但不限于右上角的红色数字提醒角标。

    Android ToolBar、TabLayout加角标显示未读消息

    当有未读消息或者新内容时,为这些组件添加角标(通常是小红点)是一种常见的提示方式。本篇将详细讲解如何在`ToolBar`和`TabLayout`上实现角标显示未读消息。 首先,我们需要了解`ToolBar`的基本使用。`ToolBar`是...

    自定义View系列:未读消息数角标

    至于位置,可以将其添加到需要显示角标的父View上,通过setX()和setY()方法定位。 5. 交互与动画: 为了提升用户体验,还可以添加一些交互效果,如点击反馈或者动画。例如,当用户点击角标时,可以展开消息列表;...

    底部tabbar 自定义角标

    安装这个库(通常通过CocoaPods或Carthage)后,你可以方便地为TabBarItem添加自定义角标,而无需过多关注底层实现细节。BadgeView可能提供了设置角标颜色、形状、大小和动画等功能。 具体步骤如下: - **集成...

    Android例子源码给view加红色数字提醒角标

    在Android应用开发中,给View添加红色数字提醒角标是一种常见的设计手法,它通常用于通知用户有未读消息、更新或者其他重要信息。这种设计元素在许多应用中都可以看到,如通知中心、应用图标或者菜单项。本文将深入...

    Android图片右上角数字角标实现

    在Android应用开发中,我们经常需要在图片的右上角添加一个数字角标,用于显示未读消息的数量、更新提示等。这个功能在各种社交应用、通知中心等场景中非常常见。实现这一功能通常涉及到自定义View或者使用现有的库...

    用badgeview实现tab的角标

    然后,我们将引入BadgeView来为Tab添加角标。BadgeView是一个小型的视图,通常用于表示未读消息或其他通知。你可以通过继承View或者使用现有的开源库如Android-BadgeView来创建一个BadgeView。首先,需要在Tab的图标...

    BadgerView数字角标

    BadgerView是一款专门为Android开发的数字角标组件,它的主要功能是帮助开发者在应用程序的UI中轻松地为多个视图控件添加角标。角标通常用于显示未读消息的数量或者指示某个状态,例如在应用图标右上角显示红色的小...

    QQ消息角标显示

    1. HTML/CSS/JavaScript:在Web开发中,可以通过CSS设置样式,JavaScript动态更新角标内容,HTML结构中添加角标元素。 2. iOS开发:使用Swift或Objective-C,可以通过UIBarButtonItem或UIView自定义视图,利用通知...

    swift-RKNotificationHub为任何UIView添加一个通知角标

    下面是一个简单的代码示例,展示了如何在`UIButton`上添加角标并随着计数变化动态显示: ```swift import UIKit import RKNotificationHub class ViewController: UIViewController { @IBOutlet weak var ...

    安卓数字提醒气泡提示角标相关-Android上移植苹果图标右上角的数字提示信息.zip

    - 初始化:在需要添加角标的View上,创建一个ViewBadger实例。 - 设置角标:调用setBadgeCount方法设置角标的数值,或者使用其他方法如setDisplayMode来决定角标的表现形式(数字、红点等)。 - 应用角标:调用...

    BadgeView---角标

    你可以通过`<com.example.BadgeView>`标签创建一个BadgeView,或者在代码中通过`new BadgeView(context, parentView)`实例化一个,其中`context`是上下文对象,`parentView`是你想要添加角标的View。 3. **设置属性...

    Android-Android角标组件效果

    4. 隐藏与显示:根据条件控制角标的可见性,例如当未读消息为0时,隐藏角标。 5. 角度和偏移:为了使角标看起来像是附着在父View的右上角,可以计算出适当的偏移量,并设置View的位置。 四、特殊情况处理 1. 在...

    Android代码-漂亮的角标View

    Sometimes, we need to show a label above an ImageView or any other views. Well, LabelXXView will be able to help you. It's easy to implement as well! Import your project Gradle Step 1. Add the ...

    基于数据内容的ArcGIS角标实现

    7. **布局视图**:最后,理解ArcGIS的布局视图(Layout View)至关重要,因为在这里我们可以调整角标、标题、比例尺等元素的位置和样式,以创建专业且具有吸引力的地图产品。 通过以上知识点的学习和实践,GIS初学...

    Android 实现带角标的ImageView(微博,QQ消息提示)

    在Android开发中,有时我们需要在ImageView上添加角标来显示未读消息数量或者状态提示,例如微博、QQ等社交应用中的消息提示。本篇将详细介绍如何在Android中实现带角标的ImageView。 首先,角标的绘制过程是通过...

    Android自定义控件-viewbadger(提示红点)

    2. **实例化并添加到布局**:在XML布局文件中,通过`<com.example.viewbadger.ViewBadger/>`标签添加控件,并设置其属性,如红点颜色、位置等。 3. **设置红点状态**:在Java代码中,可以通过`setBadgeCount(int ...

    viewbadger Demo

    它提供了一个简单的API,可以在ImageView、Button或其他任何View上添加一个可以显示数字或自定义文本的小红点(徽章)。这个库特别适用于那些需要在应用图标或者导航栏元素上展示未读消息数量的场景。 2. **如何...

Global site tag (gtag.js) - Google Analytics