Android自定义控件属性的步骤:
1、在res/values/attrs.xml增加属性类型
2、在调用自定义控件的布局文件中,增加名称控件,在自定义控件中设置属性值
3、在自定义控件中读取设置的控件属性值
实例:
第一:在res/values/attrs.xml增加属性类型;
<?xml version="1.0" encoding="utf-8"?>
<!-- 定义属性内容 -->
<resources>
<!-- Z_ImageViewTextLayout控件对应的属性
Z_ImageViewTextLayoutAttr:style名称;通过style时attr名称来确定某一个属性
-->
<declare-styleable name="<span style="color:#ff0000;">Z_ImageViewTextLayoutAttr</span>">
<attr name="imageWidth" format="dimension" />
<attr name="imageHeight" format="dimension" />
<attr name="textBgWidth" format="dimension" />
<attr name="textBgHeight" format="dimension" />
</declare-styleable>
</resources>
<?xml version="1.0" encoding="utf-8"?>
<!--
xmlns:myview="http://schemas.android.com/apk/res/应用程序的包名"
myview为xml名称空间;
为应用程序所在的包名:com.hive
在控件定义中通过名称控件为自定义属性设置值
-->
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:myview="http://schemas.android.com/apk/res/应用程序的包名"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_gravity="center" >
<控件所在的包名.Z_ImageViewTextLayout
android:id="@+id/id_ctrl"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
myview:imageWidth="175dp"
myview:imageHeight="120dp"
myview:textBgWidth="168dp"
myview:textBgHeight="30dp"
/>
</LinearLayout>
第三:在自定义控件中读取设置的控件属性值
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Bitmap;
import android.graphics.BlurMaskFilter;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.RectF;
import android.text.TextUtils;
import android.util.AttributeSet;
import android.view.Gravity;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
/*
* 动态创建控件
*/
public class Z_ImageViewTextLayout extends LinearLayout{
private static final String TAG = Z_ImageViewTextLayout.class.getSimpleName();
private ImageView imageView;
private TextView textView;
private Context context;
private RectF rectf=null;
private Paint paint;
private int color;
private BlurMaskFilter bmf=new BlurMaskFilter(3,BlurMaskFilter.Blur.OUTER);
private int imageWidth;
private int imageHeight;
private int textBgWidht;
private int textBgHeight;
public Z_ImageViewTextLayout(Context context) {
super(context);
this.context=context;
init();
//创建控件
createCtrl();
}
public Z_ImageViewTextLayout(Context context, AttributeSet attrs) {
super(context, attrs);
this.context=context;
init();
//读取属性值
readAttr(attrs);
//创建控件
createCtrl();
}
public void init(){
//设置该函数,否则自定义控件不会执行onDraw函数
setWillNotDraw(false);
//设置画笔颜色
color = Color.WHITE;
paint = new Paint();
paint.setColor(color);
//设置绘制图形的透明度
paint.setAlpha(100);
//设置paint的风格为空心;Paint.Style.FILL为实心
paint.setStyle(Paint.Style.STROKE);
//设置空心的外框的宽度
paint.setStrokeWidth(10);
// 设置是否使用抗锯齿功能,会消耗较大资源,绘制图形速度会变慢
paint.setAntiAlias(true);
//设定是否使用图像抖动处理,会使绘制出来的图片颜色更加平滑和饱满,图像更加清晰
paint.setDither(true);
//可以用不同的MaskFilter实现滤镜的效果,如滤化,立体
paint.setMaskFilter(bmf);
}
//读取属性值
private void readAttr(AttributeSet attrs){
//通过在属性文件中定义的名称,从attrs中获取具体的值
TypedArray myAttr = context.obtainStyledAttributes(attrs,styleable.Z_ImageViewTextLayoutAttr);
//读到值时对应的px,如果设置为dp,则会根据当前的设置转化为px,取出的值为对应的px
imageWidth = myAttr.getDimensionPixelSize(R.styleable.Z_ImageViewTextLayoutAttr_imageWidth, 170);
imageHeight = myAttr.getDimensionPixelSize(R.styleable.Z_ImageViewTextLayoutAttr_imageHeight, 110);
textBgWidht = myAttr.getDimensionPixelSize(R.styleable.Z_ImageViewTextLayoutAttr_textBgWidth, 160);
textBgHeight = myAttr.getDimensionPixelSize(R.styleable.Z_ImageViewTextLayoutAttr_textBgHeight, 20);
myAttr.recycle();
}
//调用super.onDraw(canvas)时,先调用各子控件的onDraw,然后执行该函数的super.onDraw(canvas);之后的部分
protected void onDraw(Canvas canvas) {
// TODO Auto-generated method stub
super.onDraw(canvas);
drawUseRect(canvas);
}
//绘制边框;使用矩形绘制
public void drawUseRect(Canvas canvas){
//画边框,放在构造函数中,this.getWidth()获得的值为0
if(rectf==null){
rectf=new RectF(0,0,this.getWidth(),this.getHeight());
}
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 createCtrl(){
imageView = new ImageView(context);
textView = new TextView(context);
//设置整个布局的位置
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.FILL_PARENT,
LinearLayout.LayoutParams.FILL_PARENT);
setLayoutParams(params);
setOrientation(VERTICAL);
setGravity(Gravity.CENTER_HORIZONTAL);
//设置控件的布局
params = new LinearLayout.LayoutParams(imageWidth,imageHeight);
params.setMargins(20, 20, 20, 0);
params.gravity=Gravity.CENTER;
imageView.setLayoutParams(params);
addView(imageView);
params= new LinearLayout.LayoutParams(textBgWidht,textBgHeight);
//控件相对于布局的位置
params.setMargins(0, 20, 0, 0);
textView.setTextSize(12);
textView.setLayoutParams(params);
//设置控件在params所在的布局中居中
textView.setGravity(Gravity.CENTER);
//设置内容距离布局的位置
textView.setPadding(20, 0, 20, 0);
textView.setSingleLine(true);
textView.setEllipsize(TextUtils.TruncateAt.valueOf("MARQUEE"));
textView.setMarqueeRepeatLimit(-1);
addView(textView);
}
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;
}
}
其他:Paint类介绍
//
/**
* Paint类介绍
* Paint即画笔,在绘图过程中起到了极其重要的作用,画笔主要保存了颜色,
* 样式等绘制信息,指定了如何绘制文本和图形,画笔对象有很多设置方法,
* 大体上可以分为两类,一类与图形绘制相关,一类与文本绘制相关。
* 1.图形绘制
* setARGB(int a,int r,int g,int b);
* 设置绘制的颜色,a代表透明度,r,g,b代表颜色值。
*
* setAlpha(int a);
* 设置绘制图形的透明度。
*
* setColor(int color);
* 设置绘制的颜色,使用颜色值来表示,该颜色值包括透明度和RGB颜色。
*
* setAntiAlias(boolean aa);
* 设置是否使用抗锯齿功能,会消耗较大资源,绘制图形速度会变慢。
*
* setDither(boolean dither);
* 设定是否使用图像抖动处理,会使绘制出来的图片颜色更加平滑和饱满,图像更加清晰
*
* setFilterBitmap(boolean filter);
* 如果该项设置为true,则图像在动画进行中会滤掉对Bitmap图像的优化操作,加快显示
* 速度,本设置项依赖于dither和xfermode的设置
*
* setMaskFilter(MaskFilter maskfilter);
* 设置MaskFilter,可以用不同的MaskFilter实现滤镜的效果,如滤化,立体等 *
* setColorFilter(ColorFilter colorfilter);
* 设置颜色过滤器,可以在绘制颜色时实现不用颜色的变换效果
*
* setPathEffect(PathEffect effect);
* 设置绘制路径的效果,如点画线等
*
* setShader(Shader shader);
* 设置图像效果,使用Shader可以绘制出各种渐变效果
*
* setShadowLayer(float radius ,float dx,float dy,int color);
* 在图形下面设置阴影层,产生阴影效果,radius为阴影的角度,dx和dy为阴影在x轴和y轴上的距离,color为阴影的颜色
*
* setStyle(Paint.Style style);
* 设置画笔的样式,为FILL,FILL_OR_STROKE,或STROKE
*
* setStrokeCap(Paint.Cap cap);
* 当画笔样式为STROKE或FILL_OR_STROKE时,设置笔刷的图形样式,如圆形样式
* Cap.ROUND,或方形样式Cap.SQUARE
*
* setSrokeJoin(Paint.Join join);
* 设置绘制时各图形的结合方式,如平滑效果等
*
* setStrokeWidth(float width);
* 当画笔样式为STROKE或FILL_OR_STROKE时,设置笔刷的粗细度
*
* setXfermode(Xfermode xfermode);
* 设置图形重叠时的处理方式,如合并,取交集或并集,经常用来制作橡皮的擦除效果
*
* 2.文本绘制
* setFakeBoldText(boolean fakeBoldText);
* 模拟实现粗体文字,设置在小字体上效果会非常差
*
* setSubpixelText(boolean subpixelText);
* 设置该项为true,将有助于文本在LCD屏幕上的显示效果
*
* setTextAlign(Paint.Align align);
* 设置绘制文字的对齐方向
*
* setTextScaleX(float scaleX);
* 设置绘制文字x轴的缩放比例,可以实现文字的拉伸的效果
*
* setTextSize(float textSize);
* 设置绘制文字的字号大小
*
* setTextSkewX(float skewX);
* 设置斜体文字,skewX为倾斜弧度
*
* setTypeface(Typeface typeface);
* 设置Typeface对象,即字体风格,包括粗体,斜体以及衬线体,非衬线体等
*
* setUnderlineText(boolean underlineText);
* 设置带有下划线的文字效果
*
* setStrikeThruText(boolean strikeThruText);
* 设置带有删除线的效果
*
*/