CircularImageView 一 自定义圆形图片组件。

来源:互联网 发布:朽木充栋梁 网络剧 编辑:程序博客网 时间:2024/06/06 01:40

1、第一步,添加CircularImageView,如下图所示。




package com.example.administrator.myapplication;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.PixelFormat;import android.graphics.Shader;import android.graphics.drawable.BitmapDrawable;import android.graphics.drawable.Drawable;import android.util.AttributeSet;import android.widget.ImageView;import com.lidroid.xutils.bitmap.core.AsyncDrawable;public class CircularImageView extends ImageView {    private int borderWidth;    private int canvasSize;    private Bitmap image;    private Paint paint;    private Paint paintBorder;    public CircularImageView(final Context context) {        this(context, null);    }    public CircularImageView(Context context, AttributeSet attrs) {        this(context, attrs, R.attr.circularImageViewStyle);    }    public CircularImageView(Context context, AttributeSet attrs, int defStyle) {        super(context, attrs, defStyle);        // init paint        paint = new Paint();        paint.setAntiAlias(true);        paintBorder = new Paint();        paintBorder.setAntiAlias(true);        // load the styled attributes and set their properties        TypedArray attributes = context.obtainStyledAttributes(attrs, R.styleable.CircularImageView, defStyle, 0);        if (attributes.getBoolean(R.styleable.CircularImageView_border, true)) {//int defaultBorderSize = (int) (4 * getContext().getResources().getDisplayMetrics().density + 0.5f);            int defaultBorderSize = (int) (2 * getContext().getResources().getDisplayMetrics().density);            setBorderWidth(0);            setBorderColor(attributes.getColor(R.styleable.CircularImageView_border_color, Color.WHITE));        }        if (attributes.getBoolean(R.styleable.CircularImageView_shadow, false))            addShadow();    }    public void setBorderWidth(int borderWidth) {        this.borderWidth = borderWidth;        this.requestLayout();        this.invalidate();    }    public void setBorderColor(int borderColor) {        if (paintBorder != null)            paintBorder.setColor(borderColor);        this.invalidate();    }    public void addShadow() {        setLayerType(LAYER_TYPE_SOFTWARE, paintBorder);        paintBorder.setShadowLayer(4.0f, 0.0f, 2.0f, Color.BLACK);    }    @Override    public void onDraw(Canvas canvas) {        // load the bitmap        if (this.getDrawable() instanceof AsyncDrawable) {   //         LogGloble.d("info", "draw  AsyncDrawable  ");            Drawable drawable = this.getDrawable();            if (drawable.getIntrinsicWidth() > 0) {                image = Bitmap                        .createBitmap(                                drawable.getIntrinsicWidth(),                                drawable.getIntrinsicHeight(),                                drawable.getOpacity() != PixelFormat.OPAQUE ? Bitmap.Config.ARGB_8888                                        : Bitmap.Config.RGB_565);                Canvas canvas1 = new Canvas(image);                // canvas.setBitmap(bitmap);            //    LogGloble.d("info", "drawable.getIntrinsicWidth()===  " + drawable.getIntrinsicWidth());                drawable.setBounds(0, 0, drawable.getIntrinsicWidth(),                        drawable.getIntrinsicHeight());                drawable.draw(canvas1);            }        } else {        //    LogGloble.d("info", "draw  else  ");            image = drawableToBitmap(getDrawable());            // init shader            if (image != null) {                canvasSize = getMeasuredWidth();//                if (canvas.getHeight() < canvasSize)//                    canvasSize = canvas.getHeight();                BitmapShader shader = new BitmapShader(Bitmap.createScaledBitmap(image, canvasSize, canvasSize, false), Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);                paint.setShader(shader);             //   LogGloble.d("info", "canvasSize =  " + canvasSize + "  canvas.getHeight() " + canvas.getHeight());                // circleCenter is the x or y of the view's center                // radius is the radius in pixels of the cirle to be drawn                // paint contains the shader that will texture the shape                int circleCenter = (canvasSize - (borderWidth * 2)) / 2;                canvas.drawCircle(circleCenter + borderWidth, circleCenter + borderWidth, ((canvasSize - (borderWidth * 2)) / 2) + borderWidth - 2.0f, paintBorder);                canvas.drawCircle(circleCenter + borderWidth, circleCenter + borderWidth, ((canvasSize - (borderWidth * 2)) / 2) - 2.0f, paint);            }        }    }    @Override    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {        int width = measureWidth(widthMeasureSpec);        int height = measureHeight(heightMeasureSpec);        setMeasuredDimension(width, height);    }    private int measureWidth(int measureSpec) {        int result = 0;        int specMode = MeasureSpec.getMode(measureSpec);        int specSize = MeasureSpec.getSize(measureSpec);        if (specMode == MeasureSpec.EXACTLY) {            // The parent has determined an exact size for the child.            result = specSize;        } else if (specMode == MeasureSpec.AT_MOST) {            // The child can be as large as it wants up to the specified size.            result = specSize;        } else {            // The parent has not imposed any constraint on the child.            result = canvasSize;        }        return result;    }    private int measureHeight(int measureSpecHeight) {        int result = 0;        int specMode = MeasureSpec.getMode(measureSpecHeight);        int specSize = MeasureSpec.getSize(measureSpecHeight);        if (specMode == MeasureSpec.EXACTLY) {            // We were told how big to be            result = specSize;        } else if (specMode == MeasureSpec.AT_MOST) {            // The child can be as large as it wants up to the specified size.            result = specSize;        } else {            // Measure the text (beware: ascent is a negative number)            result = canvasSize;        }        return (result + 2);    }    public Bitmap drawableToBitmap(Drawable drawable) {        if (drawable == null) {            return null;        } else if (drawable instanceof BitmapDrawable) {            return ((BitmapDrawable) drawable).getBitmap();        }        Bitmap bitmap = Bitmap.createBitmap(drawable.getIntrinsicWidth(),                drawable.getIntrinsicHeight(), Bitmap.Config.ARGB_8888);        Canvas canvas = new Canvas(bitmap);        drawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight());        drawable.draw(canvas);        return bitmap;    }}

2、第二步,往values里面添加attrs.xml,如下图所示。



<?xml version="1.0" encoding="utf-8"?><resources>    <declare-styleable name="CircularImageView">        <attr name="border" format="boolean"></attr>        <attr name="border_width" format="dimension"></attr>        <attr name="border_color" format="color"></attr>        <attr name="shadow" format="boolean"></attr>    </declare-styleable>    <declare-styleable name="Theme">        <attr name="circularImageViewStyle" format="reference"></attr>    </declare-styleable></resources>

3、第三步,如下图所示。




<?xml version="1.0" encoding="utf-8"?><RelativeLayout    xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:paddingBottom="@dimen/activity_vertical_margin"    android:paddingLeft="@dimen/activity_horizontal_margin"    android:paddingRight="@dimen/activity_horizontal_margin"    android:paddingTop="@dimen/activity_vertical_margin"    tools:context="com.example.administrator.myapplication.MainActivity">    <com.example.administrator.myapplication.CircularImageView        android:id="@+id/mciv"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        /></RelativeLayout>

4、第四步,添加图片login_logo.png,如下图所示。



5、至此,运行,效果如下图所示。




0 0
原创粉丝点击