Android 自定义控件——自定义属性

news/2023/12/10 16:15:03

本文介绍在 Android 当中自定义控件使用自定义属性

本文以下图为例进行讲解   如图:

一个圆,我们自定义一个View ,以画一个圆为例,以圆的半径、颜色、透明值 作为自定义属性来进行讲解


先定义自定义的View,继承View,重载其三个构造方法   Circle.java 

一般我们的自定义属性也是在重载的构造方法中进行初始化,初始化之前我们需要事先定义好属性文件,也可以一边写控件,一边分析需求来添加属性,根据上面提到的需求,我们定义三个属性,半径、颜色、透明度

在values文件夹下新建 attrs.xml 定义三个属性

<span style="font-family:Microsoft YaHei;font-size:12px;"><?xml version="1.0" encoding="utf-8"?>
<resources><declare-styleable name="Circle"><attr name="radius" format="dimension" /><attr name="color" format="color" /><attr name="alpha" format="integer" /></declare-styleable></resources></span>

declare-styleabke 是专门用来定义属性集合的标签,attr  是具体的属性  attr 中的name是属性的名字,必须是独一无二的,format是属性的类型

常用的属性类型有:

reference       资源类型,通常是@开头,例如@+id/xxxx,@id/xxxxx
string             字符串类型,通常是文字信息
dimension      浮点类型,通常是尺寸度量,单位有很多px,dp,sp,dip等
color              颜色类型,通常是颜色16进制代码,支持ARGB。
boolean         布尔类型,true和false
enum             枚举类型,通常是代表这个属性提供了几种值来进行选择,并且只能选择这几种中的一个
flag                与enum基本没有区别。
integer           整数类型,通常是整数


定义好属性后,我们在 Cricle 的构造方法中初始化属性,初始化属性用TypeArray  根据具体的类型来调用具体的get方法,get到的值就是我们自定义属性设置的值,得不到返回一个默认值,如果不加自定义属性的话,这个圆也是完全可以画出来的,但是你觉得用属性设置参数方便和用java代码来设置参数哪种更加方便,当让是属性的方式了,又快又方便,有省事,有使得java更具有扩展性。

 

public class Circle extends View {private Paint mPaint = new Paint();private int mColor;private int mAlpha;private float mRadius;public Circle(Context context) {super(context);}public Circle(Context context, AttributeSet attrs) {super(context, attrs);init(attrs);}public Circle(Context context, AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);init(attrs);}public void init(AttributeSet set) {TypedArray mTypedArray = getContext().obtainStyledAttributes(set,R.styleable.Circle);mColor = mTypedArray.getColor(R.styleable.Circle_color, Color.BLACK);mRadius = mTypedArray.getDimension(R.styleable.Circle_radius, 50);mAlpha = mTypedArray.getInteger(R.styleable.Circle_alpha, 0);mTypedArray.recycle();//回收,回收之后属性集attay不可用mPaint.setDither(true);mPaint.setAntiAlias(true);mPaint.setStrokeWidth(10);mPaint.setColor(Color.RED);mPaint.setAlpha(mAlpha);}@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);canvas.drawCircle(600, 600, mRadius, mPaint);canvas.save();}
}

 

 

java写好之后就要在xml布局文件中给这个圆设置属性了

设置的属性可见 

circle:alpha="255"
circle:radius="@dimen/circle_radius1"
circle:color="@color/circle_red"

circle 和 Cricle类没有关系,这是在xml文件中自己起名字,找到这一行

xmlns:circle="http://schemas.android.com/apk/res/com.example.test"

circle 是自己定义的名字,/apk/res/ 后面换成自已的自定义类的包名,声明完这句之后就可以在自定义控件中加属性了,格式是   自己名字:属性名="参数"

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"xmlns:circle="http://schemas.android.com/apk/res/com.example.test"android:layout_width="match_parent"android:layout_height="match_parent" ><com.example.test.Circleandroid:id="@+id/circle_1"android:layout_width="match_parent"android:layout_height="match_parent"circle:alpha="255"circle:radius="@dimen/circle_radius1"circle:color="@color/circle_red" /></RelativeLayout>


写好之后运行,图就画出来了,改变参数后重新运行观察效果

如果你还是想在 java 当中改变控件属性,这也都不是问题, 给相应的属性封装 set 方法,设置参数之后调用  invalidate()  重绘界面就ok了






 

转载于:https://www.cnblogs.com/gmm283029/p/4498942.html


