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

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

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

使用 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

分享给朋友:

相关文章

闪客快跑2背景音乐(闪客快打andylaw的微博)

闪客快跑2背景音乐(闪客快打andylaw的微博)

《疯狂跑酷》是一款LowPoly(低多边形)画风的跑酷游戏,一场突如其来的大水淹没了城市,而你在游戏中扮演一名刚下班的男子,需要从被水淹没的城市中逃出生天。…

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

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

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

创业前4年无产品,量产一年销售近亿元,这家公司怎么做到的?

创业前4年无产品,量产一年销售近亿元,这家公司怎么做到的?

光子晶体前4年都在死磕产品研发,直到去年才正式量产,目前已实现每月数万平米的光学显示膜出货,销售额近亿元,收获了苹果、亚马逊等合作伙伴,在透明显示领域开了先河。 作者丨解夏 编辑丨及轶嵘 图源丨受访者 “家里的窗户、汽车车窗、公司的玻璃幕墙…

诺基亚c2-01手机参数(诺基亚最新款手机)

诺基亚c2-01手机参数(诺基亚最新款手机)

诺基亚C2 Android Go Edition 价格:暂无价格 上市时间:2020年03月 屏幕尺寸:5.7英寸 分辨率:1520×720 触摸屏类型:电容触摸屏,多点触控CPU型号:紫光展锐SC9832E CPU核数:四核 操作系统:…

2022年个税专项附加扣除开始确认(年终奖纳税方式将发生变化)

2022年个税专项附加扣除开始确认(年终奖纳税方式将发生变化)

2022年度个人所得税专项附加扣除开始确认啦。纳税人可以登录个人所得税App进行修改、确认。 2022年个人所得税 专项附加扣除开始确认 专项附加扣除的信息需要纳税人每年提交一次。2022年需享受专项附加扣除的纳税人,要在今年12月对信息进…

租房合同可以签电子合同吗

租房合同可以签电子合同吗

租房合同可以签电子合同。租房合同本质上是一种租赁合同,不在法律规定不适用电子合同的文书之列。所以,在当事人共同约定使用的情况下,租房合同以电子合同签约是有法律效力的。 房屋租赁当事人应当依法订立租赁合同。房屋租赁合同的内容由当事人双方约定,…