android——自定义TextView

效果展示:

在这里插入图片描述

代码解析:

1、首先设置自定义属性(res/values下新建一个attrs.xml文件)

<?xml version="1.0" encoding="utf-8"?>
<resources><!--    name 自定义view的名字  CustomTextView--><declare-styleable name="CustomTextView"><!--        name 属性名称  format:格式string:文字   color:颜色dimension: 宽高,字体大小integer:数字  reference:资源(drawable)自定义属性不能和系统有的属性重名(如:textview有text属性,自定义的name不能使用name)--><attr name="iText" format="string" /><attr name="iTextColor" format="color" /><attr name="iTextSize" format="dimension" /><attr name="iMaxLength" format="integer" />
<!--        自定义view都是继承自view,背景由view管理,所以iBackground可以去掉-->
<!--        <attr name="iBackground" format="reference|color" />--><!--枚举--><attr name="iTnputType"><enum name="number" value="1" /><enum name="text" value="2" /><enum name="password" value="3" /></attr></declare-styleable></resources>

2、需要创建一个类继承自view ,重写构造方法

public class CustomTextView extends View {private String mText;
//    字体默认大小(像素)private int mTextSize=18;  
//    默认颜色private int mTextColor= Color.BLUE;//   画笔private Paint mPaint;//    在new的时候调用public CustomTextView(Context context) {this(context,null);}//    在布局Layout中使用public CustomTextView(Context context, @Nullable AttributeSet attrs) {this(context, attrs,0);}//    在style中使用
//    @style="style/default"public CustomTextView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);TypedArray array = context.obtainStyledAttributes(attrs, R.styleable.CustomTextView);mText=array.getString(R.styleable.CustomTextView_iText);mTextColor=array.getColor(R.styleable.CustomTextView_iTextColor,mTextColor);mTextSize=array.getDimensionPixelSize(R.styleable.CustomTextView_iTextSize,sp2px(mTextSize));array.recycle(); //回收TypedArraymPaint=new Paint();mPaint.setAntiAlias(true); //抗锯齿mPaint.setStyle(Paint.Style.FILL); //空心mPaint.setTextSize(mTextSize); // 画笔大小mPaint.setColor(mTextColor); //颜色}

3、onMeasure中测量尺寸

