首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

在安卓系统中更改BadgeDrawable字体

在安卓系统中,BadgeDrawable 是一种用于在图标上显示徽章(如未读消息数、通知数量等)的图形元素。它通常与 ImageView 或其他视图组件结合使用,以提供直观的用户界面反馈。

基础概念

BadgeDrawable 是 Android Support Library 或 AndroidX 库中的一个组件,它允许开发者轻松地在应用图标上添加一个带有数字或图标的徽章。这个徽章可以动态更新,以反映应用的状态变化。

相关优势

  1. 灵活性:可以自定义徽章的外观,包括颜色、大小、形状等。
  2. 易用性:提供了简单的 API 来设置和更新徽章内容。
  3. 兼容性:支持 Android 的多个版本,确保应用在不同设备上的表现一致。

类型

BadgeDrawable 本身是一个抽象类,但可以通过不同的实现类来创建不同类型的徽章,例如:

  • SimpleBadgeDrawable:一个简单的文本徽章。
  • IconBadgeDrawable:一个带有图标的徽章。

应用场景

  • 应用图标上的未读消息数显示。
  • 通知徽章,显示未读通知的数量。
  • 应用内特定功能的激活状态指示。

更改 BadgeDrawable 字体

在 Android 中,BadgeDrawable 默认不支持直接更改字体,因为它主要关注于徽章的图形表示。但是,你可以通过自定义 BadgeDrawable 的子类来实现字体的更改。

以下是一个简单的示例,展示如何创建一个自定义的 BadgeDrawable 子类,并在其中更改字体:

代码语言:txt
复制
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Typeface;
import android.support.annotation.NonNull;
import android.support.v4.graphics.drawable.DrawableCompat;
import android.support.v7.widget.AppCompatImageView;
import android.util.AttributeSet;

public class CustomBadgeDrawable extends AppCompatImageView {

    private Paint textPaint;
    private String badgeText = "";
    private int badgeColor = Color.RED;
    private int badgeTextColor = Color.WHITE;
    private int badgeSize = 20;

    public CustomBadgeDrawable(Context context) {
        super(context);
        init();
    }

    public CustomBadgeDrawable(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    private void init() {
        textPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
        textPaint.setTextSize(12);
        textPaint.setColor(badgeTextColor);
        Typeface typeface = Typeface.create("sans-serif-medium", Typeface.NORMAL);
        textPaint.setTypeface(typeface);
    }

    public void setBadgeText(String text) {
        this.badgeText = text;
        invalidate();
    }

    public void setBadgeColor(int color) {
        this.badgeColor = color;
        invalidate();
    }

    public void setBadgeTextColor(int color) {
        this.badgeTextColor = color;
        invalidate();
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);

        if (!badgeText.isEmpty()) {
            int badgeWidth = (int) textPaint.measureText(badgeText) + badgeSize;
            int badgeHeight = badgeSize;

            int x = getWidth() - badgeWidth;
            int y = badgeHeight;

            canvas.drawCircle(x, y, badgeSize / 2, textPaint);
            canvas.drawText(badgeText, x + badgeSize / 2 - textPaint.measureText(badgeText) / 2, y + badgeSize / 2 + textPaint.getTextSize() / 2, textPaint);
        }
    }
}

在这个示例中,我们创建了一个 CustomBadgeDrawable 类,它继承自 AppCompatImageView。我们重写了 onDraw 方法来绘制徽章,并使用 Typeface 类来设置徽章文本的字体。

解决常见问题

  • 字体显示不正确:确保你使用的字体文件已正确添加到项目的资源目录中,并且路径正确。
  • 性能问题:如果徽章频繁更新,考虑使用 Viewinvalidate() 方法来最小化重绘区域。
  • 兼容性问题:确保你的自定义 BadgeDrawable 在目标 Android 版本上测试通过。

参考链接

请注意,这个示例代码仅用于演示目的,实际应用中可能需要更多的自定义和优化。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Android--SVG系统的应用

