自定义View(1)------------自定义属性

2024-06-17 16:58

本文主要是介绍自定义View(1)------------自定义属性,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

先贴一个网址,这个大神画的不错  http://blog.csdn.net/wangchunlei123/article/details/50478913

自定义View的步骤:

1、创建一个自定义的View如:MyNoteView继承View或者View的子类

写构造方法:根据需要写出构造函数

public MyNoteView(Context context)   通过java代码写布局    new 这个对象的时候会执行该方法

public MyNoteView(Context context, AttributeSet attrs)    使用xml文件布局的时候使用  

参数说明:AttributeSet:引用资源的属性集合

public MyTextView(Context context, AttributeSet attrs, int defStyleAttr)

也是在xml文件中使用该方法 如果本类中 写了该构造方法,则必须还要添加 上面第二个构造方法

参数说明:defStyleAttr 默认的一个属性风格id

2、自定义属性:在res\values文件夹新建attrs.xml文件

使用declare-styleable标签声明自定义View,声明时anme的值必须与使用该属性的View 名称相同,如:

<declare-styleable name="MyTextView"><attr name="textColor" format="color|reference"></attr><attr name="textSize" format="dimension"></attr><attr name="text" format="string"></attr></declare-styleable>
(1)定义每个属性的 name,     name可以随便命名,但是最好见名知意
(2)   定义每个属性的format(格式)  填写格式类型可以多种       以   “|”  符号链接

format的类型

1、reference   参考某一资源 ,通常是@开头,例如@+id/xxxx,@id/xxx
2、color          颜色值
3、boolean     布尔值
4、dimension 尺寸值(带有单位的 sp/dp)
5、float           浮点型
6、integer 整形
7、string 字符串
8、fraction       百分比
9、enum 枚举
10、flag 位或运算

(3)在xml文件中使用自定义的属性,

注意:

①自定义View的引用 必须是包名+类名(全路径)

②根元素的中必须增加了一个额外的命名空间: xmlns:app="http://schemas.android.com/apk/res/com.phone.day28_customviewattr"      其中app表示      元素中使用以app开头的属性,

...../res/后表示完整的包名com.phone.day28_customviewattr    具体使用如下:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"xmlns:app="http://schemas.android.com/apk/res/com.phone.day28_customviewattr"android:layout_width="match_parent"android:layout_height="match_parent"android:paddingBottom="@dimen/activity_vertical_margin"android:paddingLeft="@dimen/activity_horizontal_margin"android:paddingRight="@dimen/activity_horizontal_margin"android:paddingTop="@dimen/activity_vertical_margin"tools:context=".MainActivity" ><!-- 自定义View的引用 必须是包名+类名(全路径) --><com.phone.day28_customviewattr.MyTextViewandroid:id="@+id/myTextView1"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignParentLeft="true"android:layout_alignParentTop="true"app:text="我是石头里蹦出来的"app:textColor="@android:color/holo_blue_light"app:textSize="24sp" /></RelativeLayout>
③在java代码中要使用自定义的属性

在 自定义View 的构造方法中  通过TypedArray 将我们设置的值拿出来,赋予画笔或画布进行绘制

我们调用Context.obtainStyledAttributes方法获得TypedArray的对象

在attrs.xml中定义的名称,通过R.styleable来访问,按照attrs.xml中定义的属性的类型,使用不同的get方法获取指定属性的值。

TypedArray array = context.obtainStyledAttributes(attrs,R.styleable.MyTextView);color = array.getColor(R.styleable.MyTextView_textColor, Color.BLACK);text = array.getString(R.styleable.MyTextView_text);size = array.getDimension(R.styleable.MyTextView_textSize, 18);
完整获取属性代码如下:

public MyTextView(Context context, AttributeSet attrs) {super(context, attrs);// TODO Auto-generated constructor stub// 画笔mPaint = new Paint();// 帮助我们将设置的属性资源拿到这里TypedArray array = context.obtainStyledAttributes(attrs,R.styleable.MyTextView);color = array.getColor(R.styleable.MyTextView_textColor, Color.BLACK);text = array.getString(R.styleable.MyTextView_text);size = array.getDimension(R.styleable.MyTextView_textSize, 18);mPaint.setColor(color);mPaint.setTextSize(size);// 回收array.recycle();}
(4)根据需要重写以下方法;

①测量,计算当前view 的大小   protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec)
②位置 1自身相对于 父布局的位置 2如果自身是ViewGroup 还有 childView 相对于自身的位置

