自定义控件的最简单方法就是继承这个控件。
这次我们来重写一个TextView,让系统自带textview的左边加上一个图标。
效果如下:
实现方法:
package com.xys.widget; 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://com.xys"; //资源ID private int resourceID=0; private Bitmap bitmap; public IconTextView(Context context, AttributeSet attrs) { super(context, attrs); // TODO Auto-generated constructor stub //该方法用于获得该控件属性的值 resourceID=attrs.getAttributeResourceValue(namespace, "iconSrc",0); if(resourceID>0){ bitmap=BitmapFactory.decodeResource(getResources(), resourceID); } } @Override protected void onDraw(Canvas canvas) { // TODO Auto-generated method stub 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); } //父类的onDrow一定要在translate方法后执行 super.onDraw(canvas); } }布局文件中的使用方法:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:mobile="http://com.xys" android:layout_width="match_parent" android:layout_height="match_parent" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerHorizontal="true" android:layout_centerVertical="true" android:text="@string/hello_world"> </TextView> <com.xys.widget.IconTextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="IconTextView" mobile:iconSrc="@drawable/folder" > </com.xys.widget.IconTextView> </RelativeLayout>