自定义View系列(六)

Android自定义View系列之详解View的绘制流程 一、开场白 开讲之前我们先预设一种自定义ViewGroup的场景:我们知道LinearLayout、FrameLayout、RelativeLayout...都是系统定义实现的布局,我们想要自定义一个FlowLayout流式布局实现我们自己要的效果(自定义不就是按照自己想要的效果实现的一种布局),流式布局目前Google官方还没帮我们提供,但网上有很多自定义的流式布局,也都是开发者们自己继承ViewGroup实现的,今天以自定义ViewGroup实现流式布局FlowLayout为大前提讲解View的绘. 阅读详情

自定义View实战之

自定义实现数字提示功能的ImageView

先直接上代码:

public class NumberHintView extends ImageView {
    private int num = 0;  //要显示的数量
    private float radius;  //圆圈的半径
    private float textSize;  //数字的大小
    private int paddingRight;  //右边内边距
    private int paddingTop;  //上边内边距

    public NumberHintView(Context context) {
        super(context);
    }

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

    public NumberHintView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    /**
     * 设置显示的数量
     * @param num
     */
    public void setNum(int num) {
        this.num = num;
        invalidate();
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        if (num > 0) {
            radius = getWidth() / 5;  //初始化半径
            textSize = num < 10 ? radius + 5 : radius;  //初始化字体大小
            paddingRight = getPaddingRight();  //初始化右边内边距
            paddingTop = getPaddingTop();  //初始化上边内边距
            Paint paint = new Paint();
            paint.setAntiAlias(true);
            paint.setColor(getResources().getColor(R.color.red));
            paint.setStyle(Paint.Style.FILL);
            canvas.drawCircle(getWidth() - radius - paddingRight / 2, radius + paddingTop / 2, radius, paint);
            paint.setColor(getResources().getColor(R.color.baseColor2));
            paint.setTextSize(textSize);
            String text;
            if (num <= 99) {
                text = "" + num;
            } else {
                text = "...";
            }
            canvas.drawText(text,
                    num < 10 ? getWidth() - radius - textSize / 4 - paddingRight/2
                            : getWidth() - radius - textSize / 2 - paddingRight/2,
                    radius + textSize / 3 + paddingTop/2,
                    paint);
        }
    }
}

然后在xml文件中引用即可。

现在,我们来结合代码分析:

第一步:声明所需属性。

    private int num = 0;  //要显示的数量
    private float radius;  //圆圈的半径
    private float textSize;  //数字的大小
    private int paddingRight;  //右边内边距
    private int paddingTop;  //上边内边距

第二步:创建setNum方法,如下:

    /**
     * 设置显示的数量
     * @param num
     */
    public void setNum(int num) {
        this.num = num;
        invalidate();
    }

第三步:在draw方法中实现我们的逻辑。其实主要就是draw方法中的实现了,我们主要就是用到了Canvas类和Paint类,使用到

Canvas类的drawCircle方法、drawText方法,分别画圆和写字。

Android View体系(九)自定义View 学习了以上的文章后,接下来我们来讲讲自定义View,自定义View一直被认为是高手掌握的技能,因为情况太多,想实现的效果又变化多端,但它也要遵循一定的规则,我们要讲的就是这个规则,至于那些变化多端的酷炫的效果就由各位来慢慢发挥了。但是需要注意的是凡事都要有个度,自定义View毕竟不是规范的控件,如果不设计好不考虑性能反而会适得其反,另外适配起来可能也会产生问题,笔者的建议是如果能用系统控件的还是尽量用系统控件。 阅读详情

相关推荐

简单说说Android自定义view学习推荐的方式

这几天比较受关注,挺开心的,嘿嘿。 这里给大家总结一下学习自定义view的一些技巧。 1.首先 去看看鸿洋神的博客 Android 自定义view(1). 鸿洋神的入门教程讲的很详细。再次膜拜。 然后我这里对上面博客补充一些内容,那就是MeasureSpec相关的一些东西,这些东西我在《圆形百分比》这篇博客里提到过。 ----------------------------

旋转 跳跃 然后 团灭 1万+

自定义右上角数字圆点ImageView——NumImageView