protected void onLayout(boolean changed, int left, int top, int right,  int bottom)

③控制View在屏幕上的渲染效果,protected void onDraw(Canvas canvas)

④监听手势滑动public boolean onTouchEvent(MotionEvent event)

以下写一个简单的例子并贴出一个完整代码:

自定义的一个View   MyTextView

package com.phone.day28_customviewattr;import android.annotation.SuppressLint;
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;public class MyTextView extends View {Paint mPaint;int color;float size;String text = "";/*** * 构造方法 一般只使用第一个(new 的时候)和 第二个xml 文件中* * @param context*/// 在java代码中 new 这个对象的时候会执行该方法public MyTextView(Context context) {super(context);}// 当在xml文件中使用的时候会执行该方法// AttributeSet:引用资源的属性集合@SuppressLint("Recycle")public MyTextView(Context context, AttributeSet attrs) {super(context, attrs);// TODO Auto-generated constructor stub// 画笔mPaint = new Paint();// 帮助我们将设置的属性资源拿到这里TypedArray array = context.obtainStyledAttributes(attrs,R.styleable.MyTextView);color = array.getColor(R.styleable.MyTextView_textColor, Color.BLACK);text = array.getString(R.styleable.MyTextView_text);size = array.getDimension(R.styleable.MyTextView_textSize, 18);mPaint.setColor(color);mPaint.setTextSize(size);// 回收array.recycle();}// //也是在xml文件中使用该方法 如果本类中 写了该构造方法,则必须还要添加 上面第二个构造方法// defStyleAttr 默认的一个属性风格idpublic MyTextView(Context context, AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);}/*** 测量,计算当前view 的大小*/@Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {super.onMeasure(widthMeasureSpec, heightMeasureSpec);}/*** 位置 1自身相对于 父布局的位置 2如果自身是ViewGroup 还有 childView 相对于自身的位置* */@Overrideprotected void onLayout(boolean changed, int left, int top, int right,int bottom) {super.onLayout(changed, left, top, right, bottom);}/*** 绘制 1 画布 2 画笔 3 内容* */@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);// 绘制  当前textViewcanvas.drawText(text, 100, 100, mPaint);}/*** 监听手势滑动*/@Overridepublic boolean onTouchEvent(MotionEvent event) {return super.onTouchEvent(event);}}
atrrs.xml文件的代码

<?xml version="1.0" encoding="utf-8"?>
<resources><declare-styleable name="MyTextView"><attr name="textColor" format="color|reference"></attr><attr name="textSize" format="dimension"></attr><attr name="text" format="string"></attr></declare-styleable>
</resources>
使用自定义属性的xml文件activity_main.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"xmlns:app="http://schemas.android.com/apk/res/com.phone.day28_customviewattr"android:layout_width="match_parent"android:layout_height="match_parent"android:paddingBottom="@dimen/activity_vertical_margin"android:paddingLeft="@dimen/activity_horizontal_margin"android:paddingRight="@dimen/activity_horizontal_margin"android:paddingTop="@dimen/activity_vertical_margin"tools:context=".MainActivity" ><!-- 自定义View的引用 必须是包名+类名(全路径) --><com.phone.day28_customviewattr.MyTextViewandroid:id="@+id/myTextView1"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignParentLeft="true"android:layout_alignParentTop="true"app:text="我是石头里蹦出来的"app:textColor="@android:color/holo_blue_light"app:textSize="24sp" /></RelativeLayout>
在自定义View中重写相应的方法就可以了


关于自定义View 的其他知识会在之后写出来


这篇关于自定义View(1)------------自定义属性的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1070020

相关文章

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

滚雪球学Java(87):Java事务处理:JDBC的ACID属性与实战技巧!真有两下子!

咦咦咦,各位小可爱,我是你们的好伙伴——bug菌,今天又来给大家普及Java SE啦,别躲起来啊,听我讲干货还不快点赞,赞多了我就有动力讲得更嗨啦!所以呀,养成先点赞后阅读的好习惯,别被干货淹没了哦~ 🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,助你一臂之力,带你早日登顶🚀,欢迎大家关注&&收藏!持续更新中,up!up!up!! 环境说明:Windows 10

自定义类型:结构体(续)

目录 一. 结构体的内存对齐 1.1 为什么存在内存对齐? 1.2 修改默认对齐数 二. 结构体传参 三. 结构体实现位段 一. 结构体的内存对齐 在前面的文章里我们已经讲过一部分的内存对齐的知识,并举出了两个例子,我们再举出两个例子继续说明: struct S3{double a;int b;char c;};int mian(){printf("%zd\n",s

Spring 源码解读:自定义实现Bean定义的注册与解析

引言 在Spring框架中,Bean的注册与解析是整个依赖注入流程的核心步骤。通过Bean定义,Spring容器知道如何创建、配置和管理每个Bean实例。本篇文章将通过实现一个简化版的Bean定义注册与解析机制,帮助你理解Spring框架背后的设计逻辑。我们还将对比Spring中的BeanDefinition和BeanDefinitionRegistry,以全面掌握Bean注册和解析的核心原理。

Oracle type (自定义类型的使用)

oracle - type   type定义: oracle中自定义数据类型 oracle中有基本的数据类型,如number,varchar2,date,numeric,float....但有时候我们需要特殊的格式, 如将name定义为(firstname,lastname)的形式,我们想把这个作为一个表的一列看待,这时候就要我们自己定义一个数据类型 格式 :create or repla

MVC(Model-View-Controller)和MVVM(Model-View-ViewModel)

1、MVC MVC(Model-View-Controller) 是一种常用的架构模式,用于分离应用程序的逻辑、数据和展示。它通过三个核心组件(模型、视图和控制器)将应用程序的业务逻辑与用户界面隔离,促进代码的可维护性、可扩展性和模块化。在 MVC 模式中,各组件可以与多种设计模式结合使用,以增强灵活性和可维护性。以下是 MVC 各组件与常见设计模式的关系和作用: 1. Model(模型)

HTML5自定义属性对象Dataset

原文转自HTML5自定义属性对象Dataset简介 一、html5 自定义属性介绍 之前翻译的“你必须知道的28个HTML5特征、窍门和技术”一文中对于HTML5中自定义合法属性data-已经做过些介绍,就是在HTML5中我们可以使用data-前缀设置我们需要的自定义属性,来进行一些数据的存放,例如我们要在一个文字按钮上存放相对应的id: <a href="javascript:" d

一步一步将PlantUML类图导出为自定义格式的XMI文件

一步一步将PlantUML类图导出为自定义格式的XMI文件 说明: 首次发表日期:2024-09-08PlantUML官网: https://plantuml.com/zh/PlantUML命令行文档: https://plantuml.com/zh/command-line#6a26f548831e6a8cPlantUML XMI文档: https://plantuml.com/zh/xmi

Python中的属性装饰器:解锁更优雅的编程之道

引言 在Python的世界里,装饰器是一个强大的工具,它允许我们以一种非侵入性的方式修改函数或方法的行为。而当我们谈论“属性装饰器”时,则是在探讨如何使用装饰器来增强类中属性的功能。这不仅让我们的代码更加简洁、易读,同时也提供了强大的功能扩展能力。本文将带你深入了解属性装饰器的核心概念,并通过一系列实例展示其在不同场景下的应用,从基础到进阶,再到实际项目的实战经验分享,帮助你解锁Python编程

argodb自定义函数读取hdfs文件的注意点,避免FileSystem已关闭异常

一、问题描述 一位同学反馈,他写的argo存过中调用了一个自定义函数,函数会加载hdfs上的一个文件,但有些节点会报FileSystem closed异常,同时有时任务会成功,有时会失败。 二、问题分析 argodb的计算引擎是基于spark的定制化引擎,对于自定义函数的调用跟hive on spark的是一致的。udf要通过反射生成实例,然后迭代调用evaluate。通过代码分析,udf在