Android学习笔记(十二)--自己来实现CircleImageView

来源:互联网 发布:史上最搞笑的淘宝评价 编辑:程序博客网 时间:2024/05/21 10:40

首先自定义参数

<?xml version="1.0" encoding="utf-8"?><resources>    <declare-styleable name="MyCirCleView">        <attr name="borderRadius"/>        <attr name="type"/>    </declare-styleable>    <attr name="borderRadius" format="dimension"/>    <attr name="type">        <enum name="circle" value="0"/>        <enum name="round" value="1"/>    </attr></resources>

然后就开始我们的自定义View了。原理是利用BItmapShader。

package com.sp.viewtry;import android.content.Context;import android.content.res.TypedArray;import android.graphics.Bitmap;import android.graphics.BitmapShader;import android.graphics.Canvas;import android.graphics.Matrix;import android.graphics.Paint;import android.graphics.RectF;import android.graphics.Shader;import android.graphics.drawable.BitmapDrawable;import android.graphics.drawable.Drawable;import android.util.AttributeSet;import android.util.Log;import android.util.TypedValue;import android.widget.ImageView;/** * Created by Administrator on 2017/2/5. */public class MyCirCleView extends ImageView {    private static final String TAG = "MyCirCleView";    private int type;    private static final int TYPE_CIRCLE=0;    private static final int TYPE_ROUND=1;    private static final int BORDER_RADIUS_DEFAULT=10;    private int mBorderRadius;    private Paint mBitmapPaint;    private int mRadius;    private Matrix mMatrix;    private BitmapShader mBitmapShader;    private int mWidth;    private RectF mRoundRect;    public MyCirCleView(Context context){        super(context);    }    public MyCirCleView(Context context, AttributeSet attributeSet){        this(context,attributeSet,0);        Log.e(TAG, "MyCirCleView: oncreate" );    }    public MyCirCleView(Context context,AttributeSet attributeSet,int defstyle){        super(context,attributeSet,defstyle);        mMatrix=new Matrix();        mBitmapPaint=new Paint();        mBitmapPaint.setAntiAlias(true);        TypedArray array=context.obtainStyledAttributes(attributeSet,R.styleable.MyCirCleView);        mBorderRadius=array.getDimensionPixelSize(R.styleable.MyCirCleView_borderRadius,                (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,BORDER_RADIUS_DEFAULT,                        getResources().getDisplayMetrics()));        type=array.getInt(R.styleable.MyCirCleView_type,TYPE_CIRCLE);        array.recycle();    }    @Override    protected void onMeasure(int WidthmeasureSpec,int HightmeasureSpec){        super.onMeasure(WidthmeasureSpec, HightmeasureSpec);        if (type == TYPE_CIRCLE)        {            mWidth = Math.min(getMeasuredWidth(), getMeasuredHeight());            mRadius = mWidth / 2;            setMeasuredDimension(mWidth, mWidth);        }    }    @Override    protected void onDraw(Canvas canvas){        if (getDrawable()==null){            return;        }        setUpShader();        if (type == TYPE_ROUND)        {            canvas.drawRoundRect(mRoundRect, mBorderRadius, mBorderRadius,                    mBitmapPaint);        } else        {            canvas.drawCircle(mRadius, mRadius, mRadius, mBitmapPaint);        }    }    private void setUpShader(){        Drawable drawable=getDrawable();        if (drawable==null){            return;        }        Bitmap bmp = drawableToBitamp(drawable);        mBitmapShader = new BitmapShader(bmp, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);        float scale = 1.0f;        if (type == TYPE_CIRCLE)        {            int bSize = Math.min(bmp.getWidth(), bmp.getHeight());            scale = mWidth * 1.0f / bSize;        } else if (type == TYPE_ROUND)        {            scale = Math.max(getWidth() * 1.0f / bmp.getWidth(), getHeight()                    * 1.0f / bmp.getHeight());        }        mMatrix.setScale(scale, scale);        mBitmapShader.setLocalMatrix(mMatrix);        mBitmapPaint.setShader(mBitmapShader);    }    private Bitmap drawableToBitamp(Drawable drawable)    {        if (drawable instanceof BitmapDrawable)        {            BitmapDrawable bd = (BitmapDrawable) drawable;            return bd.getBitmap();        }        int w = drawable.getIntrinsicWidth();        int h = drawable.getIntrinsicHeight();        Bitmap bitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);        Canvas canvas = new Canvas(bitmap);        drawable.setBounds(0, 0, w, h);        drawable.draw(canvas);        return bitmap;    }    @Override    protected void onSizeChanged(int w, int h, int oldw, int oldh)    {        super.onSizeChanged(w, h, oldw, oldh);        // 圆角图片的范围        if (type == TYPE_ROUND)            mRoundRect = new RectF(0, 0, getWidth(), getHeight());    }}
1 0
原创粉丝点击