,性能高等优势,谷歌Android5.0引进了SVG,并转化为Vector,Android中指的是Vector Drawable,也就是Android的矢量图,可以说Vector就是Android...2.1以上的所有系统,只需要引用com.android.support:appcompat-v7:23.2.0以上的版本就可以了。...Vector 语法简介 通过使用它的Path标签,几乎可以实现SVG的其它所有标签,虽然可能会复杂一点,但这些东西都是可以通过工具来完成的,所以,不用担心写起来会很复杂。...接下来是我们程序员需要注意的地方,工程中使用Vector Drawable兼容5.0以下的版本方法 1、使用Android Studio 2.2以上的版本,gradle版本2.0以上 1.1、gradle...添加 defaultConfig { vectorDrawables.useSupportLibrary = true } 1.2、gradle添加 compile

2.8K20

使用Clang编译C程序设备执行

由于Android NDK从r18开始就已经抛弃GCC,转而将Clang当作默认编译器,因此我们直接使用NDK工具包进行编译 实验环境 模拟器 android-ndk-r19c 实验步骤 第一步 源码编写...\n"); return 0; } 第二步 源码编译 android-ndk-r19c目录下toolchains文件夹的llvm文件夹即为clang编译工具包 llvm的子目录bin...下存放这针对各个架构的clang编译器,由于模拟器是ARM架构,这里我们使用armv7a-linux-androideabi23-clang 命令窗口执行如下指令: armv7a-linux-androideabi23...-clang test.c -o test 由于clang已经指定了Android23版本的SDK,这里无需要像GCC那样指定-static编译 第三步 将编译后的可执行文件传至设备 adb push

