zoukankan      html  css  js  c++  java
  • android控件上面实现提醒信息

    android开发中,经常会用到显示一个提醒信息,比如个人中心,有新信息,购买商品后,在购物车控件,显示购物数量等。我们可以用,2个控件来实现,或者用层叠图。


    还有一种简单方便的办法,使用别人的开源代码来实现,使用很简单方便,通用。

    效果图:


    主类:不需要任何改动,直接可以用的。代码比较多,但是就一个java类,不需要知道它具体怎么实现,知道怎么用就行了。直接拷贝该java类到你的项目,就行了


    package com.hck.badgeview;


    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 com.hck.badgeview;

    import android.os.Bundle;

    import android.view.View;

    import android.view.animation.BounceInterpolator;

    import android.view.animation.TranslateAnimation;

    import android.app.Activity;

    import android.graphics.Color;


    public class MainActivityextends Activity {


    @Override

    protectedvoid onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    setContentView(R.layout.main);

    }


    public void button1(View view) {

    BadgeView badge1 = new BadgeView(this, view);//创建一个BadgeView对象,view为你需要显示提醒信息的控件

    //BadgeViewbadge1 = new BadgeView(this, view,0); 在使用tabhost使用这个,view为

    //TabWidget,0表示tabhost里面的第几个TabWidget

            badge1.setText("12"); //显示类容

            badge1.setBadgePosition(BadgeView.POSITION_CENTER);//显示的位置.中间,还有其他位置属性

            badge1.setTextColor(Color.WHITE);  //文本颜色

            badge1.setBadgeBackgroundColor(Color.RED); //背景颜色

            badge1.setTextSize(12); //文本大小

            badge1.setBadgeMargin(0, 0); //水平和竖直方向的间距

              //badge1.setBadgeMargin(0);各边间距

            /**

             * 可以设置一个动画

             */

    //        TranslateAnimation anim = new TranslateAnimation(-100, 0, 0, 0);

    //        anim.setInterpolator(new BounceInterpolator());

    //        anim.setDuration(1000);

    //        badge1.toggle(anim,null);

            badge1.toggle(); //设置,还要加这句,已经显示则影藏,否则显示

          //单纯的显示badge1.show();

           //badge1.hiden();影藏

    }


    public void button2(View view) {

    BadgeView badge1 = new BadgeView(this, view);

            badge1.setText("你有新消息");

            badge1.setBadgePosition(BadgeView.POSITION_TOP_RIGHT);

            badge1.setTextColor(Color.RED);

            badge1.setBadgeBackgroundColor(Color.YELLOW);

            badge1.setTextSize(12);

            badge1.toggle();

    }


    public void button3(View view) {

    BadgeView badge1 = new BadgeView(this, view);

            badge1.setText("呵呵呵");

            badge1.setBadgePosition(BadgeView.POSITION_TOP_LEFT);

            badge1.setTextColor(Color.DKGRAY);

            badge1.setBadgeBackgroundColor(Color.YELLOW);

            badge1.setTextSize(12);

            TranslateAnimation anim = new TranslateAnimation(-100, 0, 0, 0);

            anim.setInterpolator(new BounceInterpolator());

            anim.setDuration(1000);

            badge1.toggle(anim,null);

    }


    public void button4(View view) {

    BadgeView badge1 = new BadgeView(this, view);

            badge1.setText("你有新消息");

            badge1.setBadgeMargin(30, 30);

            badge1.setBadgePosition(BadgeView.POSITION_TOP_RIGHT);

            badge1.setTextColor(Color.WHITE);

            badge1.setBadgeBackgroundColor(Color.RED);

            badge1.setTextSize(14);

            badge1.toggle();

    }


    public void button5(View view) {


    }


    }


    xml:

    <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"

        xmlns:tools="http://schemas.android.com/tools"

        android:layout_width="match_parent"

        android:layout_height="match_parent"

        android:orientation="vertical">


        <Button

            android:layout_width="fill_parent"

            android:layout_height="wrap_content"

            android:onClick="button1"

            android:text="button1"/>


        <Button

            android:layout_width="fill_parent"

            android:layout_height="wrap_content"

            android:onClick="button2"

            android:text="button2"/>


        <Button

            android:layout_width="fill_parent"

            android:layout_height="wrap_content"

            android:onClick="button3"

            android:text="button3"/>


        <Button

            android:layout_width="fill_parent"

            android:layout_height="wrap_content"

            android:onClick="button4"

            android:text="button4"/>


        <Button

            android:layout_width="fill_parent"

            android:layout_height="wrap_content"

            android:onClick="button5"

            android:text="button5"/>


    </LinearLayout>


    demo:demo下载

  • 相关阅读:
    【洛谷5304】[GXOI/ZOI2019] 旅行者(二进制分组+最短路)
    【LOJ6485】LJJ 学二项式定理(单位根反演)
    【CF932E】Team Work(第二类斯特林数简单题)
    【CF960G】Bandit Blues(第一类斯特林数)
    【洛谷4689】[Ynoi2016] 这是我自己的发明(莫队)
    【洛谷5355】[Ynoi2017] 由乃的玉米田(莫队+bitset)
    【洛谷5268】[SNOI2017] 一个简单的询问(莫队)
    【洛谷4688】[Ynoi2016] 掉进兔子洞(莫队+bitset)
    【洛谷3653】小清新数学题(数论)
    【洛谷6626】[省选联考 2020 B 卷] 消息传递(点分治基础题)
  • 原文地址:https://www.cnblogs.com/Free-Thinker/p/3738010.html
Copyright © 2011-2022 走看看