组合控件详解 & 自定义属性
组合控件是自定义控件的一种,只不过它是由其他几个原生控件组合而成,故名组合控件。
在实际项目中,GUI 会遇到一些可以提取出来做成自定义控件情况。
一个自定义控件的好处就是把一些需要模块化的 UI 和逻辑放在一起,做到了高内聚,向其他模块提供接口并很少依赖外界,这样就是低耦合。一个自定义控件就是一个封闭的王国,这里由你掌控。
上述是我自己的一个体会,想必大家也会常做自定义控件吧,就像逻辑部分的模块化一样。
下面我要做一个例子,请看完成图。
ocn.yang
下面一排图片加文字就是组合控件了,我是怎么做的呢?
其实这里用到了两个组合控件,一个是图片+文字,我把它叫一个 Item,而三个在一起就是另一个控件了。
重点看这个 Item,它有自己的属性如图片、文字、图片大小、文字大小、不透明度等等。这些把它定义在 attr 文件中,然后在 xml 文件中配置,就像我们用原生控件一样。
自定义属性
先看 attr 文件。
这个文件在 values 下,和 string 文件同级。把你自己要定义的属性都写在这里吧。format 是属性的“单位”,如果你要问有多少中 format 呀?答案在这里。
组合控件的布局文件
有了属性了,下面看看布局文件 level_menu_item.xml。
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
android:id="@+id/image_item"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:scaleType="fitCenter"
/>
android:id="@+id/tv_item"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:gravity="center_horizontal"
android:textColor="#23ffffff"
android:textSize="25sp"
/>
这里唯一值得一说的是文本的颜色。大家看见他是8位的,前两位是表示不透明度的,后六位是表示颜色的,三色,范围都是00~ff。
如果在 Java 中设置颜色,需要这样。
setTextColor(0x23ffffff);
关于不透明度,一般美工会定义。有些要求不透明如30%这样的,可以用整型换算一下。00~ff 对应十进制为0~255,那么30%就是255x0.3=76.5,用科学计算机换算为4c。
更多颜色相关设置这里附上《Android 中设置文本颜色的三种办法》
1、 利于系统自带的颜色类
如: TextView1.setTextColor(android.graphics.Color.RED);
布局文件中:android:textColor="@android:color/white"
详见Android源码:base/core/res/res/values/colors.xml
2、 数字颜色表示法
TextView1.setTextColor(0xffff00ff);
3、 自定义颜色
TextView1.setTextColor(this.getResources().getColor(R.drawable.red));
组合控件的类文件
然后我们就要写一个类,我这继承子线性布局。有两个构造函数,我们主要在两个参数的函数中工作。
public class LevelMenuItem extends LinearLayout {
public LevelMenuItem(Context context, AttributeSet attrs) {
super(context, attrs);
}
这个类中我们要完成的工作是,初始化控件属性、提供外部修改属性的接口、控件点击的回调接口。
此类完整代码:
package com.linc.game;
import android.content.Context;
import android.content.res.TypedArray;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import andr