在布局文件中使用自定义的控件
→ 声明自定义的命名空间:
xmlns:mobile="http://com.kitty.widget"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
→ 在布局中使用自定义的控件,传入控件属性:
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="第一个图标"
mobile:iconSrc="@drawable/android" />
代码自定义控件
→ 令控件继承自现有控件:
public class IconTextView extends TextView {...}
→ 定义命名空间:
private final String namespace = "http://com.kitty.widget ";
→ 从布局文件读取控件属性:
private int resourceId = 0;
private Bitmap bitmap;
public IconTextView(Context context, AttributeSet attrs) {
super(context, attrs);
resourceId = attrs.getAttributeResourceValue(namespace, "iconSrc", 0);
if (resourceId > 0) {
bitmap = BitmapFactory.decodeResource(getResources(), resourceId);
}
}
→ 根据读入的属性绘制控件:
@Override
protected void onDraw(Canvas canvas) {
if (bitmap != null) {
Rect src = new Rect();// 从原图上截取图像的区域
Rect target = new Rect();// 将截取的图像复制到的目标区域
src.left = 0;
src.top = 0;
src.right = bitmap.getWidth();
src.bottom = bitmap.getHeight();
int textHeight = (int) getTextSize();
target.left = 0;
target.top = (int) ((getMeasuredHeight() - getTextSize()) / 2) + 1;
target.bottom = target.top + textHeight;
target.right = (int) (textHeight * (bitmap.getWidth() / (float) bitmap.getHeight()));
// 开始绘制图像
canvas.drawBitmap(bitmap, src, target, getPaint());
// 将TextView中的文本向右移动一定的距离(在本例中移动了图像宽度加2个象素点的位置)
canvas.translate(target.right + 2, 0);
}
super.onDraw(canvas);
}
效果图: