继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

自定义圆形ImageView实现代码

拉丁的传说
关注TA
已关注
手记 575
粉丝 126
获赞 789

首先新建一个CircleView类:

package com.example.circleview;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.Matrix;import android.graphics.Paint;import android.graphics.RectF;import android.graphics.Shader;import android.graphics.drawable.BitmapDrawable;import android.graphics.drawable.ColorDrawable;import android.graphics.drawable.Drawable;import android.util.AttributeSet;import android.widget.ImageView;/**
 * Created by Elsie on 2017/11/1.
 */public class CircleImageView extends android.support.v7.widget.AppCompatImageView {        private static final ScaleType SCALE_TYPE = ScaleType.CENTER_CROP;        private static final Bitmap.Config BITMAP_CONFIG = Bitmap.Config.ARGB_8888;        private static final int COLORDRAWABLE_DIMENSION = 1;        private static final int DEFAULT_BORDER_WIDTH = 0;        private static final int DEFAULT_BORDER_COLOR = Color.BLACK;        private final RectF mDrawableRect = new RectF();        private final RectF mBorderRect = new RectF();        private final Matrix mShaderMatrix = new Matrix();        private final Paint mBitmapPaint = new Paint();        private final Paint mBorderPaint = new Paint();        private int mBorderColor = DEFAULT_BORDER_COLOR;        private int mBorderWidth = DEFAULT_BORDER_WIDTH;        private Bitmap mBitmap;        private BitmapShader mBitmapShader;        private int mBitmapWidth;        private int mBitmapHeight;        private float mDrawableRadius;        private float mBorderRadius;        private boolean mReady;        private boolean mSetupPending;        public CircleImageView(Context context) {            super(context);
        }        public CircleImageView(Context context, AttributeSet attrs) {            this(context, attrs, 0);
        }        public CircleImageView(Context context, AttributeSet attrs, int defStyle) {            super(context, attrs, defStyle);            super.setScaleType(SCALE_TYPE);

            TypedArray a = context.obtainStyledAttributes(attrs,R.styleable.CircleImageView, defStyle, 0);

            mBorderWidth = a.getDimensionPixelSize(R.styleable.CircleImageView_border_width, DEFAULT_BORDER_WIDTH);
            mBorderColor = a.getColor(R.styleable.CircleImageView_border_color, DEFAULT_BORDER_COLOR);

            a.recycle();

            mReady = true;            if (mSetupPending) {
                setup();
                mSetupPending = false;
            }
        }        @Override
        public ScaleType getScaleType() {            return SCALE_TYPE;
        }        @Override
        public void setScaleType(ScaleType scaleType) {            if (scaleType != SCALE_TYPE) {                throw new IllegalArgumentException(String.format("ScaleType %s not supported.", scaleType));
            }
        }        @Override
        protected void onDraw(Canvas canvas) {            if (getDrawable() == null) {                return;
            }

            canvas.drawCircle(getWidth() / 2, getHeight() / 2, mDrawableRadius, mBitmapPaint);
            canvas.drawCircle(getWidth() / 2, getHeight() / 2, mBorderRadius, mBorderPaint);
        }        @Override
        protected void onSizeChanged(int w, int h, int oldw, int oldh) {            super.onSizeChanged(w, h, oldw, oldh);
            setup();
        }        public int getBorderColor() {            return mBorderColor;
        }        public void setBorderColor(int borderColor) {            if (borderColor == mBorderColor) {                return;
            }

            mBorderColor = borderColor;
            mBorderPaint.setColor(mBorderColor);
            invalidate();
        }        public int getBorderWidth() {            return mBorderWidth;
        }        public void setBorderWidth(int borderWidth) {            if (borderWidth == mBorderWidth) {                return;
            }

            mBorderWidth = borderWidth;
            setup();
        }        @Override
        public void setImageBitmap(Bitmap bm) {            super.setImageBitmap(bm);
            mBitmap = bm;
            setup();
        }        @Override
        public void setImageDrawable(Drawable drawable) {            super.setImageDrawable(drawable);
            mBitmap = getBitmapFromDrawable(drawable);
            setup();
        }        @Override
        public void setImageResource(int resId) {            super.setImageResource(resId);
            mBitmap = getBitmapFromDrawable(getDrawable());
            setup();
        }        private Bitmap getBitmapFromDrawable(Drawable drawable) {            if (drawable == null) {                return null;
            }            if (drawable instanceof BitmapDrawable) {                return ((BitmapDrawable) drawable).getBitmap();
            }            try {
                Bitmap bitmap;                if (drawable instanceof ColorDrawable) {
                    bitmap = Bitmap.createBitmap(COLORDRAWABLE_DIMENSION, COLORDRAWABLE_DIMENSION, BITMAP_CONFIG);
                } else {
                    bitmap = Bitmap.createBitmap(drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight(), BITMAP_CONFIG);
                }

                Canvas canvas = new Canvas(bitmap);
                drawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight());
                drawable.draw(canvas);                return bitmap;
            } catch (OutOfMemoryError e) {                return null;
            }
        }        private void setup() {            if (!mReady) {
                mSetupPending = true;                return;
            }            if (mBitmap == null) {                return;
            }

            mBitmapShader = new BitmapShader(mBitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);

            mBitmapPaint.setAntiAlias(true);
            mBitmapPaint.setShader(mBitmapShader);

            mBorderPaint.setStyle(Paint.Style.STROKE);
            mBorderPaint.setAntiAlias(true);
            mBorderPaint.setColor(mBorderColor);
            mBorderPaint.setStrokeWidth(mBorderWidth);

            mBitmapHeight = mBitmap.getHeight();
            mBitmapWidth = mBitmap.getWidth();

            mBorderRect.set(0, 0, getWidth(), getHeight());
            mBorderRadius = Math.min((mBorderRect.height() - mBorderWidth) / 2, (mBorderRect.width() - mBorderWidth) / 2);

            mDrawableRect.set(mBorderWidth, mBorderWidth, mBorderRect.width() - mBorderWidth, mBorderRect.height() - mBorderWidth);
            mDrawableRadius = Math.min(mDrawableRect.height() / 2, mDrawableRect.width() / 2);

            updateShaderMatrix();
            invalidate();
        }        private void updateShaderMatrix() {            float scale;            float dx = 0;            float dy = 0;

            mShaderMatrix.set(null);            if (mBitmapWidth * mDrawableRect.height() > mDrawableRect.width() * mBitmapHeight) {
                scale = mDrawableRect.height() / (float) mBitmapHeight;
                dx = (mDrawableRect.width() - mBitmapWidth * scale) * 5f;
            } else {
                scale = mDrawableRect.width() / (float) mBitmapWidth;
                dy = (mDrawableRect.height() - mBitmapHeight * scale) * 5f;
            }

            mShaderMatrix.setScale(scale, scale);
            mShaderMatrix.postTranslate((int) (dx + 5f) + mBorderWidth, (int) (dy + 5f) + mBorderWidth);

            mBitmapShader.setLocalMatrix(mShaderMatrix);
        }

}

然后在value文件夹下面新建一个attrs.xml文件:

<?xml version="1.0" encoding="utf-8"?><resources>
      <declare-styleable name="CircleImageView">  
            <attr name="border_width" format="dimension" />  
            <attr name="border_color" format="color" />  
        </declare-styleable></resources>

最后在activity_main.xml文件中使用:

<?xml version="1.0" encoding="utf-8"?><android.support.constraint.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
    android:layout_height="match_parent" tools:context="com.example.circleview.MainActivity">

   <com.example.circleview.CircleImageView
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:src="@drawable/welcome"
       tools:layout_editor_absoluteY="143dp"
       tools:layout_editor_absoluteX="26dp" /></android.support.constraint.ConstraintLayout>

这样就可以得到一个圆形图片了~这个其实相当于一个自定义控件,由于里面牵扯到挺多未学的知识,所以现在我先追求会用,等以后学到了相关知识再回来更新该博客,然后对相关代码进行注释~

欢迎小伙伴们多多指教!

原文链接:http://www.apkbus.com/blog-919484-76406.html

打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP