各位朋友,博主向大家问好啦!
初次见面,多多关照。
博主正在学习移动开发,今天老师教授的是定制控件:带图标的TextView,
然后课后依葫芦画瓢,博主定制了一个带图标的可编辑文本框,其实原理都一样!
博主觉得该课题具有可鉴意义,特此分享给大家,帮助入门级开发人员,大虾别见笑。
注意:以下项目在创建时没有勾选activity,是一个空白项目
好啦,先来张效果图演示吧:
项目结构图:
一、在src目录下创建一个类,用来编写控件代码(博主的是IconTextView.java)
<span style="font-size:14px;color:#006600;">package com.demo.widgets;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Rect;
import android.util.AttributeSet;
import android.widget.TextView;
public class IconTextView extends TextView {
//声明命名空间的值
private final String namespace="http://widgets.demo.com";
//保存图片资源ID的变量
private int resourceId=0;
//声明图片对象变量
private Bitmap bitmap;
//编写控制构造方法
public IconTextView(Context context,AttributeSet attrs){
//由于该空间类是从TextView继承,其构造过程应先构建父类,然后才是本身
super(context,attrs);
//使用AttributeResourceValue获得布局文件中控件属性的值
//该方法有3个参数:
//第一个参数表示命名空间
//第二个参数表示属性名
//第三个参数表示默认值,若在布局文件中不能得到该属性的值则返回该值
resourceId=attrs.getAttributeResourceValue(namespace, "iconSrc",0);
if(resourceId>0){
//若成功获得图像资源ID则装载图像并实例化Bitmap对象
bitmap=BitmapFactory.decodeResource(getResources(), resourceId);
}
}
//重载onDraw方法
@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=(getMeasuredHeight()-textHeight)/2;
target.bottom=target.top+textHeight;
//为了截取的图像不变形,图像大小要重新计算
target.right=(int)(textHeight*20/(float)20);
//绘制截图
canvas.drawBitmap(bitmap,src,target,getPaint());
//让文本与截图有点间距
canvas.translate(target.right+2, 0);
}
super.onDraw(canvas);
}
}</span>
二、在当前项目res/layout下新建一个线性布局视图(博主的是icontvxml.xml)
注意命名空间的位置,需要添加一个自己的命名空间,否则无法完成自定义控件
<span style="font-size:14px;color:#006600;"><?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:icoand="http://widgets.demo.com"
android:background="@drawable/bg"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<com.demo.widgets.IconTextView
icoand:iconSrc="@drawable/ikivilife"
android:id="@+id/txt1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="