当前位置:首页 > 谈天说地

Android实现未读消息小红点显示实例

34资源网2022-02-14597
目录
  • 代码实现
  • 小红点实现
  • 总结

使用 fragmentlayout 实现,可以把小红点添加到任意 view 上。

效果 添加小红点到 textview 上

添加小红点到 imageview 上

代码实现

首先定义一个圆形 drawable

import android.graphics.canvas;
import android.graphics.colorfilter;
import android.graphics.paint;
import android.graphics.pixelformat;
import android.graphics.drawable.drawable;
import android.graphics.drawable.shapedrawable;

import androidx.annotation.intrange;
import androidx.annotation.nonnull;
import androidx.annotation.nullable;


public class circledrawable extends shapedrawable {
    private paint mpaint;
    private int mradio;

    public circledrawable(int radio, int paincolor) {
        mpaint = new paint();
        mpaint.setantialias(true);
        mpaint.setcolor(paincolor);
        mradio = radio;
    }

    @override
    public void draw(@nonnull canvas canvas) {
        canvas.drawcircle(mradio, mradio, mradio, mpaint);
    }

    @override
    public void setalpha(@intrange(from = 0, to = 255) int i) {
        mpaint.setalpha(i);
    }

    @override
    public void setcolorfilter(@nullable colorfilter colorfilter) {
        mpaint.setcolorfilter(colorfilter);
    }

    @override
    public int getopacity() {
        return pixelformat.translucent;
    }

    /***
     * drawable实际宽高,圆形关键
     *
     * @return
     */
    @override
    public int getintrinsicwidth() {
        return mradio * 2;
    }

    @override
    public int getintrinsicheight() {
        return mradio * 2;
    }
}

小红点实现

思路:
一个容器 fragmentlayout 包含两个 view (小红点view + 文本view 「当然也可以是其他的view」),通过 fragmentlayout 添加 view 重叠的特征实现

当前有待优化点:
1、通过 margin 实现小红点可以添加到任意位置「可以是有 layoutparams margin 实现」
2、其他

import android.content.context;
import android.graphics.canvas;
import android.graphics.color;
import android.graphics.rect;
import android.graphics.drawable.colordrawable;
import android.graphics.drawable.shapedrawable;
import android.graphics.drawable.shapes.ovalshape;
import android.graphics.drawable.shapes.roundrectshape;
import android.util.attributeset;
import android.util.printer;
import android.view.gravity;
import android.view.view;
import android.view.viewgroup;
import android.widget.framelayout;
import android.widget.textview;

import androidx.annotation.nullable;

import com.primer.common.constant.gravitydirection;
import com.primer.common.mvp.logininterface;
import com.primer.common.util.loghelper;
import com.primer.common.util.uihelper;
import com.primer.common.view.drawable.circledrawable;

public class badgeview extends textview {

    private final int default_badge_radio = 5;
    private final int default_text_size = 5;
    private final int default_text_color = color.white;
    private final int default_badge_color = color.red;
    private final int default_badge_gravity = gravitydirection.direct_top_left;

    private string mtext;
    private int mbadgecolor = default_badge_color;
    private int mtextcolor = default_text_color;
    private int mtextsize = default_text_size;
    private int mbadgeradio = default_badge_radio;
    private int mbadgegravity = default_badge_gravity;

    private framelayout mfragmentlayout;
    private viewgroup mtargetviewgroup;
    private view mtarget;
    private context mcontext;

    public badgeview(context context) {
        super(context);
        init(context);
    }

    public badgeview(context context, @nullable attributeset attrs) {
        super(context, attrs);
        init(context);
    }

    public badgeview(context context, @nullable attributeset attrs, int defstyleattr) {
        super(context, attrs, defstyleattr);
        init(context);
    }

    public badgeview(context context, @nullable attributeset attrs, int defstyleattr, int defstyleres) {
        super(context, attrs, defstyleattr, defstyleres);
        init(context);
    }

    private void init(context context) {
        mfragmentlayout = new framelayout(context);
        mfragmentlayout.setlayoutparams(new framelayout.layoutparams(
                viewgroup.layoutparams.match_parent, viewgroup.layoutparams.match_parent));
        mcontext = context;
    }

    /***
     *
     * @param content
     * @param target
     * @param textcolor
     * @param textsize
     * @param badgecolor
     * @param badgeradio
     */
    public void showbadgeview(string content, view target, int textcolor, int textsize, int badgecolor, int badgeradio) {
        if (target == null) {
            throw new illegalargumentexception("target view must not be null");
        }

        mtarget = target;
        mtargetviewgroup = (viewgroup) target.getparent();
        mtargetviewgroup.removeview(target);
        mtargetviewgroup.addview(mfragmentlayout, target.getlayoutparams());

        settextcolor(mtextcolor);
        settextsize(mtextsize);
        setgravity(gravity.center);
        if (content != null && content.length() <= 3) {
            settext(content);
        }

          //文字和半径之间的适配
        if (content != null) {
            rect rect = new rect();
            this.getpaint().gettextbounds(content, 0, content.length(), rect);
            if (content.length() <= 3 && rect.width() >= mbadgeradio) {
                mbadgeradio = (uihelper.px2dip(mcontext, rect.width()) / 2) + 1;
            }
        }

        setbackgrounddrawable(getshapedrawable());
        mfragmentlayout.addview(target);
        mfragmentlayout.addview(this);
        mtargetviewgroup.invalidate();
    }


