广告
返回顶部
首页 > 资讯 > 移动开发 >Android自定义组件:2、如何实现和使用自定义组件、自定义属性
  • 877
分享到

Android自定义组件:2、如何实现和使用自定义组件、自定义属性

属性自定义属性Android 2022-06-06 13:06:56 877人浏览 泡泡鱼
摘要

声明:本教程不收取任何费用,欢迎转载,尊重作者劳动成果,不得用于商业用途,侵权必究!!! 目录 一、前言 二、如何实现自定义组件 步骤1:写 attrs.xml 资源文件 1、

声明:本教程不收取任何费用,欢迎转载,尊重作者劳动成果,不得用于商业用途,侵权必究!!!

目录

一、前言

二、如何实现自定义组件

步骤1:写 attrs.xml 资源文件

1、attrs.xml 文件 和 R 文件对应关系

2、attrs.xml 文件重点注意

(1)declare-styleable子元素

(2)attrs.xml 文件只做属性的描述

步骤2:写自定义类

步骤3:使用自定义组件、自定义属性

三、效果展示-简单小结

1、效果展示

2、执行流程

3、可以不写 attrs.xml 文件

4、问题

四、把代码移植到 Android Studio中去

1、Android Studio中自定义的控件,在xml文件写属性时没有智能提示了?

2、移植自定义属性文件 attrs.xml

3、移植自定义类 MyView.java

4、移植调用位置,布局文件 R.layout.activity_main

一、前言

上一篇文章我们介绍了:什么是自定义组件、自定义组件的方式、配置XML属性资源文件的方式等知识点,详见博文:原创 Android自定义组件:1、什么是自定义组件、自定义组件的方式、配置XML属性资源文件的方式 这篇博文我们将介绍:如何实现自定义组件

二、如何实现自定义组件 步骤1:写 attrs.xml 资源文件 1、attrs.xml 文件 和 R 文件对应关系

新建一个安卓项目工程,在工程里的 .../res/values/ 目录下创建一个 attrs.xml 文件



如上面代码,当我们定义一个 textColor属性,保存以后,你会发现 R 文件的变化:

(1)R 文件中的 attr内部类,生成了一个变量 textColor

(2)R 文件内部,还生成了一个 styleable的内部类,

styleable 类里面生成了一个 myView的数组、一个变量 myView_textColor。

其中通过 myView_textColor 这个索引,我们就可以在自定义类里面访问到 textColor的值,

下面我们写自定义类的时候会讲到,如下:


// 这里从集合里取出相对应的属性值,第二参数是:如果使用者没有配置该属性时,所用的默认值
int color = typedArray.getColor(R.styleable.myView_textColor, 0XFFFFFF);

当我们定义完三个属性:textColor、textSize、text,保存以后,



R文件它会同上面那样,进行变化添加

        

2、attrs.xml 文件重点注意

​
​
(1)declare-styleable子元素

declare-styleable子元素,定义一个 styleable对象,每个 styleable对象就是一组 attr属性的集合。

注意:这里的 name属性并不是一定要和自定义类名相同,只是为了好区分对应类的属性而已。

(2)attrs.xml 文件只做属性的描述

上面的属性资源文件定义了好属性之后,那么到底哪个自定义 View组件来使用该属性?该属性到底能发挥什么作用?

这个就不归该属性资源文件管了,attrs.xml 文件只做属性的描述。

具体属性做什么用途?它不管,具体要看你的代码怎么去写。

也就是说属性资源所定义的属性,到底可以返回什么作用?取决于自定义组件的代码实现。

如:你设置是谁的颜色、尺寸、文本?这个需要我们通过具体 java代码去控制。

也就是说这个属性资源文件是个公共的,大家都可以用。

但是为了方便管理,一般都是一个自定义 View里的属性,写成一个 declare-styleable集合。

步骤2:写自定义类

在自定义类里引用 attrs文件里定义的属性,为自己的属性设置值

这里我们继承最原始的 View,很多东西都需要自己画,然后渲染到屏幕上。

