android控件上面实现提醒信息

jopen 10年前

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

 

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

效果图:

20131010131726515.jpg

主类:不需要任何改动,直接可以用的。代码比较多,但是就一个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为你需要显示提醒的控件

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

        badge1.setBadgePosition(BadgeView.POSITION_CENTER);//显示的位置.中间

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

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

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

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

        /**

         * 可以设置一个动画

         */

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

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

//        anim.setDuration(1000);

//        badge1.toggle(anim,null);

        badge1.toggle(); //设置

}

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>