来源整理:http://www.cnblogs.com/tiantianbyconan/archive/2012/06/06/2538528.html
Android自定义属性,format详解
reference:参考某一资源ID。
(1)属性定义:
<declare-styleable name = "名称"> <attr name = "background" format = "reference" /> </declare-styleable>
(2)属性使用:
<ImageView android:layout_width = "42dip" android:layout_height = "42dip" android:background = "@drawable/图片ID" />
color:颜色值。
(1)属性定义:
<declare-styleable name = "名称"> <attr name = "textColor" format = "color" /> </declare-styleable>
(2)属性使用:
<TextView android:layout_width = "42dip" android:layout_height = "42dip" android:textColor = "#00FF00" />
boolean:布尔值。
(1)属性定义:
<declare-styleable name = "名称"> <attr name = "focusable" format = "boolean" /> </declare-styleable>
(2)属性使用:
<Button android:layout_width = "42dip" android:layout_height = "42dip" android:focusable = "true" />
dimension:尺寸值。
(1)属性定义:
<declare-styleable name = "名称"> <attr name = "layout_width" format = "dimension" /> </declare-styleable>
(2)属性使用:
<Button android:layout_width = "42dip" android:layout_height = "42dip" />
float:浮点值。
(1)属性定义:
<declare-styleable name = "AlphaAnimation"> <attr name = "fromAlpha" format = "float" /> <attr name = "toAlpha" format = "float" /> </declare-styleable>
(2)属性使用:
<alpha android:fromAlpha = "1.0" android:toAlpha = "0.7" />
integer:整型值。
(1)属性定义:
<declare-styleable name = "AnimatedRotateDrawable"> <attr name = "visible" /> <attr name = "frameDuration" format="integer" /> <attr name = "framesCount" format="integer" /> <attr name = "pivotX" /> <attr name = "pivotY" /> <attr name = "drawable" /> </declare-styleable>
(2)属性使用:
<animated-rotate xmlns:android = "http://schemas.android.com/apk/res/android" android:drawable = "@drawable/图片ID" android:pivotX = "50%" android:pivotY = "50%" android:framesCount = "12" android:frameDuration = "100" />
string:字符串。
(1)属性定义:
<declare-styleable name = "MapView"> <attr name = "apiKey" format = "string" /> </declare-styleable>
(2)属性使用:
<com.google.android.maps.MapView android:layout_width = "fill_parent" android:layout_height = "fill_parent" android:apiKey = "0jOkQ80oD1JL9C6HAja99uGXCRiS2CGjKO_bc_g" />
fraction:百分数。
(1)属性定义:
<declare-styleable name="RotateDrawable"> <attr name = "visible" /> <attr name = "fromDegrees" format = "float" /> <attr name = "toDegrees" format = "float" /> <attr name = "pivotX" format = "fraction" /> <attr name = "pivotY" format = "fraction" /> <attr name = "drawable" /> </declare-styleable>
(2)属性使用:
<rotate xmlns:android = "http://schemas.android.com/apk/res/android"
android:interpolator = “@anim/动画ID”
android:fromDegrees = "0"
android:toDegrees = “360”
android:pivotX = "200%" android:pivotY = "300%"
android:duration = “5000”
android:repeatMode = "restart" android:repeatCount = "infinite" />
enum:枚举值。
(1)属性定义:
<declare-styleable name="名称"> <attr name="orientation"> <enum name="horizontal" value="0" /> <enum name="vertical" value="1" /> </attr> </declare-styleable>
(2)属性使用:
<LinearLayout xmlns:android = "http://schemas.android.com/apk/res/android" android:orientation = "vertical" android:layout_width = "fill_parent" android:layout_height = "fill_parent" > </LinearLayout>
flag:位或运算。
(1)属性定义:
<declare-styleable name="名称"> <attr name="windowSoftInputMode"> <flag name = "stateUnspecified" value = "0" /> <flag name = "stateUnchanged" value = "1" /> <flag name = "stateHidden" value = "2" /> <flag name = "stateAlwaysHidden" value = "3" /> <flag name = "stateVisible" value = "4" /> <flag name = "stateAlwaysVisible" value = "5" /> <flag name = "adjustUnspecified" value = "0x00" /> <flag name = "adjustResize" value = "0x10" /> <flag name = "adjustPan" value = "0x20" /> <flag name = "adjustNothing" value = "0x30" /> </attr> </declare-styleable>
(2)属性使用:
<activity android:name = ".StyleAndThemeActivity" android:label = "@string/app_name" android:windowSoftInputMode = "stateUnspecified | stateUnchanged | stateHidden"> <intent-filter> <action android:name = "android.intent.action.MAIN" /> <category android:name = "android.intent.category.LAUNCHER" /> </intent-filter> </activity>
注意:
属性定义时可以指定多种类型值。
(1)属性定义:
<declare-styleable name = "名称"> <attr name = "background" format = "reference|color" /> </declare-styleable>
(2)属性使用:
<ImageView android:layout_width = "42dip" android:layout_height = "42dip" android:background = "@drawable/图片ID|#00FF00" />
转摘http://blog.csdn.net/lmj623565791/article/details/24300125
在values文件下创建一个attrs.xml文件
<?xml version="1.0" encoding="utf-8"?>
<resources>
<attr name="CustomtitText" format="string"/>
<attr name="CustomtitTextColor" format="color"/>
<attr name="CustomtitTextSize" format="dimension"/>
<attr name="image" format="reference"/>
<attr name="imageScaleType" >
<enum name="fillXY" value="0"/>
<enum name="center" value="1"/>
</attr>
<declare-styleable name="CustomImageView">
<attr name="CustomtitText" />
<attr name="CustomtitTextColor" />
<attr name="CustomtitTextSize" />
<attr name="image"/>
<attr name="imageScaleType"/>
</declare-styleable>
</resources>
自定义的View
分三步:解析属性,测量,画图
public class CustomImageView extends View {
private static final int IMAGE_SCALE_FITXY = 0;
private Bitmap mImage;
private int mTextColor;
private int mTextSize;
private String mTitle;
private int mImageScale;
private Rect mTextBound;
private Paint mPaint;
private int mWidth;
private int mHeight;
private Rect rect;
public CustomImageView(Context context) {
this(context,null);
}
public CustomImageView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
initView(context,attrs,defStyleAttr);
}
/**
* 初始化的各种属性
* @param context
* @param attrs
* @param defStyleAttr
*/
private void initView(Context context, AttributeSet attrs, int defStyleAttr) {
TypedArray typedArray = context.getTheme().obtainStyledAttributes(attrs,R.styleable.CustomImageView,defStyleAttr,0);
int indexCount = typedArray.getIndexCount();
for (int i = 0; i < indexCount; i++) {
int index = typedArray.getIndex(i);
switch (index){
case R.styleable.CustomImageView_image:
mImage = BitmapFactory.decodeResource(getResources(), typedArray.getResourceId(index, 0));
break;
case R.styleable.CustomImageView_imageScaleType:
mImageScale = typedArray.getInt(index, 0);
break;
case R.styleable.CustomImageView_CustomtitText:
mTitle = typedArray.getString(index);
break;
case R.styleable.CustomImageView_CustomtitTextSize:
mTextSize = typedArray.getDimensionPixelSize(index, (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, 16, getResources().getDisplayMetrics()));
break;
case R.styleable.CustomImageView_CustomtitTextColor:
mTextColor = typedArray.getColor(index, Color.BLACK);
break;
}
}
typedArray.recycle();
rect = new Rect();
mPaint = new Paint();
mTextBound = new Rect();
mPaint.setTextSize(mTextSize);
//计算描绘字体需要的范围
mPaint.getTextBounds(mTitle,0,mTitle.length(),mTextBound);
}
public CustomImageView(Context context, AttributeSet attrs) {
this(context, attrs,0);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int widthMode = MeasureSpec.getMode(widthMeasureSpec);
int widthSize = MeasureSpec.getSize(widthMeasureSpec);
int heightMode = MeasureSpec.getMode(heightMeasureSpec);
int heightSize = MeasureSpec.getSize(heightMeasureSpec);
//判断测量
if(widthMode == MeasureSpec.EXACTLY){
widthMeasureSpec = widthSize;
}else {
//由图片决定宽
int desireByImage = getPaddingRight() + getPaddingLeft() + mImage.getWidth();
//由字体决定宽
int desireByTitle = getPaddingLeft() + getPaddingRight() + mTextBound.width();
if (widthMode == MeasureSpec.AT_MOST) {
int desire = Math.max(desireByImage, desireByTitle);
widthMeasureSpec = Math.min(desire, widthSize);
}
}
if(heightMode == MeasureSpec.EXACTLY){
heightMeasureSpec = heightSize;
}else{
int disire = getPaddingTop() + getPaddingBottom() + mImage.getHeight() +mTextBound.height();
if(heightMode == MeasureSpec.AT_MOST){
heightMeasureSpec = Math.min(disire,heightSize);
}
}
mWidth = widthMeasureSpec;
mHeight = heightMeasureSpec;
setMeasuredDimension(widthMeasureSpec,heightMeasureSpec);
}
@Override
protected void onDraw(Canvas canvas) {
mPaint.setStrokeWidth(4);
mPaint.setStyle(Paint.Style.STROKE);
mPaint.setColor(Color.CYAN);
canvas.drawRect(0,0,getMeasuredWidth(),getMeasuredHeight(),mPaint);
rect.left = getPaddingLeft();
rect.right =mWidth -getPaddingRight();
rect.top = getPaddingTop();
rect.bottom = getPaddingBottom();
mPaint.setColor(mTextColor);
mPaint.setStyle(Paint.Style.FILL);
/**当前设置的宽度小于字体需要的宽度,将字体改为小号**/
if(mTextBound.width()>mWidth){
TextPaint paint = new TextPaint(mPaint);
String msg = TextUtils.ellipsize(mTitle, paint, (float) mWidth - getPaddingLeft() - getPaddingRight(), TextUtils.TruncateAt.END).toString();
canvas.drawText(msg,getPaddingLeft(),mHeight-getPaddingTop(),mPaint);
}else {
canvas.drawText(mTitle,mWidth/2-mTextBound.width()*1.0f/2,mHeight-getPaddingBottom(),mPaint);
}
rect.bottom -= mTextBound.height();
if(mImageScale ==IMAGE_SCALE_FITXY ){
canvas.drawBitmap(mImage,null,rect,mPaint);
}else {//计算居中的矩形范围
rect.left = mWidth/2-mImage.getWidth()/2;
rect.right = mWidth/2 + mImage.getWidth()/2;
rect.top = (mHeight - mTextBound.height())/2-mImage.getHeight()/2;
rect.bottom = (mHeight - mTextBound.height())/2+mImage.getHeight()/2;
canvas.drawBitmap(mImage,null,rect,mPaint);
}
}
}
布局自定义View
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:zhy="http://schemas.android.com/apk/res-auto"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<com.example.administrator.testapplication.CustomImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="10dp"
android:padding="10dp"
zhy:image="@mipmap/ic_launcher"
zhy:imageScaleType="center"
zhy:CustomtitText="hello andorid ! "
zhy:CustomtitTextColor="#ff0000"
zhy:CustomtitTextSize="30sp" />
<com.example.administrator.testapplication.CustomImageView
android:layout_width="100dp"
android:layout_height="wrap_content"
android:layout_margin="10dp"
android:padding="10dp"
zhy:image="@mipmap/ic_launcher"
zhy:imageScaleType="center"
zhy:CustomtitText="helloworldwelcome"
zhy:CustomtitTextColor="#00ff00"
zhy:CustomtitTextSize="20sp" />
<com.example.administrator.testapplication.CustomImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="10dp"
android:padding="10dp"
zhy:image="@mipmap/b"
zhy:imageScaleType="center"
zhy:CustomtitText="风景~"
zhy:CustomtitTextColor="#ff0000"
zhy:CustomtitTextSize="12sp" />
>
</LinearLayout>