android TextView 可自定义图标的带角标文字组件

家长必看!用RouterOS轻松屏蔽不良网站,保护孩子上网安全 本文为家长提供了一份详细的RouterOS路由器配置指南,旨在通过技术手段保护儿童上网安全。文章核心介绍了如何利用RouterOS的DNS静态条目功能,轻松实现禁止访问特定不良网站,并结合防火墙时间规则,为孩子构建一个纯净、可控的家庭网络环境,操作简单,无需专业背景。 阅读详情

效果图
效果图

TextDrawable.java

import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;

import androidx.annotation.ColorInt;
import androidx.annotation.DrawableRes;
import androidx.annotation.IntRange;
import androidx.appcompat.widget.AppCompatTextView;

import com.yourpackage.R;

import org.jetbrains.annotations.NotNull;

/**
 * @author octopus yan
 * @email octopus_yan@foxmail.com
 * @Description 可自定义图标的文字组件
 * @createTime 2021-12-06 14:58:16
 */
public class TextDrawable extends AppCompatTextView {
    private Drawable drawableLeft;
    private Drawable drawableRight;
    private Drawable drawableTop;
    private int tmpTopHeight = 0;
    private boolean showCornerMark;
    private String cornerMarkText;
    private Drawable cornerMarkBackground;
    private Integer cornerMarkBackgroundColor;
    private int cornerMarkWidth;
    private int cornerMarkHeight;
    private int cornerMarkTextSize;
    @ColorInt
    private int cornerMarkTextColor;
    private int cornerMarkTextPadding;
    private Paint cornerMarkPaint;
    private Paint cornerMarkBgPaint;
    private Path cornerMarkBgPath;
    private int leftWidth;
    private int rightWidth;
    private int topWidth;
    private int leftHeight;
    private int rightHeight;
    private int topHeight;
    private final Context mContext;

    private final int defaultDrawableSize;
    private final int defaultCornerMarkSize;

    private int viewWidth;
    private int viewHeight;

    public TextDrawable(Context context) {
        this(context, null);
    }

    public TextDrawable(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public TextDrawable(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        this.mContext = context;
        defaultDrawableSize = dip2px(context, 20);
        defaultCornerMarkSize = dip2px(context, 5);
        init(context, attrs);
    }

    private void init(Context context, AttributeSet attrs) {
        TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.TextDrawable);
        drawableLeft = typedArray.getDrawable(R.styleable.TextDrawable_leftDrawable);
        drawableRight = typedArray.getDrawable(R.styleable.TextDrawable_rightDrawable);
        drawableTop = typedArray.getDrawable(R.styleable.TextDrawable_topDrawable);
        if (drawableLeft != null) {
            leftWidth = typedArray.getDimensionPixelOffset(R.styleable.TextDrawable_leftDrawableWidth, defaultDrawableSize);
            leftHeight = typedArray.getDimensionPixelOffset(R.styleable.TextDrawable_leftDrawableHeight, defaultDrawableSize);
        }
        if (drawableRight != null) {
            rightWidth = typedArray.getDimensionPixelOffset(R.styleable.TextDrawable_rightDrawableWidth, defaultDrawableSize);
            rightHeight = typedArray.getDimensionPixelOffset(R.styleable.TextDrawable_rightDrawableHeight, defaultDrawableSize);
        }
        if (drawableTop != null) {
            topWidth = typedArray.getDimensionPixelOffset(R.styleable.TextDrawable_topDrawableWidth, defaultDrawableSize);
            topHeight = typedArray.getDimensionPixelOffset(R.styleable.TextDrawable_topDrawableHeight, defaultDrawableSize);
        }

        // 角标
        showCornerMark = typedArray.getBoolean(R.styleable.TextDrawable_cornerMarkShow, false);

        if (showCornerMark) {
            cornerMarkText = typedArray.getString(R.styleable.TextDrawable_cornerMark);
            try {
                cornerMarkBackground = typedArray.getDrawable(R.styleable.TextDrawable_cornerMarkBackgroud);
            } finally {
                if (cornerMarkBackground == null) {
                    cornerMarkBackgroundColor = typedArray.getColor(R.styleable.TextDrawable_cornerMarkBackgroud, context.getColor(R.color.transparent));
                }
            }
            cornerMarkWidth = typedArray.getDimensionPixelOffset(R.styleable.TextDrawable_cornerMarkWidth, defaultCornerMarkSize);
            cornerMarkHeight = typedArray.getDimensionPixelOffset(R.styleable.TextDrawable_cornerMarkHeight, defaultCornerMarkSize);
            cornerMarkTextSize = typedArray.getDimensionPixelSize(R.styleable.TextDrawable_cornerMarkTextSize, dip2px(context, 10));
            cornerMarkTextColor = typedArray.getColor(R.styleable.TextDrawable_cornerMarkTextColor, context.getColor(R.color.red));
            cornerMarkTextPadding = typedArray.getDimensionPixelSize(R.styleable.TextDrawable_cornerMarkPadding, dip2px(context, 4));

            cornerMarkPaint = new Paint();
            cornerMarkPaint.setTextSize(cornerMarkTextSize);
            cornerMarkPaint.setColor(cornerMarkTextColor);
            cornerMarkPaint.setTextAlign(Paint.Align.LEFT);// 右对齐
        }
    }