https://dhexx.cn/news/show-16903.html

相关文章

3904三极管是什么功能_什么是分立器件?芯片、半导体、集成电路的关系

昨天&#xff0c;我们在文章中讲到&#xff0c;医药概念个股目前已经调整了将近20%&#xff0c;今天再给个大跌10%左右就可以打短&#xff0c;投机一把。目前从收盘上来看&#xff0c;还可以。前期强势的医药概念个股出现了反弹&#xff0c;好几只从跌停大幅拉红&#xff0c;即…

几个字节的数据怎么加密好?_塑料盆圆滑没有边,怎么做好卫生间收纳?教你几个好方法...

塑料盆圆滑没有边&#xff0c;怎么做好卫生间收纳&#xff1f;教你几个好方法哈喽大家好&#xff0c;前两天有朋友说到这个收纳的问题&#xff0c;一个朋友说对于塑料盆的收纳他有妙招&#xff0c;当时我有点好奇&#xff0c;就问了朋友这个问题&#xff0c;朋友说就是在塑料盆…

(转载) css实现小三角(尖角)

在各种网站里面&#xff0c;我们会经常看到类似于这样的尖角&#xff1a;&#xff08;示例&#xff1a;新浪微博&#xff09; 它实现的方式有多种&#xff0c;哪种才是最简单的&#xff1f;哪种才是最优秀的&#xff1f;首先我声明一下&#xff0c;我还不清楚这个东西具体叫什么…

pdf python 合同_是程序员,就用python导出pdf

这两天一直在做课件&#xff0c;我个人一直不太喜欢PPT这个东西……能不用就不用&#xff0c;我个人特别崇尚极简风。谁让我们是程序员呢&#xff0c;所以就爱上了Jupyter写课件&#xff0c;讲道理markdown也是个非常不错的写书格式啊。安装Jupyter其实非常简单&#xff0c;你会…

wordpress建站流程_国内类似WordPress的建站系统

事实上&#xff0c;外贸企业早已开始通过外贸独立网站的方式进行交易&#xff0c;毕竟拥有自己的网站&#xff0c;就有了企业品牌及网络营销的主阵地。据了解但凡初具规模的公司一般都有自己的网站&#xff0c;在展示企业产品的同时&#xff0c;网站还能为他们带来以下优势&…

php和mysql处理树状_分级_无限分类_分层数据的方法_PHP和MySQL处理树状、分级、无限分类、分层数据的方法...

文章标题中的多个词语表达的其实是一个意思&#xff0c;就是递归分类数据&#xff0c;分级数据非常类似数据结构中的树状结构&#xff0c;即每个节点有自己的孩子节点&#xff0c;孩子结点本身也是父亲节点。这是一个递归、分层形式。可以称之为树形层级数据。层级数据结构是编…

PS长图快速切片_PS最常用的100多个快捷键

PS最常用的100多个快捷键这些快捷键都是比较常用的&#xff0c;一些比较生僻的快捷键我就不发出来了。这些快捷键大家可以抄下来&#xff0c;但是&#xff0c;完全没有必要刻意的想去记住它&#xff0c;因为你越是想刻意的记住它&#xff0c;越是记不住。下面这一百多个快捷键全…

UVa 294 (因数的个数) Divisors

题意&#xff1a; 求区间[L, U]的正因数的个数。 分析&#xff1a; 有这样一条公式&#xff0c;将n分解为&#xff0c;则n的正因数的个数为 事先打好素数表&#xff0c;按照上面的公式统计出最大值即可。 1 #include <cstdio>2 #include <cmath>3 4 const int maxn…

uft自动化测试工具安装步骤_2020年十大最佳自动化测试工具

Best Automation Testing Tools for 2020对更快交付高质量软件(或"快速质量")的需求要求组织以敏捷&#xff0c;持续集成(CI)和DevOps方法论来寻找解决方案。测试自动化是这些方面的重要组成部分。最新的《 2018-2019年世界质量报告》表明&#xff0c;测试自动化是实…

hive 取消打印日志信息_Hive为什么这么受欢迎?来看Hive架构以及应用介绍

Hive究竟是什么&#xff0c;为什么在Hadoop家族中占有这么重要的地位&#xff0c;本篇文章将围绕Hive的体系结构(架构)、Hive的操作、Hive与Hbase的区别等对Hive进行全方面的阐述。作者&#xff1a;Python工程师Hive这个框架在Hadoop的生态体系结构中占有及其重要的地位&#x…