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(); //回收TypedArray

        mPaint=new Paint();
        mPaint.setAntiAlias(true); //抗锯齿
        mPaint.setStyle(Paint.Style.FILL); //空心
        mPaint.setTextSize(mTextSize); // 画笔大小
        mPaint.setColor(mTextColor); //颜色
    }

3、onMeasure中测量尺寸

    @Override
    protected 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、绘制

    @Override
    protected 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.CustomTextView
        android: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.mfbz.cn/a/288706.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

假期归来必看!2023年9月份,爆款论文总结,了解最新学术进展!

以下文章来源于AINLPer &#xff0c;作者ShuYini 十一假期结束了&#xff0c;十月基本上算是过了一半了&#xff0c;小伙伴们收收心准备开始学习工作吧。按照惯例&#xff0c;月初继续带到家盘一下上个月(九月份)的热点论文。本月论文主要分为大模型微调、大模型发布、大模型应…

jmeter线程组

特点&#xff1a;模拟用户&#xff0c;支持多用户操作&#xff1b;可以串行也可以并行 分类&#xff1a; setup线程组&#xff1a;初始化 类似于 unittest中的setupclass 普通线程组&#xff1a;字面意思 teardown线程组&#xff1a;环境恢复&#xff0c;后置处理

泰国Cafe Racer卖到日本去了还限量150台?

GPX推出日本限定 GTM250R Cafe Racer&#xff0c;复古小车卖到日本去了&#xff0c;限量150台&#xff0c;不得不说这台小车还是挺有味道的。现代的复古风格摩托车也是永远都不会落伍&#xff0c;即使没有什么品牌背书&#xff0c;喜欢这种车型的人&#xff0c;对于配置动力都不…

Uniapp使用wx.getFuzzyLocation()方法,没有超过日调用次数,报错:“此key每日调用已达到上限”

前言&#xff1a; 最近在进行一个小程序项目开发的时候&#xff0c;使用wx.getFuzzyLocation()方法&#xff0c;没有超过日调用次数&#xff0c;但是却出现了报错&#xff1a;“此key每日调用已达到上限”。 解决方案&#xff1a; 打开腾讯位置服务 - 立足生态&#xff0c;连…

学习Go语言Web框架Gee总结--http.Handler(一)

学习Go语言Web框架Gee总结--http.Handler http-base/go.modhttp-base/main.gohttp-base/gee/gee.gohttp-base/gee/go.mod 网站学习来源&#xff1a;Gee 代码目录结构&#xff1a; http-base/go.mod //指定当前模块的名称为 "example" module example//指定当前模…

Python入门学习篇(十七)——封装、继承、多态

1 封装 1.1 理解 属性和方法书写到类里面的操作即为封装 封装可以理解成私有化属性和私有化方法1.2 示例代码 class Person():p_num 0 # 用于统计数量def __init__(self, name, age, sex, job):# __name为私有化属性self.__name nameself.age ageself.sex sexself.job …

一种可扩展的多属性可控文本生成即插即用方法

《An extensible plug-and-play method for multi-aspect controllable text generation》论文解读 文章的主要工作 &#xff08;1&#xff09;提出了一种可扩展的即插即用方法&#xff0c;PROMPT GATING&#xff0c;用于多方面可控文本生成&#xff0c;它能够通过简单地连接…

引导和服务

一、Linux操作系统引导过程 1、引导过程总览图 2、引导过程的详细步骤 1.开机自检&#xff08;BIOS&#xff09; 服务器主机开机以后&#xff0c;将根据主板BIOS中的设置对CPU、内存、显卡、键盘等设备进行初步检测&#xff0c;检测成功后根据预设的启动顺序移交系统控制权&a…

【MySQL】数据库之主从复制和读写分离

目录 一、什么是读写分离&#xff1f; 二、为甚要读写分离&#xff1f; 三、什么时候需要读写分离&#xff1f; 四、主从复制与读写分离 五、MySQL支持的二进制日志格式 六、主从复制的工作原理 七、MySQL读写分离的原理 八、MySQL读写分离的方式有哪些 九、实验一&am…

Windows 7 虚拟机的安装以及解决安装VMVMware tools问题

1.Windows 7 虚拟机的安装以及解决安装VMVMware tools问题 参考&#xff1a;Windows 7 虚拟机的安装以及解决安装VMVMware tools问题 注意&#xff1a;下载官方补丁&#xff1a;Microsoft Update Catalog在智慧联想浏览器中打不开&#xff0c;要在火狐中才能打开下载。 2.win7如…

