自定义View属性

效果如下:
自定义View属性_第1张图片

思路:选取一张图片,在如图片上上画一个圆。原始图片如下:

代码:继承自View,重写OnDraw方法。

package com.benxun.view;

import com.benxun.R;

import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Bitmap;
import android.graphics.BitmapShader;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Shader.TileMode;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.view.View;

public class CircleImage extends View {
    Bitmap bitmap;
    private Paint mBitmapPaint;

    public CircleImage(Context context) {
        super(context);
    }

    public CircleImage(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        /** *读取属性值 */
        TypedArray array = context.obtainStyledAttributes(attrs,
                R.styleable.CircleImage, defStyle, 0);
        Drawable drawable = array.getDrawable(R.styleable.CircleImage_image);
        array.recycle();
        Init(context, drawable);
    }

    public CircleImage(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }

    /** * @param context * @param drawable */
    private void Init(Context context, Drawable drawable) {

        bitmap = ((BitmapDrawable) drawable).getBitmap();
        BitmapShader bitmapShader = new BitmapShader(bitmap, TileMode.REPEAT,
                TileMode.REPEAT);
        mBitmapPaint = new Paint();
        mBitmapPaint.setColor(Color.BLACK);
        mBitmapPaint.setShader(bitmapShader);
        mBitmapPaint.setAntiAlias(true);
    }

    public void setBitmap(Bitmap bitmap) {
        this.bitmap = bitmap;
        invalidate();
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        // TODO Auto-generated method stub
        //这里需要设置一下View的大小,目前是屏幕大小。
        //setMeasuredDimension(bitmap.getWidth(), bitmap.getHeight());
        //把super注释掉
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        canvas.drawCircle(bitmap.getWidth() / 2, bitmap.getHeight() / 2,
                bitmap.getWidth() / 2, mBitmapPaint);
        super.onDraw(canvas);
    }
}

在布局文件中使用:
需要注意的是 xmlns:luxin=”http://schemas.android.com/apk/res/com.benxun”
这里的luxin可以随便写,这个值在下边 luxin:image=”@drawable/aaa”用到。
/com.benxun是当前的包名

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:luxin="http://schemas.android.com/apk/res/com.benxun" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@color/gray" android:orientation="vertical" >

    <com.benxun.view.CircleImage  android:layout_width="wrap_content" android:layout_height="wrap_content" luxin:image="@drawable/aaa" />

</LinearLayout>

下边是自定义属性:放在res/valuse/attrs.xml

<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android">

    <declare-styleable name="CircleImage"> 

        <attr name="image" format="reference"/> 

    </declare-styleable> 
</resources>

使用:在Activity中直接加载这个布局文件就可以看到效果了。

你可能感兴趣的:(android)