Android使用xml文件自定义控件

1、控件的布局使用xml文件静态指定

2、示例如下:

     第一:控件布局:imageviewtext_layout.xml

    

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 
	xmlns:android="http://schemas.android.com/apk/res/android"
	android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:orientation="vertical">
    
   	<!-- 图片 -->
   	<ImageView
   	    android:id="@+id/id_imageview"
   	    android:layout_width="130dp"
   	    android:layout_height="180dp"
   	    android:layout_marginTop="10dp"
   	    android:layout_marginBottom="10dp"
   	    android:background="@drawable/loading"/>

    <!-- 文本 -->
	<TextView
	 	android:id="@+id/id_text"
 	    android:layout_width="130dp"
 	    android:layout_height="20dp"
 	    android:layout_marginTop="10dp"
 	    android:layout_marginBottom="10dp"
 	    android:gravity="center"
 	    android:text="文本"
 	    android:textColor="#FFFFFF"/>

</LinearLayout>

第二:控件文件

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BlurMaskFilter;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.PorterDuff;
import android.graphics.PorterDuffXfermode;
import android.graphics.Rect;
import android.graphics.RectF;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnFocusChangeListener;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;


/*
 * 图片文本垂直布局
 */
public class ImageViewTextLayout extends LinearLayout implements OnFocusChangeListener{
	private static final String TAG = ImageViewTextLayout.class.getSimpleName();
	
	private ImageView imageView;
	private TextView textView;
	
	private Context context;
	private RectF rectf=null;
	//获得焦点后的回调接口
	private CallbackOnFocusChangeListener onFocus=null;
	
	private static Paint paint=new Paint();
	private static Paint paint_outer=new Paint();
	private static BlurMaskFilter bmf=new BlurMaskFilter(3,BlurMaskFilter.Blur.OUTER);
	private static BlurMaskFilter bmf_outer=new BlurMaskFilter(1,BlurMaskFilter.Blur.INNER);
	private static int color;
	
	//是否选中
	private boolean isSelect;
	
	//边框的宽度
	private int borderWidth = 10;
	private int tmpColor=Color.parseColor("#000000");


	public ImageViewTextLayout(Context context) {
		super(context);
		this.context=context;
		init();
		//创建控件
		createCtrl();
	}
	public ImageViewTextLayout(Context context, AttributeSet attrs) {
		super(context, attrs);
		this.context=context;
		init();
		//创建控件
		createCtrl();
	}
	
	public void init(){
		//设置该函数,否则自定义控件不会执行onDraw函数
		setWillNotDraw(false);

		color=Color.WHITE;
		this.setOnFocusChangeListener(this);
		paint.setColor(color);
		paint.setAntiAlias(true);//设置Paint为无锯齿
		paint.setAlpha(100);
		paint.setStyle(Paint.Style.STROKE);//设置paint的风格为空心
		paint.setStrokeWidth(borderWidth);//设置空心的外框的宽度
		paint.setDither(true);//平滑
		paint.setMaskFilter(bmf);//模糊

		paint_outer.setAntiAlias(true);
		paint_outer.setColor(Color.parseColor("#F4B301"));
		paint_outer.setStyle(Paint.Style.STROKE);
		paint_outer.setStrokeWidth(borderWidth);
		paint_outer.setAlpha(150);
		paint_outer.setDither(true);
		paint_outer.setMaskFilter(bmf_outer);
	}

	//调用super.onDraw(canvas)时,先调用各子控件的onDraw,然后执行该函数的super.onDraw(canvas);之后的部分
	protected void onDraw(Canvas canvas) {
    	super.onDraw(canvas);
    	drawUseRect(canvas);
	}
    
	

	//绘制边框;使用矩形绘制
	public void drawUseRect(Canvas canvas){
		//画边框,放在构造函数中,this.getWidth()获得的值为0
		if(rectf==null){
			//只显示图片
			if(View.GONE == textView.getVisibility()){
				int width = this.getWidth();
				int height = this.getHeight();
				//居中显示,所有偏移起始位置为offset/2
				int offset = width-imageView.getWidth();
				rectf=new RectF(offset/2,10,offset/2+imageView.getWidth(),imageView.getHeight()+20);
			}
			else{
				rectf=new RectF(0,0,this.getWidth(),this.getHeight());
			}
		}
		
		//paint_outer.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_OVER));
		
		//画边框
		if(isSelect){
			paint.setColor(tmpColor);
			canvas.drawRoundRect(rectf,8,5,paint);//第二个参数是x半径,第三个参数是y半径
			paint.setColor(color);
			canvas.drawRoundRect(rectf,8,5,paint);//第二个参数是x半径,第三个参数是y半径
		}
		
	}

	public void setImageVisiblity(int visibility){
		imageView.setVisibility(visibility);
	}
	
	public void setTextVisiblity(int visibility){
		textView.setVisibility(visibility);
	}
	
	//设置内容
	public void setImageBitmap(Bitmap bitmap){
		imageView.setImageBitmap(bitmap);
	}
	
	public void setImageByResId(int resId){
		imageView.setBackgroundResource(resId);
	}
		
	public void setTitle(String title){
		textView.setText(title);
	}
	
	public void setTitleSize(int size){
		textView.setTextSize(size);
	}
	
	public void setTitleColor(int color){
		textView.setTextColor(color);
	}
	
	
	public void setNelOnFocusChange(CallbackOnFocusChangeListener focus){
		this.onFocus=focus;
	}
	
	@Override
	public void onFocusChange(View v, boolean hasFocus) {
		this.invalidate();
		if(onFocus!=null){
			onFocus.onFocusChange(v, hasFocus);
		}
	}

	//创建控件
	public void createCtrl(){
		LayoutInflater inflater = LayoutInflater.from(context);
		//如果第二个参数ViewGroup root为null,则会导致控件不能绘制出来
		//View view = inflater.inflate(R.layout.imageviewtext_layout,null);
		View view = inflater.inflate(R.layout.imageviewtext_layout,this);
		imageView = (ImageView)view.findViewById(R.id.id_imageview);
		textView = (TextView)view.findViewById(R.id.id_text);
	}
	
	
	public boolean isSelect() {
		return isSelect;
	}
	public void setSelect(boolean isSelect) {
		this.isSelect = isSelect;
	}
	public ImageView getImageView() {
		return imageView;
	}
	public void setImageView(ImageView imageView) {
		this.imageView = imageView;
	}
	public TextView getTextView() {
		return textView;
	}
	public void setTextView(TextView textView) {
		this.textView = textView;
	}
}




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值