Android定制控件:带图标的TextView和可编辑文本框(附项目源码)

各位朋友,博主向大家问好啦!

初次见面,多多关照。

博主正在学习移动开发,今天老师教授的是定制控件:带图标的TextView,

然后课后依葫芦画瓢,博主定制了一个带图标的可编辑文本框,其实原理都一样!

博主觉得该课题具有可鉴意义,特此分享给大家,帮助入门级开发人员,大虾别见笑。

注意:以下项目在创建时没有勾选activity,是一个空白项目

好啦,先来张效果图演示吧:

Android定制控件:带图标的TextView和可编辑文本框(附项目源码)_第1张图片

项目结构图:

Android定制控件:带图标的TextView和可编辑文本框(附项目源码)_第2张图片

一、在src目录下创建一个类,用来编写控件代码(博主的是IconTextView.java)

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);
	}
}

二、在当前项目res/layout下新建一个线性布局视图(博主的是icontvxml.xml)

注意命名空间的位置,需要添加一个自己的命名空间,否则无法完成自定义控件



    

        
    
        

三、创建一个activity,即创建一个类来继承Activity,用来加载和显示视图效果(博主的是activityIconT)

注意:R类一定到导入正确,必须是当前项目下的R类,否则无法完成自定义控件

package com.demo.widgets;

import com.demo.ch04_icontextview.R;

import android.app.Activity;
import android.os.Bundle;
import android.widget.LinearLayout;

public class activityIconT extends Activity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		//
		LinearLayout ilayout=(LinearLayout) getLayoutInflater().inflate(R.layout.icontvxml, null);
		setContentView(ilayout);
	}

	@Override
	protected void onDestroy() {
		// TODO Auto-generated method stub
		super.onDestroy();
	}

	@Override
	protected void onPause() {
		// TODO Auto-generated method stub
		super.onPause();
	}

	@Override
	protected void onRestart() {
		// TODO Auto-generated method stub
		super.onRestart();
	}

	@Override
	protected void onResume() {
		// TODO Auto-generated method stub
		super.onResume();
	}

	@Override
	protected void onStart() {
		// TODO Auto-generated method stub
		super.onStart();
	}

	@Override
	protected void onStop() {
		// TODO Auto-generated method stub
		super.onStop();
	}

}
最后,在AndroidManifest.xml中,添加启动代码




    

    
        
            
                
                
            
        
    

这样便完成了定制控件的项目需求了,另外如果需要设置颜色值得话,需要在res/values下创建一个color.xml用来保存颜色值源以方便视图调用,代码如下:

 
 
#FFFFFF 
#FFFFF0 
#FFFFE0 
#FFFF00 
#FFFAFA 
#FFFAF0 
#FFFACD 
#FFF8DC 
#FFF5EE 
#FFF0F5 
#FFEFD5 
#FFEBCD 
#FFE4E1 
#FFE4C4 
#FFE4B5 
#FFDEAD 
#FFDAB9 
#FFD700 
#FFC0CB 
#FFB6C1 
#FFA500 
#FFA07A 
#FF8C00 
#FF7F50 
#FF69B4 
#FF6347 
#FF4500 
#FF1493 
#FF00FF 
#FF00FF 
#FF0000 
#FDF5E6 
#FAFAD2 
#FAF0E6 
#FAEBD7 
#FA8072 
#F8F8FF 
#F5FFFA 
#F5F5F5 
#F5F5DC 
#F5DEB3 
#F4A460 
#F0FFFF 
#F0FFF0 
#F0F8FF 
#F0E68C 
#F08080 
#EEE8AA 
#EE82EE 
#E9967A 
#E6E6FA 
#E0FFFF 
#DEB887 
#DDA0DD 
#DCDCDC 
#DC143C 
#DB7093 
#DAA520 
#DA70D6 
#D8BFD8 
#D3D3D3 
#D3D3D3 
#D2B48C 
#D2691E 
#CD853F 
#CD5C5C 
#C71585 
#C0C0C0 
#BDB76B 
#BC8F8F 
#BA55D3 
#B8860B 
#B22222 
#B0E0E6 
#B0C4DE 
#AFEEEE 
#ADFF2F 
#ADD8E6 
#A9A9A9 
#A9A9A9 
#A52A2A 
#A0522D 
#9932CC 
#98FB98 
#9400D3 
#9370DB 
#90EE90 
#8FBC8F 
#8B4513 
#8B008B 
#8B0000 
#8A2BE2 
#87CEFA 
#87CEEB 
#808080 
#808080 
#808000 
#800080 
#800000 
#7FFFD4 
#7FFF00 
#7CFC00 
#7B68EE 
#778899 
#778899 
#708090 
#708090 
#6B8E23 
#6A5ACD 
#696969 
#696969 
#66CDAA 
#6495ED 
#5F9EA0 
#556B2F 
#4B0082 
#48D1CC 
#483D8B 
#4682B4 
#4169E1 
#40E0D0 
#3CB371 
#32CD32 
#2F4F4F 
#2F4F4F 
#2E8B57 
#228B22 
#20B2AA 
#1E90FF 
#191970 
#00FFFF 
#00FFFF 
#00FF7F 
#00FF00 
#00FA9A 
#00CED1 
#00BFFF 
#008B8B 
#008080 
#008000 
#006400 
#0000FF 
#0000CD 
#00008B 
#000080 
#000000 

项目源码下载:点击打开链接

你可能感兴趣的:(Android)