前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Android自定义控件之数字显示

Android自定义控件之数字显示

作者头像
张风捷特烈
发布于 2018-12-24 03:30:28
发布于 2018-12-24 03:30:28
1.3K00
代码可运行
举报
运行总次数:0
代码可运行
需求

1.数字为1位,显示圆形 2.数字为2位图形拉伸,左右各半圆 3.数字大于999,显示999+ 4.自定义文字颜色,自定义背景色

效果(好吧,看起来挺low的)

本身并不复杂,不过作为一道计算题还是很不错的

效果.png


1.自定义属性
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <!--计数TextView-->
    <declare-styleable name="CountTextView">
        <attr name="z_ctv_font_size" format="reference|dimension"/>
        <attr name="z_ctv_num" format="integer"/>
        <attr name="z_bg_color" format="reference|color"/>
        <attr name="z_txt_color" format="reference|color"/>
    </declare-styleable>
</resources>
2.分析

使用圆角矩形来画背景,Paint.getTextBounds来获取文字边界矩形 1).先绘制文字,将文字左顶点与屏幕左顶点重合 2).通过计算,画出一个数时的圆角矩形两个顶点(如下图) 3).通过数字位数来控制圆角矩形两顶点的X 4).通过画布平移让圆角矩形左顶点处于画布顶点 5).计算圆角矩形的宽高,设置View大小