    public int dip2px(Context context, float dpValue) {
        final float scale = context.getResources().getDisplayMetrics().density;
        return (int) (dpValue * scale + 0.5f);
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        final int compoundPaddingTop = getCompoundPaddingTop();
        final int compoundPaddingRight = getCompoundPaddingRight();
        if (drawableLeft != null) {
            drawableLeft.setBounds(0, 0, leftWidth, leftHeight);
        }
        if (drawableRight != null) {
            drawableRight.setBounds(0, 0, rightWidth, rightHeight);
        }
        if (drawableTop != null) {
            drawableTop.setBounds(0, 0, topWidth, topHeight);
            tmpTopHeight = topHeight;
        }
        if (cornerMarkBackground != null && showCornerMark) {
            cornerMarkBackground.setBounds(
                    viewWidth - cornerMarkWidth - compoundPaddingRight - 2 * cornerMarkTextPadding,
                    compoundPaddingTop - tmpTopHeight,
                    viewWidth - compoundPaddingRight,
                    compoundPaddingTop + cornerMarkHeight + 2 * cornerMarkTextPadding - tmpTopHeight
            );
        }

        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    }

    @Override
    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
        super.onSizeChanged(w, h, oldw, oldh);
        viewWidth = w;
        viewHeight = h;
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        final int compoundPaddingTop = getCompoundPaddingTop();
        final int compoundPaddingRight = getCompoundPaddingRight();
        this.setCompoundDrawables(drawableLeft, drawableTop, drawableRight, null);