View里面会有一个 onDraw方法,当初始化这个自定义对象,就会自动调用 onDraw方法。


package com.example.attrstest;
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Paint.Style;
import android.graphics.Rect;
import android.util.AttributeSet;
import android.util.Log;
import android.view.View;

public class MyView extends View{
	private Paint paint;//画笔
	private String text;
	private static final String TAG="MyView@@@";
	
	public MyView(Context context) {
		super(context);
		Log.v(TAG, "***MyView不带属性的构造方法");
		paint = new Paint();//初始化画笔
		paint.setColor(Color.BLACK);//画笔颜色-黑色
		paint.setTextSize(20);//画笔尺寸
	}
	
	public MyView(Context context, AttributeSet attrs) {
		super(context, attrs);
		Log.v(TAG, "***MyView带属性的构造方法");
		paint = new Paint();//初始化画笔
		// 获取属性的方式
		// 这里取得 declare-styleable 集合
		TypedArray typedArray =  context.obtainStyledAttributes(attrs,R.styleable.myView);
		//参数1:直接内嵌在View中的属性集合。这里直接使用 MyView构造方法的参数2
		//参数2:想要获取的属性集合。
		//通常对应values文件下,自定义的attrs.xml资源文件里面,某个declare-styleable(风格样式)
		//obtainStyledAttributes(AttributeSet set, int[] attrs)
		// 这里从集合里取出相对应的属性值。 参数2:如果使用者没有配置该属性时,所用的默认值
		int color = typedArray.getColor(R.styleable.myView_textColor,  Color.GREEN);
		float size = typedArray.getDimension(R.styleable.myView_textSize, 26);
		text = typedArray.getString(R.styleable.myView_text);
		paint.setTextSize(size);//设置自己的类成员变量
		paint.setColor(color);//画笔颜色-绿色
		typedArray.recycle();//关闭资源
	}
	
	@Override
	protected void onDraw(Canvas canvas) {
		super.onDraw(canvas);
		Log.v(TAG, "***onDraw方法");
		paint.setStyle(Style.FILL);//设置画笔的风格-实心
		canvas.drawRect(new Rect(10, 10, 90, 90), paint);//绘制矩形
		paint.setColor(Color.BLUE);//画笔颜色-蓝色
		canvas.drawText(text,15, 120, paint);//绘制文本
	}
}
步骤3:使用自定义组件、自定义属性

布局文件 R.layout.activity_main 里面进行调用,如下:



    
三、效果展示-简单小结 1、效果展示

运行效果,如下图:

2、执行流程

MainActivity--->activity_main--->MyView类--->MyView带属性的构造方法--->onDraw方法进行绘制

3、可以不写 attrs.xml 文件

有的时候我们可以不写 attrs.xml 文件,那么什么时候可以不写呢?

我们不需要自定义属性,默认提供的属性已经足够使用,这种情况我们可以不写  attrs.xml 文件,来定义自己的属性。

4、问题

Eclipse中自定义的控件,在xml文件写属性时没有智能提示了?

这个未解决。

因为现在开发工具都用的 Android Studio,下面会把代码转移到 Android Studio中去,所以整理的时候就没有去解决这个问题了。
 

四、把代码移植到 Android Studio中去

1、Android Studio中自定义的控件,在xml文件写属性时没有智能提示了?

把 declare-styleable标签的 name改成和自定义类 一样就行了,

自定义类 MyView这些地方,即调用的位置要相应改变  

这个在 Eclipse上面测试不管用,Android Studio上测试是可行的,如下图:

要移植代码,就先修改为 一样的名字了

2、移植自定义属性文件 attrs.xml


3、移植自定义类 MyView.java

package com.yyh.attrstest;
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Paint.Style;
import android.graphics.Rect;
import android.util.AttributeSet;
import android.util.Log;
import android.view.View;

public class MyView extends View{
	private Paint paint;//画笔
	private String text;
	private static final String TAG="MyView@@@";
	
