如何在应用程序中添加通知徽章?

时间:2016-12-15 12:11:56

标签: android button

我想在应用程序中添加通知徽章,如下所示:

buttons

如何实施徽章。请指南。

3 个答案:

答案 0 :(得分:1)

这称为徽章。 您可以使用此库获取徽章支持。 Leolin Shortcut Badger 这也是Android ActionItem Badged 我认为它不适用于所有设备。虽然三星使用它。 你可以在这里看到Posts和你的一样。

答案 1 :(得分:1)

如果您想为徽标添加徽章

  

BadgeDrawable是一个自定义可绘制的

package com.wisilica.cms.utitlty.viewHelper;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.ColorFilter;
import android.graphics.Paint;
import android.graphics.PixelFormat;
import android.graphics.Rect;
import android.graphics.Typeface;
import android.graphics.drawable.Drawable;
import android.support.v4.content.ContextCompat;

import com.wisilica.cms.R;

/**
 * Created by Godwin Joseph on 02-11-2016 11:49 for Cms_Android application.
 */


public class BadgeDrawable extends Drawable {

private Paint mBadgePaint;
private Paint mBadgePaint1;
private Paint mTextPaint;
private Rect mTxtRect = new Rect();

private String mCount = "";
private boolean mWillDraw;

public BadgeDrawable(Context context) {
    float mTextSize = context.getResources().getDimension(R.dimen.badge_text_size);

    mBadgePaint = new Paint();
    mBadgePaint.setColor(Color.RED);
    mBadgePaint.setAntiAlias(true);
    mBadgePaint.setStyle(Paint.Style.FILL);
    mBadgePaint1 = new Paint();
    mBadgePaint1.setColor(ContextCompat.getColor(context.getApplicationContext(), R.color.white));
    mBadgePaint1.setAntiAlias(true);
    mBadgePaint1.setStyle(Paint.Style.FILL);

    mTextPaint = new Paint();
    mTextPaint.setColor(Color.WHITE);
    mTextPaint.setTypeface(Typeface.DEFAULT);
    mTextPaint.setTextSize(mTextSize);
    mTextPaint.setAntiAlias(true);
    mTextPaint.setTextAlign(Paint.Align.CENTER);
}

@Override
public void draw(Canvas canvas) {


    if (!mWillDraw) {
        return;
    }
    Rect bounds = getBounds();
    float width = bounds.right - bounds.left;
    float height = bounds.bottom - bounds.top;

    // Position the badge in the top-right quadrant of the icon.

        /*Using Math.max rather than Math.min */

    float radius = ((Math.max(width, height) / 2)) / 2;
    float centerX = (width - radius - 1) + 5;
    float centerY = radius - 5;
    if (mCount.length() <= 2) {
        // Draw badge circle.
        canvas.drawCircle(centerX, centerY, (int) (radius + 7.5), mBadgePaint1);
        canvas.drawCircle(centerX, centerY, (int) (radius + 5.5), mBadgePaint);
    } else {
        canvas.drawCircle(centerX, centerY, (int) (radius + 8.5), mBadgePaint1);
        canvas.drawCircle(centerX, centerY, (int) (radius + 6.5), mBadgePaint);
//              canvas.drawRoundRect(radius, radius, radius, radius, 10, 10, mBadgePaint);
    }
    // Draw badge count text inside the circle.
    mTextPaint.getTextBounds(mCount, 0, mCount.length(), mTxtRect);
    float textHeight = mTxtRect.bottom - mTxtRect.top;
    float textY = centerY + (textHeight / 2f);
    if (mCount.length() > 2)
        canvas.drawText("99+", centerX, textY, mTextPaint);
    else
        canvas.drawText(mCount, centerX, textY, mTextPaint);
}

/*
Sets the count (i.e notifications) to display.
 */
public void setCount(String count) {
    mCount = count;

    // Only draw a badge if there are notifications.
    mWillDraw = !count.equalsIgnoreCase("0");
    invalidateSelf();
}

@Override
public void setAlpha(int alpha) {
    // do nothing
}

@Override
public void setColorFilter(ColorFilter cf) {
    // do nothing
}

@Override
public int getOpacity() {
    return PixelFormat.UNKNOWN;
}
}

并添加代码     {     BadgeDrawable徽章;

    // Reuse drawable if possible
    Drawable reuse = icon.findDrawableByLayerId(R.id.ic_badge);
    if (reuse != null && reuse instanceof BadgeDrawable) {
        badge = (BadgeDrawable) reuse;
    } else {
        badge = new BadgeDrawable(mContext);
    }
    badge.setCount(count);
    icon.mutate();
    icon.setDrawableByLayerId(R.id.ic_badge, badge);

 }

您可以在任何视图中设置Drwabale

答案 2 :(得分:0)

 <FrameLayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentRight="true"
            android:layout_marginRight="5dp"
           >

            <Button
                android:id="@+id/button1"

                android:layout_width="wrap_content"
                android:layout_height="wrap_content"

                android:layout_gravity="center"

                android:background="@null"

                android:text="Button" />

            <FrameLayout
                android:id="@+id/badgecountlayout"
                android:layout_width="20dp"
                android:layout_height="20dp"
                android:layout_gravity="left"
                android:layout_marginLeft="8dp"
                android:layout_marginTop="10dp">

                <TextView
                    android:id="@+id/badgecount"
                    android:layout_width="match_parent"
                    android:layout_height="match_parent"
                    android:background="@drawable/round_notification"
                    android:gravity="center"
                    android:text="99" />
            </FrameLayout>

        </FrameLayout>

round_notification.xml

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="oval" >
    <gradient android:startColor="@color/yellow_dark" android:endColor="@color/yellow_dark"
        android:angle="270"/>
</shape>