        // 画角标
        if (showCornerMark && cornerMarkText != null) {
            Paint.FontMetricsInt fontMetricsInt = cornerMarkPaint.getFontMetricsInt();
            int top = fontMetricsInt.top;
            int bottom = fontMetricsInt.bottom;

            // 角标文字宽高计算
            float textWidth = cornerMarkPaint.measureText(cornerMarkText);
            float textHeight = (bottom - top) / 2f + bottom;
            if (cornerMarkWidth < textWidth) cornerMarkWidth = (int) textWidth;
            if (cornerMarkHeight < textHeight) cornerMarkHeight = (int) textHeight;

            // 先画背景
            if (cornerMarkBackground != null) {
                cornerMarkBackground.draw(canvas);
            } else {
                if (cornerMarkBgPaint == null) {
                    cornerMarkBgPath = new Path();
                    cornerMarkBgPaint = new Paint();
                    cornerMarkBgPaint.setColor(cornerMarkBackgroundColor);
                }
                //将原点移动到原点
                canvas.translate(0, 0);
                //绘制角标背景
                cornerMarkBgPath.moveTo(viewWidth - textWidth - compoundPaddingRight - 2 * cornerMarkTextPadding, compoundPaddingTop - tmpTopHeight); //将Path的起点移动到A
                cornerMarkBgPath.lineTo(viewWidth - compoundPaddingRight, compoundPaddingTop - tmpTopHeight); //连接AB
                cornerMarkBgPath.lineTo(viewWidth - compoundPaddingRight, textHeight + compoundPaddingTop + 2 * cornerMarkTextPadding - tmpTopHeight); //连接BC
                cornerMarkBgPath.lineTo(viewWidth - textWidth - compoundPaddingRight - 2 * cornerMarkTextPadding, textHeight + compoundPaddingTop + 2 * cornerMarkTextPadding - tmpTopHeight); //连接CD
                cornerMarkBgPath.close(); //闭合Path,即连接DA
                canvas.drawPath(cornerMarkBgPath, cornerMarkBgPaint);
            }

            // 角标内容
            canvas.drawText(
                    cornerMarkText,
                    viewWidth - textWidth - compoundPaddingRight - cornerMarkTextPadding,
                    (bottom - top) / 2f + 1 + compoundPaddingTop + cornerMarkTextPadding - tmpTopHeight,
                    cornerMarkPaint
            );
        }
    }

    /**
     * 设置左侧图片并重绘
     */
    public void setDrawableLeft(Drawable drawableLeft) {
        this.drawableLeft = drawableLeft;
        invalidate();
    }

    /**
     * 设置左侧图片并重绘
     */
    public void setDrawableLeft(@DrawableRes int drawableLeftRes) {
        this.drawableLeft = mContext.getResources().getDrawable(drawableLeftRes);
        invalidate();
    }

    /**
     * 设置右侧图片并重绘
     */
    public void setDrawableRight(Drawable drawableRight) {
        this.drawableRight = drawableLeft;
        invalidate();
    }

    /**
     * 设置右侧图片并重绘
     */
    public void setDrawableRight(@DrawableRes int drawableRightRes) {
        this.drawableRight = mContext.getResources().getDrawable(drawableRightRes);
        invalidate();
    }

    /**
     * 设置上部图片并重绘
     */
    public void setDrawable(Drawable drawableTop) {
        this.drawableTop = drawableTop;
        invalidate();
    }

    /**
     * 设置右侧图片并重绘
     */
    public void setDrawableTop(@DrawableRes int drawableTopRes) {
        this.drawableTop = mContext.getResources().getDrawable(drawableTopRes);
        invalidate();
    }

    /**
     * 设置角标文字
     */
    public void setCornerMarkText(@NotNull String text) {
        this.cornerMarkText = text;
    }

    /**
     * 设置角标宽
     */
    public void setCornerMarkWidth(@IntRange(from = 0)int width) {
        this.cornerMarkWidth = width;
    }

    /**
     * 设置角标高
     */
    public void setCornerMarkHeight(@IntRange(from = 0)int height) {
        this.cornerMarkHeight = height;
    }

    /**
     * 设置角标文字大小 单位:px
     */
    public void setCornerMarkTextSize(@IntRange(from = 0)int textSize) {
        this.cornerMarkTextSize = textSize;
        if (cornerMarkPaint != null) {
            cornerMarkPaint.setTextSize(textSize);
        }
    }

    /**
     * 设置角标文字颜色
     */
    public void setCornerMarkTextColor(@ColorInt int color) {
        this.cornerMarkTextColor = color;
        if (cornerMarkPaint != null) {
            cornerMarkPaint.setColor(color);
        }
    }

    /**
     * 设置角标内边距
     */
    public void setCornerMarkTextPadding(@IntRange(from = 0) int padding) {
        this.cornerMarkTextPadding = padding;
    }
}


attrs.xml

	<declare-styleable name="TextDrawable">
        <!--左图标-->
        <attr name="leftDrawable" format="reference" />
        <attr name="leftDrawableWidth" format="dimension" />
        <attr name="leftDrawableHeight" format="dimension" />
        <!--右图标-->
        <attr name="rightDrawable" format="reference" />
        <attr name="rightDrawableWidth" format="dimension" />
        <attr name="rightDrawableHeight" format="dimension" />
        <!--上图标-->
        <attr name="topDrawable" format="reference" />
        <attr name="topDrawableWidth" format="dimension" />
        <attr name="topDrawableHeight" format="dimension" />
        <!--角标-->
        <attr name="cornerMarkShow" format="boolean" />
        <attr name="cornerMark" format="integer|string" />
        <attr name="cornerMarkPadding" format="dimension" />
        <attr name="cornerMarkTextSize" format="dimension" />
        <attr name="cornerMarkTextColor" format="color" />
        <attr name="cornerMarkBackgroud" format="reference" />
        <attr name="cornerMarkWidth" format="dimension" />
        <attr name="cornerMarkHeight" format="dimension" />
    </declare-styleable>