我们经常会遇到需要在图标的右上角显示一个小红点或者包含数字的小红点,在网上搜罗了一番,然后决定自己来写一个~~ 效果图如下: 可以是圆点、数字加圆点、数字加椭圆 字体大小颜色和背景大小颜色都可以调整。 源码地址:https://github.com/SkUnK-cc/MyWidgetLib 如何使用? 首先引入依赖 implementation 'com.github....

XG1057415595的博客 1896

Android自定义View系列之理论基础知识

一、坐标系(屏幕坐标系和布局坐标系) 在Android坐标系中,以屏幕左上角作为原点,这个原点向右是X轴的正轴,向下是Y轴正轴,所以开发中调用方法的时候就有了以屏幕上边和左边为参考值,有了参考值你才好定位呀。 除了上面说的Android坐标系,到了View布局的时候有布局坐标系(也称View坐标系,但这种坐标系是相对的,因为Android中的View/ViewGroup是嵌套存在),布局坐标的关系如下图 上图中最里层是一个View(如TextView/Button/ImageView....

sunbinkang的博客 714

一分钟学会自定义右上角显示数字的ImageView

平时在一些app上会看到一些图标的右上角会显示数字,如微信的头像右上角显示信息数量,淘宝的购物车图标右上角显示商品数量。本人最近也在努力学习自定义控件,下面是本人实现的一个简陋的带数字的ImageView。效果如下:代码也很简单:public class NumImageView extends ImageView { //要显示的数量 private int num = 0;

seasonLai的博客 6400

Android自定义View-View的绘制流程

View的绘制基本由measure()、layout()、draw()这三个函数完成 函 数 作 用 相 关 方 法 measure() 测量View的宽高 measure(),setMeasuredDimension(),onMeasure() layout() 计算当前View以及子View的位置 layout(),onLayout(),setFrame() draw() 视图的绘制 draw(),onDraw() 一、Measure

鸿蒙开发知识记录 1884

COD论文笔记VSCode: General Visual Salient and Camouflaged Object Detection with 2D Prompt Learning

VSCode模型通过引入领域特定提示和任务特定提示,结合提示区分损失,成功地在单一模型中处理多个显著目标检测和伪装目标检测任务。这种方法不仅提高了模型的性能,还展示了其对未见任务的泛化能力。作者使用 Visual saliency transformer ICCV 2021 作为baseline model这张图展示了VSCode模型的整体框架,特别强调了2D提示学习方法。

985小菜鸡 1627

高级自定义View系列六;ViewGroup的标准范式

作者:波澜步惊 链接:https://www.jianshu.com/p/d906745f160c 前言 做程序开发,基础很重要。同样是拧螺丝人家拧出来的可以经久不坏,你拧出来的遇到点风浪就开始颤抖,可见基本功的重要性。此系列,专门收录一些看似基础,但是没那么简单的小细节,同时提供权威解决方案。喜欢的同志们点个赞就是对我最大的鼓励!先行谢过! 网上可能有一些其他文章,提供了解决方案,但是...

xiyou9102的博客 227

单总线协议(1—Wire bus)【DS2431】

1—Wire 协议定义了复位脉冲、 应答脉冲、写0、写1、读0和读1时序等几种信号类型。所有的单总线命令序列(初始化ROM 命令功能命令)都是由这些基本的信号类型组成的。识别单总线器件(ROM 命令)单总线器件交换数据(功能命令)初始化单总线器件(初始化)

qq_41883039的博客 1147

重学 Android 自定义 View 系列(六):环形进度条

- 进度条的最大值 --> < attr name = " maxProgress " format = " integer " /> < attr name = " progress " format = " integer " /> < attr name = " circleBackgroundColor " format = " color " />

WriteBug001的博客 2040

PE启动盘结合360杀毒离线版:深度清除顽固病毒实战指南

在系统安全维护领域,离线查杀是一种在独立于宿主操作系统的环境下进行病毒扫描和清除的核心技术。其原理是通过一个预启动环境(如PE)加载杀毒软件,从而绕过可能已被感染或受保护的系统核心,直接访问和扫描磁盘文件。这项技术的核心价值在于能够彻底处理那些在正常系统运行时难以清除的深度隐藏病毒、Rootkit和驱动级木马。典型的应用场景包括应对勒索软件、顽固感染型病毒以及系统启动项被劫持等情况。本文以“PE启动盘”和“360杀毒离线版”这一经典组合为例,详细解析了从工具选型、环境部署到深度查杀策略的全流程,为系统维护人

weixin_29741447的博客 410

android HTTPS未校验服务器证书漏洞修复

上述代码是重写了域名校验的逻辑,每个证书里携带的域名是不可更改的,如果证书是合法的证书签发机构签发的,并且域名是和你要请求的域名对的上的,基本上就能确认你访问就服务器地址就是要访问的服务器地址,这样才是安全的。上述代码就是重新了证书校验的逻辑,信任所有的证书,正确的逻辑是要校验证书是否是可信任的证书签发机构所认证的,如果不校验的话你虽然是用了https加密传输,只要你的客户端用户信任了其他的证书哪怕是非法的证书,一样能够请求通过,而这个证书的服务器就可以解密你的报文,拿到你的隐私信息了。

kyzycyey的专栏 2623

【5年Android从零复盘系列之六】Android自定义View(1):基础详解(图文)

1.基础一:坐标计算 1.1 Android窗口坐标系计算以屏幕左上角为原点, 向右为X轴正向,向下为Y轴正向 1.2 View坐标系 【注意获取的坐标是像素值,不是dp值】 【注意获取的坐标是像素值,不是dp值】 【注意获取的坐标是像素值,不是dp值】 //获取View内部相对的坐标值(距离) getX()、getY() //获取View相对父View的相对坐标值(距离) getLeft()、getTop()、getRight()、getBottom() //获取的是屏幕中的实际坐标值(距离) getR

Cupster 4681

PCL ICP算法实现点云精配准【2026最新版】

PCL1.14.1 及之前版本所实现的迭代最近点ICP算法。博客长期更新,本文最新更新时间为:2026年4月17日。

点云侠的博客 31万+

Android自定义View

概述 Android开发进阶的必经之路 为什么要自定义View 自定义View的基本方法 自定义View的最基本的三个方法分别是: onMeasure()、onLayout()、onDraw(); View在Activity中显示出来,要经历测量、布局和绘制三个步骤,分别对应三个动作:measure、layout和draw。 测量:onMeasure()决定View的大小; 布局:onLayout()决定View在ViewGroup中的位置; 绘制:onDraw()决定绘制这个View。 自定义控

Rayman的博客 1万+

查找【优快云】- 人工客服

【代码】查找【优快云】- 人工客服。

👨‍💻 前端开发者 | 技术分享者 1403

Altium Designer (AD) 设计软件高频面试题及参考答案(3万字长文)

在Altium Designer(AD)中,设计复用是一种关键的策略,它允许设计师在多个项目中重复使用经过验证的设计元素,如原理图符号、PCB布局、元器件封装和设计规则集。在Altium Designer (AD) 中,手动布线和交互式布线是PCB设计中常见的两种布线模式,它们提供了设计师对布线路径的直接控制,特别是在处理复杂或关键信号路径时尤为有用。在Altium Designer (AD) 中进行电路级仿真是一项重要的设计验证步骤,它允许设计师在实际制造之前对电路的行为进行预测和分析。

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

一篇文章带你走近Android自定义view

系列文章目录 一篇文章带你走近Android自定义view 文章目录系列文章目录前言一、为什么要自定义view二、先看看一个超级简单的自定义view(三个构造函数)三、了解手机的坐标系四、使用Canvas画一个折线图(重写onDraw()方法)五、如何自定义属性,且在view中获取到属性的值(小提,在六中会有案例)六、绘制图案以及加入设置简单的动画(案例讲解很详细)七、自定义view的实现分类以及自定义组合控件的案例八、简单测量以及自定义接口实例来控制动画的更新计算表达式(onMeasure,TypeE

计蒙不吃鱼的博客 6026

【系统分析师】高分论文:论软件需求验证方法及应用

本文以某清算平台建设项目为例,探讨了软件需求验证方法的应用。该项目旨在隔离银行与支付公司的直接通信,满足央行监管要求。作为系统分析师,作者通过需求测试和需求评审两种方法确保需求质量。需求测试采用概念测试用例提前发现问题;需求评审通过正式与非正式形式多方确认需求。项目结合邮件评审、专家会议等方式,最终形成完善的需求文档。平台上线后运行良好,验证了需求管理的重要性。该案例表明,科学的需求验证是项目成功的关键保障。

数据知道的博客 8125

Android自定义View的四种方式

一 前言 在Android开发中有很多业务场景,原生的控件是无法满足应用,并且经常也会遇到一个UI在多处重复使用情况,那么就需要通过自定义View的方式来实现这些UI效果。作为一个Android开发工程师自定义View属于一个必备技能。 像前几天正好做了一个上传本地图片的网格UI,点击相机的icon就可以上传选择本地图片,选中图片之后就可以显示的界面上。本来可以使用Android原生GridView,但是这个控件由于嵌套到ScrollView中,所以导致滑动事件冲突,当然网上...

nihaomabmt的专栏 9969

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

Android自定义view原理及自定义View示例

自定义View一共分为6步第一步public SpreadView(Context context) { super(context); } public SpreadView(Context context, @Nullable AttributeSet attrs) { super(context, attrs); } public SpreadView(Context c...

haoxuhong的博客 3532

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Android自定义View系列:布局自定义

1 布局基础 1.1 布局过程的含义 布局过程,就是程序在运行时利用布局文件的代码来计算出实际尺寸的过程。 1.2 布局过程的工作内容 两个阶段:测量阶段和布局阶段。 测量阶段:从上到下递归地调用每个View或者ViewGroup的 measure() 方法,测量它们的尺寸并计算它们的位置 布局阶段:从上到下调用每个View或者ViewGroup的 layout() 方法,把测得的它们的尺...

Vincent的博客 1427

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

android自定义view

在Android开发中有很多业务场景,原生的控件是无法满足应用,并且经常也会遇到一个UI在多处 重复使用情况,那么就需要通过自定义View的方式来实现这些UI效果。作为一个Android开发工程师自定义View属于一个必备技能。自定义View的实现方式有以下几种: 组合控件,继承控件,自绘控件详细可分为:自定义组合控件,继承系统View控件,继承系统ViewGroup,自绘View控件,自绘ViewGroup控件组合控件就是将多个控件组合成一个新的控件,可以重复使用。...

shuo277的博客 1万+

《Android 自定义View的详解》

自定义View:只需要重写onMeasure()和onDraw()自定义ViewGroup:只需要重写onMeasure()和onLayout():用于测量View的大小(宽度和高度)。:确定View在ViewGroup中的位置;:用于绘制View的内容。,在里面写上你的触摸反馈算法,并返回 true(关键是 ACTION_DOWN 事件时返回 true)。如果是会发生触摸冲突的 ViewGroup,还需要重写。

weijiangbc0的博客 1401

自定义view系列aige的博客

自定义view系列1 起步 http://blog.youkuaiyun.com/aigestudio/article/details/41316141#comments 自定义view系列2 Paint 方法介绍大全http://blog.youkuaiyun.com/aigestudio/article/details/41316141#comments LightingColorFilter (int

q178266871的专栏 897

Android自定义View详解,自定义View的实现方法

在Android中,所有的用户界面都是通过View来实现的,它是Android UI框架的核心组件。自定义View是在已有的View的基础上进行扩展和定制,所以在实现自定义View之前,我们首先需要了解View的基本知识。另一种方式是直接创建自定义View类,这样可以更加灵活地控制View的行为和样式。通过自定义View类,可以实现各种独特的用户界面效果和交互方式,比如自定义进度条、翻页效果、拖拽控件等。@Override。

m0_46368082的博客 2217

Android 自定义属性,自定义控件、自定义View以及View的常见Error

Android 自定义属性,自定义控件、自定义View 自定义属性 1 要使用 系统的属性 可以使用所继承的控件的属性 如继承的TextView 或者 View 则相关的属性都可以不用声明直接使用 2 否则 要styleable中定义 &amp;amp;amp;amp;amp;amp;lt;attr name=&amp;amp;amp;amp;amp;quot;android:text&amp;amp;amp;amp;amp;quot; /&amp;a

5ingwings(SiHao)的博客 8410
上一篇: 自定义View系列(五)
下一篇: 自定义View系列(七)
zdj_develop
博客等级 码龄11年 56粉丝 109原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值