Android自定义View以及自定义属性中format详解

来源整理:http://www.cnblogs.com/tiantianbyconan/archive/2012/06/06/2538528.html
Android自定义属性,format详解

  1. 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"
    
                 />
    
  2. 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"
    
                 />
    
  3. 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"
    
                />
    
  4. dimension:尺寸值。

    (1)属性定义:

        <declare-styleable name = "名称">
    
               <attr name = "layout_width" format = "dimension" />
    
        </declare-styleable>
    

    (2)属性使用:

        <Button
    
                android:layout_width = "42dip"
                android:layout_height = "42dip"
    
                />
    
  5. 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"
    
               />
    
  6. 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"
    
               />
    
  7. 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"
    
                />
    
  8. 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"
    
               />
    
  9. 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>
    
  10. 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>

这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值