RK3588 开启多窗口 这样就支持多窗口了。 阅读详情

相关推荐

DAIC-WOZ数据集文件结构详解:CLNF特征文件、音频转录与PHQ8评分全解读

本文深入解析DAIC-WOZ数据集的文件结构,重点介绍CLNF特征文件、音频转录与PHQ8评分的详细内容。通过多模态数据处理实战指南,帮助研究者高效利用这一抑郁分析领域的重要资源,掌握面部动作单元、声学特征和文本转录的科学解读与应用技巧。

weixin_29159711的博客 185

有了它,再也不用怕在TextView的任意位置添加各式各样的标签了

在TextView任意位置添加文本、图文、图标、网络标签,并且可以替换指定字符串为标签,快速给文本添加下划线、删除线、格式化指定文本等等

Like的博客 1026

华为OD机考双机位C卷 - 手机App防沉迷系统(Java & Python& JS & C/C++ & GO )

华为OD机考双机位C卷 - 手机App防沉迷系统(OD上机考试双机位C卷)。提供在线OJ刷题。Java、C++、Python、GO语言、C语言、JavaScript题解,并提供完整思路讲解。

算法大师! 2062

idea为什么不显示src_idea新建maven项目没有src目录的操作方法

方法一:设置idear的maven运行参数或:加:archetypeCatalog=internal如果ctrl+alt+s进设置,只能对当前项目新建Module其作用:方法二:在新建maven项目时候设置archetypeCatalog=internal,这种方式每次都需要设置,而且spring boot项目没这个设置,推荐第一种方法。其他方法:命令方式:mvn archetype:genera...

weixin_39950081的博客 2621

HBV模型

据说mHM模型也是基于HBV模型原理。 网上不同版本的HBV模型稍有差别 def hbv_main(n_days, params, air_temp, prec, dpem): #n_days 模拟天数 #air_temp 每月温度 #prec 降水 #dpem 每月蒸发 Tsnow_thresh = 0.0 ca = 410. # Initialize arrays for the simiulation snow = np.zeros(air_temp.size

m0_46268055的博客 2332

《嵌入式最全面试题-Offer直通车》目录

嵌入式领域蓬勃发展,嵌入式工程师成为众多科技企业争抢的热门人才。如果你渴望在嵌入式面试中脱颖而出,成功斩获心仪的 offer,那么《嵌入式最全面试题 - Offer直通车》将是你的绝佳选择。本专栏是优快云是热门专栏,100多篇文章,总字数过百万。每月新增订阅用户过百,现在是优惠价9.9元,后面要逐渐恢复原价,早订阅早受益。本专栏精心整理了众多超万字的精华内容,总计达数十万字的嵌入式面试题总结。涵盖从嵌入式基础知识到各大厂面试真题,从驱动开发到操作系统,从硬件到软件等各个方面。

大模型大数据攻城狮的专栏 8403

给View添加一个角标---ViewBadger的使用

开源地址:https://github.com/jgilfelt/android-viewbadger 1、设置文字样式角标 ImageView iv = (ImageView) findViewById(R.id.jiaobiao_iv); BadgeView badgeView = new BadgeView(this, iv); // 将需要设置角标的View 传递进去 b

wang8651971的专栏 4248

3D医学影像开发入门<一>:VS2019+DCMTK3.6.8编译及环境配置

3D医学影像开发入门:VS2019+DCMTK3.6.8编译及环境配置

欧特GO 1308

[View-Textview]文字右上角加上标注

1.前言 需要在原有的功能基础上,实现在文字的右上角加上星号的功能。类似于这种: 2.使用Drawable 通过设置TextView的setCompoundDrawables方法动态设置图标 但是注意在调用setCompoundDrawables之前需要使用setBounds。 setBounds接收四个参数,left、top、right、bottom。其实这个四个参数就是相对原点(0,0)的坐标值。 正常情况下我们这样设置就可以: tv_content.text="hello kotlin" val