	public MyView(Context context) {
		super(context);
		Log.v(TAG, "***MyView不带属性的构造方法");
		paint = new Paint();//初始化画笔
		paint.setColor(Color.BLACK);//画笔颜色-黑色
		paint.setTextSize(20);//画笔尺寸
	}
	
	public MyView(Context context, AttributeSet attrs) {
		super(context, attrs);
		Log.v(TAG, "***MyView带属性的构造方法");
		paint = new Paint();//初始化画笔
		// 获取属性的方式
		// 这里取得 declare-styleable 集合
		TypedArray typedArray =  context.obtainStyledAttributes(attrs,R.styleable.MyView);
		//参数1:直接内嵌在View中的属性集合。这里直接使用 MyView构造方法的参数2
		//参数2:想要获取的属性集合。
		//通常对应values文件下,自定义的attrs.xml资源文件里面,某个declare-styleable(风格样式)
		//obtainStyledAttributes(AttributeSet set, int[] attrs)
		// 这里从集合里取出相对应的属性值。 参数2:如果使用者没有配置该属性时,所用的默认值
		int color = typedArray.getColor(R.styleable.MyView_textColor,  Color.GREEN);
		float size = typedArray.getDimension(R.styleable.MyView_textSize, 26);
		text = typedArray.getString(R.styleable.MyView_text);
		paint.setTextSize(size);//设置自己的类成员变量
		paint.setColor(color);//画笔颜色-绿色
		typedArray.recycle();//关闭资源
	}
	
	@Override
	protected void onDraw(Canvas canvas) {
		super.onDraw(canvas);
		Log.v(TAG, "***onDraw方法");
		paint.setStyle(Style.FILL);//设置画笔的风格-实心
		canvas.drawRect(new Rect(10, 10, 90, 90), paint);//绘制矩形
		paint.setColor(Color.BLUE);//画笔颜色-蓝色
		canvas.drawText(text,15, 120, paint);//绘制文本
	}
}
4、移植调用位置,布局文件 R.layout.activity_main

调用的时候需要修改命名空间,如下图


也就是把下面代码
xmlns:my="Http://schemas.android.com/apk/res/com.yyh.attrstest"
替换为:
xmlns:my="http://schemas.android.com/apk/res-auto"

具体代码如下:



    

作者:luminal_Andy


--结束END--

本文标题: Android自定义组件:2、如何实现和使用自定义组件、自定义属性