Navicat(数据库可视化软件)安装教程以及连接MYSQL

Navicat安装教程以及连接MYSQL Navicat&#xff08;数据库可视化软件&#xff09;安装流程安装MySQLnavicat连接mysql数据库 Navicat&#xff08;数据库可视化软件&#xff09; Navicat 是一款专门为 MySQL 设计的可视化数据库 GUI 管理工具&#xff0c;我们可以在自己的计算机…

【HarmonyOS开发】共享包HAR和HSP的创建和使用以及三方库的发布

OpenHarmony提供了两种共享包&#xff0c;HAR&#xff08;Harmony Archive&#xff09;静态共享包&#xff0c;和HSP&#xff08;Harmony Shared Package&#xff09;动态共享包。 HAR与HSP都是为了实现代码和资源的共享&#xff0c;都可以包含代码、C库、资源和配置文件&…

Windows可以ping通ubuntu,但ubuntu无法ping通windows

使用了NAT网卡和桥接网卡&#xff0c;电脑连了WiFi&#xff0c;桥接网卡桥接到WLAN上&#xff0c;Windows可以ping通Ubuntu但反过来不行&#xff01; 1.可能是防火墙的问题&#xff0c;按照如下设置&#xff0c;无果 考虑是不是使用了两个网卡冲突了&#xff0c;取消NAT的链接 …

【Mybatis】Mybatis如何防止sql注入

&#x1f34e;个人博客&#xff1a;个人主页 &#x1f3c6;个人专栏&#xff1a; Mybatis ⛳️ 功不唐捐&#xff0c;玉汝于成 目录 前言 正文 1、使用参数化的 SQL 语句&#xff1a; 2、使用动态 SQL 标签&#xff1a; 3、禁止拼接 SQL&#xff1a; 4、限制参数类…

SkyWalking 快速入门

SkyWalking 是一个基于 Java 开发的分布式系统的应用程序性能监视工具&#xff0c;专为微服务、云原生架构和基于容器&#xff08;Docker、K8s、Mesos&#xff09;架构而设计。 一、SkyWalking 简介 SkyWalking 是观察性分析平台和应用性能管理系统。 提供分布式追踪、服务网格…

SpringBoot的基础配置

问题导入 入门案例中没有引入spring-webmvc等依赖包&#xff0c;没有配置Tomcat服务器&#xff0c;为什么能正常启动&#xff1f;我们没有配置端口号&#xff0c;为什么端口是8080&#xff1f; 起步依赖 starter SpringBoot中常见项目名称&#xff0c;定义了当前项目使用的所…

AUTOSAR软件架构描述文档,AUTOSAR_EXP_LayeredSoftwareArchitecture

AUTOSAR软件架构描述文档&#xff0c;我们常见的经典的CP架构及OS双核等架构描述 下载链接&#xff1a;https://www.autosar.org/fileadmin/standards/R21-11/CP/AUTOSAR_EXP_LayeredSoftwareArchitecture.pdf

71.乐理基础-打拍子-三连音的变体

上一个内容&#xff1a;70.乐理基础-打拍子-三连音-CSDN博客 首先常见的三连音如下图的样子&#xff1a; 三连音的变体遇到的次数并不会很多&#xff0c;可以不用看不用懂 三连音的变体&#xff1a; 1.三连音节奏型依然有可能藏有休止符&#xff0c;如下图 2.在这之前的三连音…

Java LinkedList解密

一、LinkedList最底层的原理 LinkedList其实底层是链表&#xff1a; 当初始化的时候&#xff0c;会将链表这个节点的值、prev指针和next指针初始化。 二、LinkedList初始化 无参构造并没有做什么。有参构造会先调用无参构造&#xff0c;然后调用addAll方法将链表的节点都初始化…

基于花授粉算法优化的Elman神经网络数据预测 - 附代码

基于花授粉算法优化的Elman神经网络数据预测 - 附代码 文章目录 基于花授粉算法优化的Elman神经网络数据预测 - 附代码1.Elman 神经网络结构2.Elman 神经用络学习过程3.电力负荷预测概述3.1 模型建立 4.基于花授粉优化的Elman网络5.测试结果6.参考文献7.Matlab代码 摘要&#x…