cqjerev的博客 1173

SVN使用:使用TortoiseSVN遇到提示请执行“清理”命令的解决方法

作为程序员来说,在团队开发过程中关于代码管理的工具使用并不陌生,比较常用的代码合并管理工具如:Git、SVN等,虽然相关工具的使用并不复杂,但是还是要掌握常用的使用方法,尤其是相关的第三方软件的使用也是极为重要的,而且有时候使用这些三方软件来进行代码管理的时候也会遇到一些问题。本篇博文就来分享一下在SVN使用的时候使用TortoiseSVN遇到提示请执行“清理”命令的解决方法,方便查阅使用。

全沾软贱开发攻城狮 1万+

关于如何在matlab中导入并翻译Hypemesh导出的大型刚度矩阵txt文本

如何将它翻译成matlab可以使用的矩阵变量,并参与运算。 由于这个大型刚度矩阵125万x125万≈1e12。matlab甚至其他计算软件无法保存这个大的一个矩阵文件。而这个刚度矩阵作为稀疏矩阵其中非零元素的数目只有有500多万。采用sparse稀疏矩阵技术是可以保存。 这里简单介绍一下这个Hypemesh导出的大型刚度矩阵txt文本。如图DMIG开头的标识符是换行符,后面两列是表示这条非零元素在刚度矩阵中列数的信息。我们已经将左边字母和符号等批量删除,得到了右边textread函数可以...

wenyusuran的专栏 1795

Android中强大的标记对象-Span

文章目录一、前言二、在应用中使用标记(Span)2.1 标记(Span)的类型2.2 如何使用标记(Span)三、Android Span的类型3.1 影响文本外观的Span 一、前言     在TextView中对显示的文本进行某些格式化的时候,很多人会首相想到使用html文本,对于简单一点的可能会用多个TextView进行拼合。然而这些都有很多的局限性,...

yingaizhu的博客 3182

32、运算放大器的工作原理与应用

本文详细介绍了运算放大器的工作原理与多种应用场景,涵盖开环与闭环放大器的基本概念、理想运算放大器的特性及其‘黄金规则’。文章深入解析了反相放大器、同相放大器、单位增益跟随器与反相器的配置和增益计算,并探讨了电压比较器及窗口比较器的工作机制。同时提供了运算放大器在实际应用中的选型流程、使用注意事项以及常见故障排查方法,帮助读者全面掌握运算放大器的设计与应用要点。

u5v6w7的博客 164

android 文字反转_Android 旋转字体 实现(应用角标,如:新,火等关键字)

在安卓应用中常见应用图标,或者gridview ,listview每个条目上有新,火,等45度旋转的字体,然后一个红色背景,引起用户关注,来一下实现方式:自定义一个textview,绘制字体的时候,旋转角度即可。代码如下:package com.edaixi.view;import android.content.Context;import android.graphics.Canvas;imp...

weixin_29189987的博客 945

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

Android 旋转字体 实现(应用角标,如:新,火等关键字)

在安卓应用中常见应用图标,或者gridview ,listview每个条目上有新,火,等45度旋转的字体,然后一个红色背景,引起用户关注,来一下实现方式:   自定义一个textview,绘制字体的时候,旋转角度即可。代码如下: package com.edaixi.view; import android.content.Context; import android.grap...

weixin_33805557的博客 304

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

自定义的tab切换

这里的例子比较简单,其实就是用布局写一个tab切换,不用系统的控件或是第三方控件,样式可以自己定义,只要喜欢什么都可以添加,效果图如下: (这里设计最后一个要求有小图标,其他的不需要,如果都需要可以把判断小图标是否显示的代码去掉即可) 首先是布局每个Item的布局,一个textview用于显示文字内容,一个用于显示角标,一个条下滑线显示游标,title_tab_item.xml如下:

lan_学习分享 1896

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Android文本居中:从gravity到layout_gravity的实践指南

在Android界面开发中,控件的对齐方式直接影响用户体验,而‘文本居中’更是看似简单却暗藏玄机。很多开发者混淆了内部内容对齐与外部位置对齐的概念,导致gravity和layout_gravity使用不当,出现预览与真机效果不一致的问题。本文从这两个基础属性出发,解析不同布局如LinearLayout、RelativeLayout、ConstraintLayout下的实现原理与标准写法,并给出动态设置代码及常见坑的排查清单。无论是基础UI还是复杂卡片,掌握这些知识都能显著提升布局效率与准确性。