本文链接: https://www.lsjlt.com/news/29462.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Android自定义组件:2、如何实现和使用自定义组件、自定义属性
    声明:本教程不收取任何费用,欢迎转载,尊重作者劳动成果,不得用于商业用途,侵权必究!!! 目录 一、前言 二、如何实现自定义组件 步骤1:写 attrs.xml 资源文件 1、...
    99+
    2022-06-06
    属性 自定义属性 Android
  • Android自定义组件:1、什么是自定义组件、自定义组件的方式、定义自定义属性
    声明:本教程不收取任何费用,欢迎转载,尊重作者劳动成果,不得用于商业用途,侵权必究!!! 目录 一、前言 二、什么是自定义组件 三、自定义组件的方式 1、组合现有组件 2、在某...
    99+
    2022-06-06
    属性 自定义属性 Android
  • Android自定义控件之自定义属性(二)
    前言: 上篇介绍了自定义控件的基本要求以及绘制的基本原理,本篇文章主要介绍如何给自定义控件自定义一些属性。本篇文章将继续以上篇文章自定义圆形百分比为例进行讲解。有关原理知识请参...
    99+
    2022-06-06
    属性 自定义属性 Android
  • Android自定义控件之自定义组合控件(三)
    前言: 前两篇介绍了自定义控件的基础原理Android自定义控件基本原理详解(一)、Android自定义控件之自定义属性(二)。今天重点介绍一下如何通过自定义组合控件来提高布...
    99+
    2022-06-06
    Android
  • Android自定义控件如何在XML文件中使用自定义属性
    目录前言一、为什么需要自定义控件二、具体步骤1.首先我们创建一个 layout xml文件:2.为自定义控件创建java类:3.在res/values下,新建一个attrs.xml文...
    99+
    2023-05-14
    Android XML自定义属性 Android 自定义控件
  • android 自定义控件 自定义属性详细介绍
    自定义控件在android中无处不见,自定义控件给了我们很大的方便。比如说,一个视图为imageview ,imagebutton ,textview 等诸多控件的组合,用的地...
    99+
    2022-06-06
    自定义 自定义控件 属性 自定义属性 Android
  • android自定义组件实现方法
    本文实例讲述了android自定义组件实现方法。分享给大家供大家参考。具体如下: atts.xml: <?xml version="1.0" encoding...
    99+
    2022-06-06
    方法 Android
  • Android自定义封装banner组件
    自定义封装 banner 组件,供大家参考,具体内容如下1. 效果图预览 2.基本功能一个简单方便的轮播图组件,基于viewpager 基础上进行的封装。可设置 项目中图片,网络图片, View;支持循环自动播放,手势滑动切换,i...
    99+
    2023-05-31
    android banner 组件
  • 详解Android自定义控件属性
    在Android开发中,往往要用到自定义的控件来实现我们的需求或效果。在使用自定义 控件时,难免要用到自定义属性,那怎么使用自定义属性呢? 在文件res/values/下新建...
    99+
    2022-06-06
    属性 Android
  • 如何在Android中自定义UI组件
    如何在Android中自定义UI组件?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。Android开发自定义UI组件实现红色小球跟随手指移动要写实现自定义UI组件,要创建一个Ba...
    99+
    2023-06-15
  • Android实现Ant Design 自定义表单组件
    Ant Design 组件提供了Input,InputNumber,Radio,Select,uplod等表单组件,但实际开发中这是不能满足需求,同时我们希望可以继续使用Form提供的验证和提示等方法(使用起来确实很爽),这时需要...
    99+
    2023-05-31
    ant design 表单组件
  • android怎么自定义组合控件
    要自定义一个组合控件,你可以按照以下步骤进行:1. 创建一个新的类,继承自现有的Android控件类,例如LinearLayout或...
    99+
    2023-08-09
    android
  • vue如何用directives自定义组件
    这篇“vue如何用directives自定义组件”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“vue如何用directive...
    99+
    2023-07-04
  • wpf如何自定义控件属性
    在WPF中,可以通过创建自定义控件继承自现有的控件,并添加自定义属性来实现自定义控件属性。 以下是一个简单的示例,展示了如何创建一个...
    99+
    2023-10-24
    wpf
  • 如何实现自定义SpringBoot的Starter组件
    目录一、前言1.1、starter加载原理1.1.1、加载starter二、自定义starter2.1、代码2.1.1、新建springboot项目。2.1.2、项目构建完成后,在r...
    99+
    2023-02-08
    SpringBoot自定义Starter组件 SpringBoot的Starter组件
  • 小程序如何自定义组件
    本文小编为大家详细介绍“小程序如何自定义组件”,内容详细,步骤清晰,细节处理妥当,希望这篇“小程序如何自定义组件”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。一 小程序提供了很多api和基础组件,但为减少代码的复...
    99+
    2023-06-26
  • Vue.use如何自定义全局组件
    这篇文章主要讲解了“Vue.use如何自定义全局组件”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Vue.use如何自定义全局组件”吧!首先看下目前的项目结构:webpack首先会加载mai...
    99+
    2023-07-04
  • Angular2如何自定义分页组件
    这篇文章主要介绍了Angular2如何自定义分页组件,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。在项目中,前端传给后台的参数有:pageS...
    99+
    2022-10-19
  • Vue组件模版如何自定义
    本篇内容介绍了“Vue组件模版如何自定义”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!字符串形式Vue 最简单直接的一种定义组件模版的方式,...
    99+
    2023-07-04
  • vue如何自定义组件传值
    本篇内容介绍了“vue如何自定义组件传值”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!自定义组件传值常规prop-event父组件<p...
    99+
    2023-07-04
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作