IMG20181203130904.jpg

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class CountTextView extends View {
    private int mCtvFontSize = sp(100);
    private int mCtvNum = 5;
    private int mCtvBgColor = 0xffBFF3F7;
    private int mCtvTxtColor = Color.WHITE;
    private Paint mPaint;//主画笔
    private Paint mTxtPaint;
    private Rect mRect;
    private String mStr;
    private int mOffSet;

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

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

    public CountTextView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.CountTextView);
        mCtvFontSize = (int) a.getDimension(R.styleable.CountTextView_z_ctv_font_size, mCtvFontSize);
        mCtvNum = a.getInteger(R.styleable.CountTextView_z_ctv_num, mCtvNum);
        mCtvTxtColor = a.getColor(R.styleable.CountTextView_z_txt_color, mCtvTxtColor);
        mCtvBgColor = a.getColor(R.styleable.CountTextView_z_bg_color, mCtvBgColor);
        a.recycle();
        init();
    }

    private void init() {
        //初始化主画笔
        mTxtPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
        mTxtPaint.setColor(mCtvTxtColor);
        mTxtPaint.setTextSize(mCtvFontSize);

        mRect = new Rect();
        mStr = mCtvNum + "";
        if (mCtvNum >= 1000) {
            mStr = "999+";
        }
        mTxtPaint.getTextBounds(mStr, 0, mStr.length(), mRect);
        int AChartLen = mRect.width() / mStr.length();
        mOffSet = (int) ((mStr.length() - 1) * AChartLen * 0.7f);

        mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
        mPaint.setColor(mCtvBgColor);
        mPaint.setStrokeWidth(mRect.height());
        mPaint.setStrokeCap(Paint.Cap.ROUND);
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        //文字左侧距圆心的偏移
        int offsetX = mRect.height() - mRect.width() / 2 + mOffSet;
        setMeasuredDimension(2 * offsetX + mRect.width(), 2 * mRect.height());
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        canvas.save();
        int offsetX = mRect.height() - mRect.width() / 2 + mOffSet;
        canvas.translate(offsetX, mRect.height() / 2);
        //圆角矩形左上点
        int topX = mRect.width() / 2 - mRect.height();
        int topY = -mRect.height() / 2;
        //圆角矩形右下点
        int bottomX = mRect.height() + mRect.width() / 2;
        int bottomY = mRect.height() / 2 + mRect.height();
        
        canvas.drawRoundRect(topX - mOffSet, topY, bottomX + mOffSet, bottomY,
                mRect.height(), mRect.height(), mPaint);

        canvas.drawText(mStr, 0, mRect.height(), mTxtPaint);
        canvas.restore();
    }

    private int sp(float sp) {
        return (int) TypedValue.applyDimension(
                TypedValue.COMPLEX_UNIT_SP, sp, getResources().getDisplayMetrics());
    }
}
3.使用
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<com.toly1994.c.view.CountTextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginStart="8dp"
    android:layout_marginTop="8dp"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toTopOf="parent"
    app:z_ctv_font_size="40sp"
    app:z_ctv_num="30"/>
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018.12.03 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
​“ABC”设计模型:打造创新爆款产品
随着5G网络和移动设备的大规模普及,视频交友、视频购物、视频会议等以视频为媒介的创新商业化模式快速涌现。同时,硬件与通信技术的变革改变着人们的沟通方式。随着技术的演进和用户迭代,以视频为媒介的社交也迎来了新的发展机遇。
晓吾
2022/03/30
6060
​“ABC”设计模型:打造创新爆款产品
100种分析思维模型(1)
最近,我在读《穷查理宝典》这本书,其中提到查理·芒格应用大约 100 种多元思维模型,他孜孜不倦地对投资问题进行充分的准备、广泛的研究和科学的探讨,借用并完美地糅合了许多来自各个传统学科的分析工具、方法和公式,这些学科包括历史学、心理学、生理学、数学、工程学、生物学、物理学、化学、统计学、经济学等。
数据森麟
2021/03/09
6050
100种分析思维模型(1)
读书笔记——上瘾:让用户养成使用习惯的四大产品逻辑
福格行为模型(BJ Foog’s Behaviour Model)来源于福格和美国说服技术实验室的研究,它是一种有效探寻行为原因的模型。
mingjie
2023/02/10
3720
读书笔记——上瘾:让用户养成使用习惯的四大产品逻辑
QQ自习室 | 年轻人学习方式的设计探索
QQ-自习室是一款以学习为特色,基于手机QQ平台的陪伴型多人直播产品,简单来说就是一个线上的自习室。作为疫情期间诞生的创新小产品,它在资源有限的前提下也拿到了还算不错的成绩。作为独立负责它的交互实习生,我想透过一个学生的视角来给大家分享这一路我在线上自习场景探索过程中的发现与思考,希望能给正在阅读的你带来一定的启发。 PART 01 最初的想法 2019年被很多媒体称为付费自习室元年,消费者们愿意付费来换取一个好的学习环境。同时,虽然有一些不解的声音,线上学习直播在一些学生中成为新风潮。 作为QQ的主
腾讯ISUX
2020/10/28
2.2K0
如何通过“心智塑造”轻松赢得用户
创新产品的早期都会面临一个重要的问题,那就是当用户尝试使用产品时,如何向用户快速准确的传递产品的价值。进而使用户理解产品,并产生认可和信任。本文结合案例,介绍如何通过心智塑造来轻松赢得用户。
晓吾
2022/01/21
9110
如何通过“心智塑造”轻松赢得用户
大厂必备的40个方法论
方法论是一种以解决问题为目标的理论体系或系统,通常涉及对问题阶段、任务、工具、方法技巧的论述。方法论会对一系列具体的方法进行分析研究、系统总结并最终提出较为一般性的原则。
dongfanger
2022/06/30
2.8K0
大厂必备的40个方法论
《上瘾:让用户养成使用习惯的四大产品逻辑》读书笔记
“ 产品的销售经历了三个阶段,第一阶段比拼产品的产能,通过发明流水线、提高生产率,代表公司福特;第二阶段比拼渠道和营销,代表公司宝洁;第三阶段比拼产品如何占据消费者的心智,代表公司苹果。在这个过程中为什么有些产品能抓住我们的注意力,而其他产品不能?产品如何脱颖而出,脱颖而出的产品又如何持续走红而不销声匿迹?是什么让我们出于习惯而建立与产品的联系?是否有一种潜在的模式能让技术将我们吸引,欲罢不能?”
产品言语
2022/06/02
4380
《上瘾:让用户养成使用习惯的四大产品逻辑》读书笔记
“留量运营”的本质是用户运营,如何搭建用户“留量”体系?
随着流量红利的消失殆尽,新用户增长速率变缓,企业处于激烈的存量争夺阶段,这也使得精准定位的互联网流量费用水涨船高,获客成本居高不下,且难以量化ROI。
盈鱼MA
2020/12/25
1K0
“留量运营”的本质是用户运营,如何搭建用户“留量”体系?
成长的模式:如何从毕业生到技术专家?
过去的一个月里,在帮助其他部门进行毕业生培训。从名称上说是培训,但是实际上则是训战结合。不想一下子给太多,这篇文章会给的建议是: 寻找持续成长的动机 塑造整洁的编码习惯 建立定位问题的方式 学习既有的模式 频繁性自我总结 只凭这五点来说,与《福格行为模型》所定义的三要素也是颇为相似的: 要素1 动机(Motivation):找到实现愿望的黄金行为 要素2 能力:让行为简单到随时顺便都能做 要素3 提示:善用锚点时刻让行为立刻发生 如果再简化来说,也可以采用和我一样的模式,通过基本简单的行为:每天写代码,每周
Phodal
2022/08/25
1.1K0
想帮助用户做决定?你的APP可以这样设计!
原文地址:Design your app for decision-making 原文作者:Jeni 译文出自:掘金翻译计划 本文永久链接:github.com/xitu/gold-m… 译者:PTH
Android 开发者
2018/05/31
8110
关于用户成长体系,一份不能错过的笔记
产品经理对于有关积分、成长值、等级等一整套的系统,有人叫用户成长体系,有人叫用户激励系统。笔者的理解是,他们都是一样的,不用纠结于字眼,关键还在于内涵的研究。
竹清
2018/08/31
1.8K0
关于用户成长体系,一份不能错过的笔记
交互系统化研究(二)玩家动机
| 导语:本文为交互系统化研究第二篇,将从动机的分类及其在界面中的应用进行分析,并介绍不同动机间的联系与转化方式
Maxssimo
2023/01/14
4900
交互系统化研究(二)玩家动机
从零开始做社区的破局之路
| 导语 “做社区的产品经理,是用文字发现真相的人。” 有人问我,做安全社区不会怨声载道、负能量拉满吗?我想我们做社区,要做的不是区分谁是天使谁是魔鬼,而是想办法让每个人人性中的魔鬼沉睡,天使起舞。 本文作者:lexitan,腾讯CSIG产品运营 腾讯手机管家是安全类工具产品第一个做社区,并有完整的产品体验和运作体系,也是工具产品里较早地进行社区探索,希望通过总结和输出,把经验分享给大家。 开始之前,希望大家有预期,社区的打造是踏实的攀登,而不是像跳伞的自由落体,充分的准备工作是成功攀登的保证。 做社区
腾讯大讲堂
2022/01/06
5140
增长黑客5:激活
好不容易吸引来潜在用户后,接下来如何让他们真正使用你的产品?事实上,98%的网站访问量都未能引发激活,而大部分移动App都在三天内损失近80%的用户。
霖酱
2019/01/03
8030
如何用游戏化思维构建 "好玩" 平台
腾讯ISUX isux.tencent.com 社交用户体验设计 QQ小程序游戏中心主打丰富多样化的小游戏,作为设计师如何通过视觉表现构建一个更好玩的平台,向用户传达“好玩”的感受。 FOREWORD 从游戏中学习什么是 "好玩" 为什么在游戏中我们明知得不到实质的回报却愿意投入大量时间和金钱?好玩的游戏不仅用华丽的外表吸引我们,更因有趣的灵魂带给人深入探索的动力。我们试着挖掘游戏中那些"好玩"的因素,将其运用到小程序游戏中心的设计中。  CONTENT 构建一个好玩的世界 一个完整的世界
腾讯ISUX
2020/01/14
6580
如何用游戏化思维构建 "好玩" 平台
《上瘾:让用户养成使用习惯的四大产品逻辑》
《上瘾》这本书总结了产品让用户上瘾的四大逻辑:触发、行动、多变的酬赏和投入。如果你想互联网创业,或者想了解互联网爆品背后的秘密,这四大产品逻辑会给你很多启发。
Vaccae
2019/07/25
8390
用户凭啥要用小程序?我用 FOGG 模型分析了一下
因为「优化」注定层出不穷,也导致其注定昙花一现。那么小程序是「app」形态的「优化」,还是一个和「app」完全不同的形态,是一种「颠覆」呢?
知晓君
2018/08/01
4060
用户凭啥要用小程序?我用 FOGG 模型分析了一下
「经验」我对用户增长的理解『新用户篇』
用户生命周期,可以划分为六个阶段:潜客期、新用户期、成长期、成熟期、衰退期、流失期。在之前的文章中,小火龙和大家分享了「潜客期」数据分析涉及的内容,感兴趣的同学可以戳蓝字部分。本篇将写一写日常工作中「新用户期」涉及的数据支持及落地。
小火龙说数据
2022/06/30
5460
「经验」我对用户增长的理解『新用户篇』
《组织行为学》--工作动机及个人感悟--工程师真实价值
我们研究个人工作动机的目的,是能够更好地把握不同情境下的心态及情绪。同时,组织行为学本身也是能够帮助管理者对不同工作动机的成员有着激励的作用。但是《组织行为学》中,只是从工作效能和提高员工工作积极性的角度去分析及激发不同需求个体。
用户3003813
2019/03/04
3.2K0
《组织行为学》--工作动机及个人感悟--工程师真实价值
如何通过行为设计实现持续改变
看完罗胖的2019跨年演讲,屏幕前的你是不是也立下了#2020的第一个flag#,然后放进时间胶囊,期待2021年打开时间胶囊,梦想实现!哈哈!然而根据统计,在年初立下新年flag的人中,只有8%实现了这些flag。这个数字可真不高,这8%的人群算是flag实践者中的精英了。我们是否能进入这8%的实践者呢?本文将带你了解行为设计公式:B=MAT,帮助大家通过行为设计完成持久改变,实现新年flag。
黄成甲
2020/02/18
7540
如何通过行为设计实现持续改变
推荐阅读
相关推荐
​“ABC”设计模型:打造创新爆款产品
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验