    @Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {super.onMeasure(widthMeasureSpec, heightMeasureSpec);//        获取宽高的模式int widthMode=MeasureSpec.getMode(widthMeasureSpec);int heightMode=MeasureSpec.getMode(heightMeasureSpec);//    1、 获取宽高的值 EXACTLY模式不需要计算直接测量,给多少就是多少int widthSize=MeasureSpec.getSize(widthMeasureSpec);int heightSize=MeasureSpec.getSize(heightMeasureSpec);//     2、At_MOST模式是wrap_content 需要计算if (widthMode==MeasureSpec.AT_MOST){
//           计算的宽度与字体的长度和字体的大小有关  用画笔来测量Rect bounds=new Rect();
//           获取文本的Rect(矩形)mPaint.getTextBounds(mText,0,mText.length(),bounds);// getPaddingStart()+getPaddingEnd()不添加这个在页面布局中添加padding值是无效的widthSize=bounds.width()+getPaddingStart()+getPaddingEnd();}if (heightMode==MeasureSpec.AT_MOST){
//           计算的宽度与字体的长度和字体的大小有关  用画笔来测量Rect bounds=new Rect();
//           获取文本的Rect(矩形)mPaint.getTextBounds(mText,0,mText.length(),bounds);heightSize=bounds.height()+getPaddingTop()+getPaddingBottom();}
//        设置控件的宽高setMeasuredDimension(widthSize,heightSize);}

4、绘制

    @Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);
        画弧
//        canvas.drawArc();
        画圆
//        canvas.drawCircle();
//        画文字  text,x,y,paint
//        x: 开始的位置
//        y:基线  baseLine
//        dy:代表高度的一半到baseLine的距离Paint.FontMetricsInt fontMetricsInt = mPaint.getFontMetricsInt();
//        top是一个负值,bottom是一个正值(可以打印看正负值)
//        bottom:是baseLine到文字底部的距离
//        top是baseLin到文字顶部的距离int dy=(fontMetricsInt.bottom-fontMetricsInt.top)/2-fontMetricsInt.bottom;int baseLine=getHeight()/2+dy;int x=getPaddingStart();canvas.drawText(mText,x,baseLine,mPaint);
        画线
//        canvas.drawLine();}

5、布局文件中使用
(要在父布局添加 xmlns:myApp=“http://schemas.android.com/apk/res-auto” )

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:myApp="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".MainActivity"><com.example.myviewstudy.CustomTextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"myApp:iText="名字abcdefgh"myApp:iTextColor="#FF0000"myApp:iTextSize="20sp"android:padding="10dp"android:background="@color/teal_700"app:layout_constraintBottom_toBottomOf="parent"app:layout_constraintEnd_toEndOf="parent"app:layout_constraintStart_toStartOf="parent"app:layout_constraintTop_toTopOf="parent" /></androidx.constraintlayout.widget.ConstraintLayout>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/594525.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spring Bean的生命周期(钩子函数)

借鉴&#xff1a;https://www.cnblogs.com/liweimingbk/p/17843970.html https://blog.csdn.net/lxz352907839/article/details/128634404 一、Spring Bean生命周期 如果Spring配置文件中所定义的Bean类实现了ApplicationContextAware 接口&#xff0c;那么在加载Spring配置文…

php composer安装

引言 Composer 是 PHP 中的依赖管理工具。它允许您声明您的项目所依赖的库&#xff0c;并且它将为您管理&#xff08;安装/更新&#xff09;它们。 官网链接&#xff1a;Introduction - Composer 安装 要在当前目录中快速安装 Composer&#xff0c;请在终端中运行以下脚本。…

Flood Fill算法总结

算法思想 从一个起点开始&#xff0c;每一次随机选择一个新加进来的格子&#xff0c;看一下它周围能否扩展新的格子。如果能扩展&#xff0c;那么就扩展进来&#xff0c;直到不能扩展新的格子为止。当然需要判重&#xff0c;同样一个格子只能覆盖一次&#xff0c;这样能够保证时…

DataLoader与Dataset

一、人民币二分类 二、DataLoader 与 Dataset DataLoader torch.utils.data.DataLoader 功能&#xff1a;构建可迭代的数据装载器 &#xff08;只标注了较为重要的&#xff09; • dataset: Dataset类&#xff0c;决定数据从哪读取及如何读取 • batchsize : 批大小 • num_…

数据库之事务

1.事务的定义 事务就是一组数据库操作序列&#xff08;包含一个或多个SQL操作命令&#xff09;&#xff0c;事务会把所有操作看作是一个不可分割的整体向数据库系统提交或者撤销操作&#xff0c;所有操作要么都执行&#xff0c;要么都不执行。 2. 事务的ACID特性 原子性 一…

机器学习异常值处理 逻辑汇总一

一 清除数据中恒定不变值 如果某个数据长时间不变&#xff0c;默认异常&#xff0c;清除掉该部分数据&#xff1a; # 使用 shift 和 cumsum 来创建一个分组键&#xff0c;每次值改变都会增加组号 g (df[沉淀池3号进水流量] ! df[沉淀池3号进水流量].shift()).cumsum()# 使用…

案例253:基于微信小程序的懂球短视频管理系统

文末获取源码 开发语言&#xff1a;Java 框架&#xff1a;SpringBoot JDK版本&#xff1a;JDK1.8 数据库&#xff1a;mysql 5.7 开发软件&#xff1a;eclipse/myeclipse/idea Maven包&#xff1a;Maven3.5.4 小程序框架&#xff1a;uniapp 小程序开发软件&#xff1a;HBuilder …

GC8549 大电流,双通道 12V,短地短电源保护等功能 可替代ONSEMI的LV8548/LV8549

GC8549 可以工作在 3.8~12V 的电源电压上&#xff0c;每 通道能提供高达 1.5A 持续输出电流或者 2.5A 峰值 电流&#xff0c;睡眠模式下功耗小于 1uA。具有 PWM&#xff08;IN/EN&#xff09;输入接口,与行业标 准器件兼容&#xff0c;并具有过温保护&#xff0c;欠压保护&…

【计算机网络】网络层

文章目录 网络层提供的服务虚电路数据报服务虚电路与数据报服务比较 虚拟互连网络IP地址IP层次结构IP地址分类特殊地址子网掩码 子网划分变长子网划分超网合并网络规律 IP地址与MAC地址ARP协议ARP欺骗的应用 数据包数据包首部 路由ICMP协议RIP动态路由协议OSPF协议BGP协议 VPNN…

进程等待(wait和wait函数)【Linux】

进程等待 wait和wait函数【Linux】 进程等待的概念进程等待的必要性进程等待的方法wait函数waitpid函数 非阻塞等待和阻塞等待的对比阻塞等待&#xff1a;非阻塞等待 进程等待的概念 进程等待就是通过 wait/waitpid的方式&#xff0c;让父进程对子进程进行等待子进程退出并且将…

【信号处理:小波包转换(WPT)/小波包分解(WPD) 】

【信号处理&#xff1a;小波包转换&#xff08;WPT&#xff09;/小波包分解&#xff08;WPD&#xff09; 】 小波包变换简介WPT/WPD的基础知识WPT/WPD的主要特点The Wavelet Packet Transform 小波包变换前向小波数据包变换最佳基础和成本函数数学中波纹的最佳基础其他成本函数…

MySQL基础入门:数据库操作全攻略

欢迎进入MySQL的世界&#xff01;MySQL是最受欢迎的关系型数据库管理系统之一&#xff0c;在Web开发中广泛使用。无论你是学生、软件开发者还是数据分析师&#xff0c;掌握MySQL的基本操作对你探索数据世界将大有裨益。在本教程中&#xff0c;我们将从MySQL的安装开始&#xff…

酷狗高级Java面试真题

今年IT寒冬&#xff0c;大厂都裁员或者准备裁员&#xff0c;作为开猿节流主要目标之一&#xff0c;我们更应该时刻保持竞争力。为了抱团取暖&#xff0c;林老师开通了《知识星球》&#xff0c;并邀请我阿里、快手、腾讯等的朋友加入&#xff0c;分享八股文、项目经验、管理经验…

uView LoadingPage 加载页

平台差异说明 App&#xff08;vue&#xff09;App&#xff08;nvue&#xff09;H5小程序√√√√ #基本使用 <template><view><u-loading-page></u-loading-page></view> </template>copy #显示或隐藏 loading可以指定是否显示加载页…

洛谷普及组P1044栈,题目讲解(无数论基础,纯打表找规律)

[NOIP2003 普及组] 栈 - 洛谷 我先写了个打表的代码&#xff0c;写了一个小时&#xff0c;o(╥﹏╥)o只能说我真不擅长dfs。 int n; std::unordered_map<std::string, int>map; void dfs(std::vector<int>&a, int step,std::stack<int>p, std::string …

Nginx中include配置文件,方便管理多域名

目录 1.加上include配置 2.配置 server 记录 一个网站对应一个server 记录&#xff0c;这样管理起来相对麻烦。我们可以将每个网站记录单独拆分出来即可&#xff0c;这就需要用到 nginx 中的 conf.d 文件 1.加上include配置 先进入到 nginx.conf 文件&#xff0c;然后将所有…

CentOS7搭建Elasticsearch与Kibana服务

1.部署单点es 1.1.创建网络 因为我们还需要部署kibana容器&#xff0c;因此需要让es和kibana容器互联。这里先创建一个网络&#xff1a; docker network create es-net 1.2拉取elasticsearch镜像 docker pull elasticsearch:7.11.1 1.3.运行 运行docker命令&#xff0c;部…

阿里云ESSD Entry系统盘性能如何?

阿里云服务器ESSD Entry系统盘性能怎么样&#xff1f;性能很不错&#xff0c;但不如SSD云盘和ESSD云盘&#xff0c;ESSD Entry云盘的IOPS、吞吐量不如SSD云盘和ESSD云盘。ESSD Entry系统盘是具备企业级特性及数据保护能力&#xff0c;建议在开发与测试业务和系统盘等场景中使用…

c# wpf 的触发器,触发器Trigger种类,每个触发器的使用说明

触发器是一种强大的声明性机制&#xff0c;用于根据指定条件更改控件的外观或行为。触发器主要分为以下几种类型&#xff1a; Property Trigger 说明&#xff1a;当绑定到控件某个依赖属性的值发生改变时&#xff0c;Property Trigger会执行预定义的一组设置。例如&#xff0c;…

【ECMAScript】WebSocket模拟HTTP功能的实践:Promise+WebSocket+EventEmitter+Queue

1. 前言 本篇将结合Promise、WebSocket、EventEmitter和Queue&#xff0c;做一次实践&#xff1a;用WebSocket来模拟HTTP的功能。先不用关心它的用处&#xff0c;就当一次对知识点的整合吧。 2. MockHTTP 方法说明request(params, callback?) 功能&#xff1a;发起请求&…