2.9K20
  • Java自定义注解开发的简单运用

    它是JDK1.5及以后版本引入的一个特性,与类、接口、枚举是同一个层次。它可以声明包、类、接口、枚举、字段、方法、局部变量、方法参数等的前面,用来对这些元素进行说明,注释。...:通过代码里标识的元数据让编译器能够实现基本的编译检查【Override】 java中有很多框架都用到了注解包括java的Api也是,想一些网络框架的@GTE,@POST,@PATH等等,java的...@Override注解是可以被继承的,它是可以代码编译期告诉JVM类之间的继承关系,那到底注解是怎么实现的呢,首先你要定义一个注解,然后通过反射来实现你所要的功能。...通过反射找到控件 以上代码有一些反射基础的同学都可以看明白,而且的写了注释,最后是页面的代码 ?...Activity页面 控件上面写上注释和它的ID值,使用控件之前把上下文传递给FindViewByReflection这个类,让它通过反射来遍历所有用到了注释的变量,然后为它们赋值,也就是在运行过程

    1.6K10

    用 TensorFlow Lite 系统上实现即时人体姿态跟踪

    PoseNet是一种视觉模型,通过检测关键身体部位的位置来估计人在图像或视频的姿势。例如,模型可以估计一个人的肘部和/或膝盖图像的位置。...举几个例子,开发人员可以基于身体图像的增强现实,动画计算机图形字符,并分析运动员在运动的步态。...应用程序对每个传入的相机图像执行以下步骤: 1、从相机预览捕获图像数据,并将其从YUV_420_888转换为ARGB_888格式。 2、创建一个位图对象来保存RGB格式帧数据的像素。...画布对象上绘制新的位图。 5、使用从Person对象获取的关键点的位置画布上绘制骨架。显示置信度得分高于某个阈值的关键点,默认值为0.2。...SurfaceView通过视图画布上获取、锁定和绘制来确保将surface毫不延迟地放到屏幕上。

    3.8K30

    脚本项目开发的一些简单应用

    前言 平时的项目开发过程,除了业务逻辑的编写以外,还有一些其它的琐事需要处理,比如资源更新、单元测试、资源压缩等。...一、 什么是脚本 脚本简单地说就是一条条的文字命令,这些文字命令是可以看到的(如可以用记事本打开查看、编辑),脚本程序执行时,是由系统的一个解释器,将其一条条的翻译成机器可识别的指令...我是写了两个批处理,这样切换到不同分辨率时双击运行对应的批处理即可。几秒搞定,再也不用记那些繁琐的命令了。 3 资源更新 需求描述:项目中会使用到的一些资源如图片、音频、视频、字体、H5页面等。...这其中可能会有问题: 1、视觉的同事输出的图片名称为了辨别很多都是用的中文,我们拷贝到工程的时候需要进行改名,改成我们工程需要的英文名称; 2、当文件比较多的时候,...if "%1"=="unitTest" call unitTest.bat goto END echo wrong param :END pause 步骤三:将该scripts文件夹添加到系统的环境变量

    2K20

    Android Instant App(即时应用程序)启用 ProGuard (混淆)

    gold-m… 译者:JayZhaoBoy 校对者:hanliuxin5 Instant Apps(即时应用)和 4 MB 字节的限制 把一个已经存在的应用程序转换成 Android Instant App(即时应用程序...这里有许多通用和 即时程序专用(AIA 意为 Android Instant Apps)的技术可以减少 APK 大小,你应该都去了解一下,但使用 ProGuard(混淆)来移除未使用的代码对 nstant...当 ProGuard(混淆)集成到 Android 构建中时,新的 com.android.feature Gradle 插件(用于构建 AIA (即时应用程序)模块)根本不存在,并且 ProGuard...我选择了一个名为 aia-proguard-rules.pro 的文件用于我的 Android Instant App(即时应用程序)专用 ProGuard(混淆)配置。...使用一点 shell 魔法(我在后面的所有命令都是基于 Linux 系统的 bash命令),我们可以得到 ProGuard(混淆)规则需要保留的类的列表: $ apkanalyzer dex packages

    2.6K30

    NrealCES 2020上发布3D系统“星云”,支持全部应用

    北京时间1月7日,可穿戴式混合现实(MR)眼镜开发商NrealCES 2020上宣布,推出全新的3D系统—“星云”。...智能手机与Nreal Light绑定后,手机将变成操控手柄,用户可以进行操作及交互。...由上海星为棋(Chesstar Studios)开发的《快斩三国 AR版》,玩家可以利用6个自由度的控制器进行精准交互;《Zombie Bomber AR》,玩家可以使用手机作为控制器来向僵尸投掷炸弹...;《Corner Fight》,使用黑鲨的双翼游戏手柄,玩家能够进行街机风格的滚动式格斗。...智能家居方面,Nreal Light支持通过手势控制家中的智能家电,成为智能设备的信息中枢系统

    89210

    爆料 | “间谍门”事件愈演愈烈,又一家中国公司被曝300万台设备植入rootkit

    300万台设备植入RootKit 根据研究报告声称,已经有三百万台安设备在出厂的时候被被植入了该恶意软件。...两位研究人员从Best Buy官网购买了一部BLU Studio G手机,研究人员才配置好抓包系统后,很快一条未加密的连接就出现在了屏幕上,该连接指向了oyag.lhzbdvm.com。 ?...远程攻击者完全可以窃取受影响设备的个人信息,远程进行设备的wipe操作,甚至可以企业网络获取其他系统的访问权,获取敏感信息。...Lead 3i LEAGOO Lead 2S LEAGOO Alfa 6 IKU Colorful K45i Beeline Pro 2 XOLO Cube 5.0 根据统计,目前受到此rootkit感染的设备数量超过...显然这次的中国安设备“间谍门“事件越演越烈,或许将会影响到中国到欧美地区的国际业务,而美国政府很有可能会加大对中国互联网产品的安全检测。

    1.5K70

    视频防综合管理系统物流仓储防建设的重要性

    通过仓库内重要场所部署系统,可以有效提升仓储综合管理和安全防范水平,有效实时防范盗窃、抢劫、蓄意破坏等违法犯罪事件,同时系统存储的视频资料可为后续处理仓储行为纠纷及其他违法行为提供可视的直观依据。...图片目前,各物流仓储公司具备的物流仓储管理系统包括视频监控系统、门禁系统、周界监控系统、报警控制系统以及数据处理系统等,通过音视频、红外线等传感器对所有仓库实时监控,既可以对开门取物和车辆人员进出流动状态监测...SkeyeVSS视频防综合管理平台秉持网络化、集成化、智能化的理念,采用先进的软硬件开发技术,确保视频实时监控、视频存储与回放等功能的基础上,为物流仓储提供一站式私有化部署视频防综合管理系统解决方案...,解决物流仓储综合系统集中管理、多级联网、信息共享、互联互通、多业务融合等问题。...3、子系统、第三方平台对接与开发:系统低耦合,采用分布式微服务架构,可灵活配置系统的各个子系统服务;此外还可提供设备侧与应用侧的快速开发,SDK集成度高,集成周期短,可快速完成APP对接开发,从而实现系统综合化

    62210

    谷歌的系统中国免费使用,那他在这过程中有什么利益或者收入?

    现在还是很多人不理解系统作为免费的系统,谷歌是如何通过系统获取利润的,在这点上谷歌表现出极其聪明的一方面,最早谷歌准备准备推广自己的系统,由于在这个行业内没有太多的积累,想要抢占这个制高点首先要在模式上有所创新...,就是谷歌辛辛苦苦研发的系统全球范围内是公开的,这种模式在当时还是给人眼前一亮的感觉。...所以很多厂家都带着试试看的态度加入了谷歌的生态,最早合作的厂家是HTC,后来从4.0开始就被三星控制了,一直到现在为止三星都是谷歌系统最大的合作厂家,中国的华为公司后来居上也智能手机行业做出了名堂...,而且如果不是美国的全力打压现在华为手机全球的销量已经超过韩国的三星了,很多人觉得谷歌做了这么多的事情战略目的是什么,其实站在今天的角度上看系统,已经能够看出端倪谷歌通过系统推广自己的GMS全家桶...谷歌上的战略已经非常成功了,而且市值上已经得到证实,谷歌对于免费使用的策略未来也不会改变,因为生态已经被大众接受谷歌不太可能会有所改变,希望能帮到你。

    1.5K20

    Android Studio 和 SDK 下载、安装和环境变量配置

    : (2)选择需要安装的组件,Android Studio主程序默认已勾选, Android SDK这里也要勾选(假如你已经单独装了SDK,就不需要了) Android Virtual Device虚拟设备...,就是电脑上虚拟出手机的环境,让你可以直接在电脑上运行开发出的APP 这里没有勾选,也建议不要勾选,测试APP的话,直接在真机(一部手机)上测试更好,因为官方出的这个虚拟设备,电脑上运行很慢...,即便你没有一部手机,也可以选择其他的模拟器,运行速度都比这个快 (3)选择  I Agree   (4)这是Android Studio  和  SDK  的默认安装路径 (5)这里分别改成...Android Studio的bin目录下找到 idea.properties 这个文件 这里的路径是:D:\Android\Android Studio\bin 使用记事本或其他编辑器,打开这个文件,更改...,因为默认字体实在太小了 点击Save As,然后才能开始修改字体大小 Size, 改成16就好了 (至于字体样式看个人习惯,我这里直接默认) (5)选择显示行号 6、开始第一个Hello World

    2K20

    Android Studio 和 SDK 下载、安装和环境变量配置

    : (2)选择需要安装的组件,Android Studio主程序默认已勾选, Android SDK这里也要勾选(假如你已经单独装了SDK,就不需要了) Android Virtual Device虚拟设备...,就是电脑上虚拟出手机的环境,让你可以直接在电脑上运行开发出的APP 这里没有勾选,也建议不要勾选,测试APP的话,直接在真机(一部手机)上测试更好,因为官方出的这个虚拟设备,电脑上运行很慢...,即便你没有一部手机,也可以选择其他的模拟器,运行速度都比这个快 (3)选择 I Agree (4)这是Android Studio 和 SDK 的默认安装路径 (5)这里分别改成...Android Studio的bin目录下找到 idea.properties 这个文件 这里的路径是:D:\Android\Android Studio\bin 使用记事本或其他编辑器,打开这个文件,更改...,因为默认字体实在太小了 点击Save As,然后才能开始修改字体大小 Size, 改成16就好了 (至于字体样式看个人习惯,我这里直接默认) (5)选择显示行号 6、开始第一个Hello World

    1.8K20

    ios兼容问题及处理(小程序H5)

    微信小程序new Date()转换时间时间格式时IOS不兼容的问题 问题:然后利用new Date() 转换时间戳时,使用微信开发工具、都没问题,ios无法展示并报错 “invalid date...IOS机型margin属性无效问题 问题: 底部footer设置margin属性的时候发现真机IOS上无效,微信开发者工具/手机/谷歌iphone/机型皆正常 原因: iOS8后,UIView...size class)不同而不同,可能取值为16或者20pt(iPhone6 plus, iPad),你不能修改这些值 解决办法: footer底部加空div给height 3. input输入框在ios光标及字体不居中...问题: input输入框在ios光标及字体不居中 原因: 使用line-height垂直居中。...问题 :video 视频格式m3u8,ios里边儿不能播放,但是能正常播放 原因:xxx 解决办法:添加 custom-cache={{cache}} ,data 添加 cache:false

    7.8K71

    一步步从基础到精通自学教程,纯实战,纯干货(五)

    下面是前四次课程列表: 程序员带你学习开发,十天快速入门-学习必要性 程序员带你学习开发,十天快速入门-开发工具配置学习 程序员带你学习开发,十天快速入-对比C#学习java语法 程序员带你学习开发...,十天快速入门-基础知识(四) 为了大家系统有效的快速入门开发,推荐大家按照顺序依次系统观看本系列教程。...目录: 第一个程序 常用android控件 简单计算器 第一个程序 在前面课程 我们已经创建过第一个android软件。...我们看到里面的TextView就是文本显示的控件,我们可以更改adnroid:text属性的值,更改我们软件界面显示的文字。我们改为“做全栈攻城狮” 此时运行就显示做全栈攻城狮了。 ?...更改文字大小:android:textSize(字体的值用单位sp)例如 更多控件知识后期写代码过程慢慢介绍。 ? 3.简单计算器程序 我们实现一个简单的计算器程序界面。 ?

    89320

    开发过程的RatingBar、Handler以及GPS大型项目中的使用【Android】

    RatingBar 点击评分栏后,通过Toast显示当前分数 单击按钮获取当前分数并将其显示TextView上 <RatingBar android:id="@+id/rb_normal...关键是<em>在</em>加载页面时使用onload()加载相应的js脚本。js脚本<em>中</em>定义的一个函数是取出传递的对象,获取其中的数据,并通过for循环以单位行的形式打印出来! 有图片和事实。...用户无法<em>更改</em>。...当<em>系统</em>创建UI线程时,它将初始化Looper对象并创建与其关联的MessageQueue; 处理程序:用于发送和处理信息。...<em>安</em><em>卓</em><em>系统</em><em>中</em>通常有四种定位方法:GPS定位、WIFI对准、基站定位、AGPS定位(基站+GPS); 本系列教程仅解释GPS定位的基本用法!GPS用于通过与卫星的交互获得设备的当前经度和纬度。

    1.8K10

    逆向:这是一篇逆向基础函数ARM32的刨根问底。

    栈帧函数的使用? 1. 怎样ARM汇编中去识别和定位出函数 1.使用专门的跳转指令。...参数传递时,将所有参数看做是存放在连续的内存单元的字数据。...ARM指令系统是地址递减栈,入栈操作的参数入栈顺序是从右到左依次入栈,而参数的出栈顺序则是从左到右的你操作。包括push/pop和LDMFD/STMFD等。 3.函数的参数是怎样进行传递的?...以上ARM汇编bx前面有再开辟完栈空间后有对应的六个ldr指令,表示这个函数有六个参数 ? 4.函数的返回值是通过怎样接收存储?...下例栈就是用于存储保存局部变量的。 ? ? 栈用于存储返回值的 ? ? Str r0,[r7,#12]意思是将返回值R0写入到栈[r7,#12]的位置 7. 栈帧函数的使用?

    3.5K74

    Vue-cli3 项目低版本系统和 IE 上白屏问题解决

    最近遇到一个问题,用 Vue 开发的项目最近两年新出的手机上没问题,在三四年前的旧手机上出现白屏问题。...分析一下应该是系统版本的原因,目前已知的是Android 6.0 以上都 OK,6.0 以下就不行了。 低版本系统内置的 webview 不支持 ES6 语法等一些新特性,所以报错。...将以下代码复制到 .babelrc 文件 { "presets": ["@babel/preset-env"], "plugins": [ "@babel/plugin-transform-runtime...修改 babel.config.js 将以下代码复制到 babel.config.js 文件,其中最上面四行是打包时删除 console 的配置,如不需要可以删除。...preset-env es6-promise babel-polyfill babel-plugin-transform-remove-console 复制代码 以上五步配置完就可以解决 Vue 项目低版本系统

    2.8K10
    领券