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

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

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

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

分享给朋友:

相关文章

20句经典语录分享,​我们学会了告别,却低估了思念

20句经典语录分享,​我们学会了告别,却低估了思念

20句经典语录分享,我们学会了告别,却低估了思念,下面这些都是非常经典的语录,值得你看一下哦。…

融资丨「奕斯伟计算」完成25亿元C轮融资,目标物联网芯片领域全球领导者

融资丨「奕斯伟计算」完成25亿元C轮融资,目标物联网芯片领域全球领导者

创业邦获悉,12月1日,AIoT芯片与解决方案提供商北京奕斯伟计算技术有限公司(以下简称:奕斯伟计算)宣布完成25亿元人民币C轮融资,由金石投资和中国互联网投资基金联合领投,尚颀投资、国开科创、华新投资等跟投,老股东 IDG、君联资本、刘益…

带货主播成正式工种;AITO汽车来了;小米、英特尔入股张艺谋等创办的VR公司 ;特斯拉推出儿童电动车丨邦早报

带货主播成正式工种;AITO汽车来了;小米、英特尔入股张艺谋等创办的VR公司 ;特斯拉推出儿童电动车丨邦早报

【电子驾驶证12月10日起全国全面推行】据公安部消息,12月10日起,电子驾驶证在全国全面推行。此前,驾驶证电子化已覆盖北京、上海、广州、西安等200个城市,5000多万名驾驶人领取了电子驾驶证,实现手机在线“亮证”。电子驾驶证通过全国“交…

豆瓣直播,谁会买单?

豆瓣直播,谁会买单?

图源:摄图网 编者按:本文来自微信公众号连线Insight(ID:lxinsight),作者:张霏,编辑:李信,创业邦经授权转载 被外界视为低调的豆瓣从不缺关注。 昨晚,#豆瓣已暂停小组回复功能#和#国家网信办依法约谈处罚豆瓣网#双双冲上…

拉卡拉的卡拉如何OK?

拉卡拉的卡拉如何OK?

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

火了12年,“假洋鬼子”终于翻车了

火了12年,“假洋鬼子”终于翻车了

图源:摄图网 编者按:本文来自微信公众号格隆汇财经热点(ID:glh_finance),作者:万连山,创业邦经授权转载 你肯定看到过这样一幅广告:一个与乔布斯颇有几分相似的神秘洋老头,戴着金丝眼镜,有时叼着烟斗,有时没有,出现在各大高铁站和…