    private shapedrawable getshapedrawable() {
        int radio = uihelper.dip2px(mcontext, mbadgeradio);
        circledrawable drawable = new circledrawable(radio, mbadgecolor);
        return drawable;
    }

    /***
     *
     * @param content
     * @param target
     */
    public void showbadgeview(string content, view target) {
        showbadgeview(content, target,
                default_text_color,
                default_text_size,
                default_badge_color,
                default_badge_radio);
    }

    public void showbadgeview(view target) {
        showbadgeview(null, target,
                default_text_color,
                default_text_size,
                default_badge_color,
                default_badge_radio);
    }

    @override
    protected void onmeasure(int widthmeasurespec, int heightmeasurespec) {
        super.onmeasure(widthmeasurespec, heightmeasurespec);
    }

    @override
    protected void ondraw(canvas canvas) {
        super.ondraw(canvas);
    }

    @override
    protected void onlayout(boolean changed, int left, int top, int right, int bottom) {
        super.onlayout(changed, left, top, right, bottom);
    }
}

使用

    private badgeview mreadbadgeview;
    private textview mread;

	mreadbadgeview = new badgeview(getactivity());
    mreadbadgeview.showbadgeview("+99", mread);

总结

到此这篇关于android实现未读消息小红点显示实例的文章就介绍到这了,更多相关android未读消息小红点内容请搜索萬仟网以前的文章或继续浏览下面的相关文章希望大家以后多多支持萬仟网!

看完文章,还可以扫描下面的二维码下载快手极速版领4元红包

快手极速版二维码

快手极速版新人见面礼

除了扫码领红包之外,大家还可以在快手极速版做签到,看视频,做任务,参与抽奖,邀请好友赚钱)。

邀请两个好友奖最高196元,如下图所示:

快手极速版邀请好友奖励

扫描二维码推送至手机访问。

版权声明:本文由34楼发布,如需转载请注明出处。

本文链接:https://www.34l.com/post/7663.html

分享给朋友:

相关文章

应用汇下载安装最新版(2021最新版应用汇app)

应用汇下载安装最新版(2021最新版应用汇app)

Donews8月17日消息(记者 邱慧)近日,为安卓手机服务的应用型软件“应用汇”新版正式上线,同时推出“应用收藏”功能——“应用集”。 应用集主要分为“推荐”、“最热”、“最新”三类。应用汇官方介绍,此次新版上线后,安装包被优化缩小,给…

mac地址的作用是什么(理解mac地址的作用实验报告)

mac地址的作用是什么(理解mac地址的作用实验报告)

我们上网时会发现电子设备同时有IP地址和MAC地址,为什么上网会需要两个地址呢?…

win7开始菜单设置在哪里(win7开始菜单变成经典模式)

win7开始菜单设置在哪里(win7开始菜单变成经典模式)

我们在用win7系统的时候,发现打开了一些程序后,会在开始菜单那里显示这些最近打开的程序。有些人不想把自己最近打开的程序显示在这里,那么怎么可以删除这些程序,或者彻底让这里不会显示最近打开程序呢?下面我来教大家删除或设置不显示最近打开的程序…

现在农村做什么暴利比较好(农村适合的创业项目推荐)

现在农村做什么暴利比较好(农村适合的创业项目推荐)

在农村农民买东西的主要途径是农村赶集,这时候很多人会批发了东西来到农村集上去卖,这属小本暴利行业,可以赚不少钱。那么,农村赶集摆摊什么暴利?赶集卖什么利润大?下面一起来了解一下。 在农村赶集也是有不少工具可以售卖的,无外乎想要销量好的最好…

拉卡拉的卡拉如何OK?

拉卡拉的卡拉如何OK?

图源:摄图网 编者按:本文来自微信公众号财经无忌(ID:caijwj),作者:韦航,创业邦经授权转载 近日,中国新四大发明之一的移动支付,引起了舆论关注。 11月26日,一则“明年3月1日起,微信、支付宝个人收款码不能用于经营收款”的消息冲…

网易云:生而破发,我很抱歉

网易云:生而破发,我很抱歉

图源:摄图网 编者按:本文来自微信公众号财经新知(ID:caijingxinzhi),创业邦经授权转载 云村村长磊磊昨天好忙哦,搞了一个元宇宙的敲钟仪式,但还是阻挡不了破发的命运。 村长昨天敲钟分享的四首歌还记得吗:四次敲锣,四种心境。如…