"Android自定义View及layout属性全攻略" 在Android开发中,自定义View是提升应用独特性和功能扩展性的重要手段。通过自定义View,开发者可以创建具有特定功能或视觉效果的组件,以满足应用的个性化需求。本文将深入探讨如何在Android中自定义View并充分利用layout属性。 首先,创建一个自定义View需要继承自Android的基础View类或其子类,如View、TextView、ImageView等。例如,我们创建一个名为`CwjView`的新View类,它继承自View: ```java public class CwjView extends View { // 初始化、绘制、事件处理等方法 } ``` 然后,我们可以在Activity中实例化这个自定义View,并直接添加到布局中,而无需使用XML布局文件。这可以通过在Java代码中直接创建并设置View来实现: ```java CwjView myView = new CwjView(this); setContentView(myView); ``` 当然,更常见的做法是将自定义View包含在XML布局文件中。这样,我们可以在布局XML中使用自定义View,就像使用系统提供的其他View一样: ```xml <cn.com.android123.CwjView android:layout_width="wrap_content" android:layout_height="wrap_content" /> ``` 在这里,`android:layout_width`和`android:layout_height`是标准的layout属性,用于指定View在屏幕上的尺寸。`wrap_content`表示View的大小由其内容决定,而`match_parent`则表示View将占据父容器的全部宽度或高度。 为了给自定义View添加更多的自定义属性,比如`age`、`university`和`city`,我们需要在XML布局中声明这些属性,并在Java代码中解析它们。首先,在res/values目录下创建一个新的XML文件,如`cwj_attr.xml`,定义这些自定义属性: ```xml <resources> <declare-styleable name="CwjView"> <attr name="age" format="integer"/> <attr name="university" format="string"/> <attr name="city" format="string"/> </declare-styleable> </resources> ``` 这里的`<declare-styleable>`标签用于声明一个自定义的styleable对象,`<attr>`标签定义了自定义属性及其数据类型。接下来,我们可以在自定义View类中使用`TypedArray`来获取这些属性的值: ```java @Override protected void onAttachedToWindow() { super.onAttachedToWindow(); TypedArray typedArray = context.obtainStyledAttributes(getAttributeSet(), R.styleable.CwjView); int age = typedArray.getInt(R.styleable.CwjView_age, -1); String university = typedArray.getString(R.styleable.CwjView_university); String city = typedArray.getString(R.styleable.CwjView_city); typedArray.recycle(); // 使用获取到的属性值进行进一步的操作 } ``` `onAttachedToWindow()`方法是一个合适的时机来获取属性值,因为此时View已经附加到了窗口。`getAttributeSet()`返回当前View的属性集,`R.styleable.CwjView`是我们在`cwj_attr.xml`中定义的styleable名称。`obtainStyledAttributes()`方法用于获取属性值,`recycle()`方法用于释放资源。 自定义View的另一个重要方面是重写`onDraw()`方法来实现自定义的绘图逻辑。例如,我们可以根据`age`属性绘制不同颜色的背景: ```java @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); // 根据age属性改变背景颜色 int backgroundColor; if (age > 18) { backgroundColor = Color.parseColor("#FF0000"); // 红色背景 } else { backgroundColor = Color.parseColor("#00FF00"); // 绿色背景 } canvas.drawColor(backgroundColor); // 其他绘图操作... } ``` 最后,别忘了在AndroidManifest.xml中声明自定义View所在的包名,以便系统能够正确识别和加载: ```xml <application> ... <uses-sdk android:minSdkVersion="16" android:targetSdkVersion="30" /> <activity ...> ... </activity> <activity android:name=".YourActivity"> ... <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/file_paths" /> </activity> <activity android:name=".CwjViewActivity" /> ... </application> ``` 通过以上步骤,我们不仅创建了一个自定义的View组件,还能够利用layout属性为其赋予丰富的定制化行为。在实际开发中,自定义View能够帮助我们实现复杂的功能,提高代码的复用性,同时使UI设计更加灵活多变。
25. Android自定义View以及layout属性全攻略
对于Android系统的自定义View可能大家都熟悉了,对于自定义View的属性添加,以及Android的Layout的命名空间问题,很多网友还不是很清楚,今天Android123一起再带大家温习一下 CwjView myView=new CwjView(context); 如果用于游戏或整个窗体的界面,我们可能直接在onCreate中setContentView(myView); 当然如果是控件,我们可能会需要从Layout的xml中声明,比如 <cn.com.android123.CwjView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/> 当然,我们也可以直接从父类声明比如 <View class="cn.com.android123.CwjView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/> 上面我们仅用了父类View的两个属性,均来自android命名空间,而名称为layout_width或layout_height,我们自定义的控件可能有更多的功能,比如 <cn.com.android123.CwjView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
cwj:age="22"
cwj:university="sjtu"
cwj:city="shanghai"
/> 我们可以看到上面的三个属性,是我们自定义的。作为标准xml规范,可能还包含了类似 xmlns:android="http://schemas.android.com/apk/res/android" 这样的语句,对于定义完整的View,我们的命名空间为cwj,这里可以写为 xmlns:cwj=http://schemas.android.com/apk/res/cn.com.android123.cwjView 或 xmlns:cwj=http://schemas.android.com/apk/res/android 都可以。 对于定义的cwj命名空间和age、university以及city的三个属性我们如何定义呢? 在工程的res/values目录中我们新建一个cwj_attr.xml文件,编码方式为utf-8是一个好习惯,内容如下 <?xml version="1.0" encoding="utf-8" ?>
<resources>
<declare-styleable name="CwjView">
<attr name="age" format="integer" />
<attr name="city" format="string" />
<attr name="university" format="string" />
</declare-styleable>
</resources> 这里我们可能对format不是很熟悉,目前Android系统内置的格式类型有integer比如ProgressBar的进度值,float比如RatingBar的值可能是3.5颗星,boolean比如ToggleButton的是否勾选,string比如TextView的text属性,当然除了我们常见的基础类型外,Android的属性还有特殊的比如color是用于颜色属性的,可以识别为#FF0000等类型,当然还有dimension的尺寸类型,比如23dip,15px,18sp的长度单位,还有一种特殊的为reference,一般用于引用@+id/cwj @drawable/xxx这样的类型。 当然什么时候用reference呢? 我们就以定义一个颜色为例子, <attr name="red" format="color|reference" /> 这里我们用了逻辑或的运算符,定义的红色是颜色类型的,同时可以被引用 当然,对于我们自定义的类中,我们需要使用一个名为obtainStyledAttributes的方法来获取我们的定义。在我们自定义View的构造方法(Context context, AttributeSet attrs)的重载类型中可以用 public CwjView(Context context, AttributeSet attrs) {
super(context, attrs);
TypedArray a = context.obtainStyledAttributes(attrs,
R.styleable.cwj_attr);
mAge = a.getInteger(R.styleable.CwjView_age, 22);
mCity = a.getString(R.styleable.CwjView_city, "shanghai");
mUniversity= a.getString(R.styleable.CwjView_university, "sjtu");
a.recycle(); //Android123提示大家不要忘了回收资源 } 这样类的全局成员变量 mAge、mCity就获取了我们需要的内容,当然根据layout中的数值我们自定义的CwjView需要动态的处理一些数据的情况,可以使用AttributeSet类的getAttributeResourceValue方法获取。 public CwjView(Context context, AttributeSet attrs)
下载后可阅读完整内容,剩余1页未读,立即下载
- 粉丝: 0
- 资源: 21
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- C++标准程序库:权威指南
- Java解惑:奇数判断误区与改进方法
- C++编程必读:20种设计模式详解与实战
- LM3S8962微控制器数据手册
- 51单片机C语言实战教程:从入门到精通
- Spring3.0权威指南:JavaEE6实战
- Win32多线程程序设计详解
- Lucene2.9.1开发全攻略:从环境配置到索引创建
- 内存虚拟硬盘技术:提升电脑速度的秘密武器
- Java操作数据库:保存与显示图片到数据库及页面
- ISO14001:2004环境管理体系要求详解
- ShopExV4.8二次开发详解
- 企业形象与产品推广一站式网站建设技术方案揭秘
- Shopex二次开发:触发器与控制器重定向技术详解
- FPGA开发实战指南:创新设计与进阶技巧
- ShopExV4.8二次开发入门:解决升级问题与功能扩展