weixin_34258838的博客 435

自定义ActionProvider ToolBar 自定义Menu小红点

今天的几个目标:  1. 自定义ActionProvider  2. Toolbar ActionBar自定义Menu  3. Toolbar ActionBar 右侧Menu添加角标(Toolbar ActionBar Menu添加小红点)  源代码在文章末尾。 效果预览 自定义Menu后不影响原生MD的任何效果。可以通过外部来控制显示的文字和颜色等属性。

雷新伟的博客 424

Android 开源项目分类汇总(android-open-project)完整指南:个性化控件、工具库与开发测试工具全景索引

android-open-project 是一个**分类汇总型的 Android 开源项目索引仓库**,其价值不在于提供可运行的源码,而在于用一套清晰、可检索的分类体系,把海量第三方开源项目按"控件 → 库 → 项目 → 工具 → 人"的维度组织起来。 从 [docs/oss-program-readiness.md](https://link.gitcode.com/i/c52df8b982c

gitblog_00983的博客 440

Android------底部导航栏BottomNavigationBar

Android 的底部导航栏 BottomNavigationBar 由Google官方Material design中增加的。 Android底部导航栏的实现方式特别多,例如TabHost,TabLayout,或者TextView等,都可以实现底部导航栏的效果。 但Google既然推出了还是可以尽量用他来实现底部导航栏这样的功能。 下来看看案例效果图                

切切歆语的博客 1125

jynew《金庸群侠传3D重制版》新手第一次提交 PR 完整指南:从 0 到 1 的四条开源贡献路径

本文面向首次参与 jynew(《金庸群侠传3D重制版》)开源贡献的新手,按"本地启动 → 选择路径 → 产出第一件作品 → 提交前自检 → 授权红线"的完整流程,讲解如何在代码、美术资源、Unity 游戏 MOD 开发、文档测试四个方向完成第一次有效贡献。如果你刚克隆了仓库却不知从哪下手,这份贡献指南可以直接照做。 ## 🚀 本地跑通步骤:克隆仓库与 Unity 版本确认 这一节解决"我连游

gitblog_00380的博客 78

Midscene.js:基于视觉AI的跨平台UI自动化测试与RPA实践指南

UI自动化测试是软件工程中确保应用界面功能与用户体验的关键环节,其核心原理是通过程序模拟用户操作,对图形界面进行交互与验证。传统方案依赖解析UI结构树(如DOM、Accessibility API),存在与代码强耦合、跨平台适配复杂、对游戏或Canvas等非标准界面失效等痛点。随着多模态大模型(VLM)技术的发展,视觉语言模型具备了强大的视觉 grounding 能力,能够将自然语言描述与屏幕图像元素关联,这为自动化测试带来了范式革新。基于此的视觉驱动自动化,通过AI直接“看懂”屏幕并执行操作,实现了技术价

cuemes08808的博客 493

Android TextView 右上角文字角标(TM, ©,® )

两种实现方式: // ============ Use Html String ========== TextView tvUseHtml = findViewById(R.id.tvUseHtml); String htmlString = "This is use HTML string.<sup><small>Sina weibo</small></sup>"; tvUseHtml.setText(.

快乐de胖虎 3502

Android开发,自定义控件实现角标标签

是一个用于在视图的四个角落显示角标的自定义控件。角标可以显示文字,并且可以自定义角标的位置、大小、颜色、文字大小、文字颜色等属性。首先,我们需要定义控件的属性,并在构造函数中进行初始化// View宽度的一半// 角标画笔// 文字画笔// 角标路径// 角标位置,0:右上角、1:右下角、2:左下角、3:左上角// 角标的显示边长// 字体大小// 字体颜色// 角标文字// 角标背景颜色// 文字到斜边的距离init();i++) {

商城app+新闻app+备忘录记事本app视频教程在某站【浩宇软件开发】 961
octopus_yan
博客等级 码龄8年 0粉丝 1原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值