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