zoukankan      html  css  js  c++  java
  • android自定义控件之圆形头像

    一、自定义控件1

    首先创建一个继承ImageView的抽象类MaskedImage。让他重写onDraw方法。代码如下

    import android.content.Context;
    import android.graphics.Bitmap;
    import android.graphics.Canvas;
    import android.graphics.Paint;
    import android.graphics.PorterDuff;
    import android.graphics.PorterDuffXfermode;
    import android.graphics.Xfermode;
    import android.graphics.drawable.Drawable;
    import android.util.AttributeSet;
    import android.widget.ImageView;
    
    public abstract class MaskedImage extends ImageView {
        private static final Xfermode MASK_XFERMODE;
        private Bitmap mask;
        private Paint paint;
    
        static {
            PorterDuff.Mode localMode = PorterDuff.Mode.DST_IN;
            MASK_XFERMODE = new PorterDuffXfermode(localMode);
        }
    
        public MaskedImage(Context paramContext) {
            super(paramContext);
        }
    
        public MaskedImage(Context paramContext, AttributeSet paramAttributeSet) {
            super(paramContext, paramAttributeSet);
        }
    
        public MaskedImage(Context paramContext, AttributeSet paramAttributeSet, int paramInt) {
            super(paramContext, paramAttributeSet, paramInt);
        }
    
        public abstract Bitmap createMask();
    
        protected void onDraw(Canvas paramCanvas) {
            Drawable localDrawable = getDrawable();
            if (localDrawable == null)
                return;
            try {
                if (this.paint == null) {
                    Paint localPaint1 = new Paint();
                    this.paint = localPaint1;
                    this.paint.setFilterBitmap(false);
                    Paint localPaint2 = this.paint;
                    Xfermode localXfermode1 = MASK_XFERMODE;
                    @SuppressWarnings("unused")
                    Xfermode localXfermode2 = localPaint2.setXfermode(localXfermode1);
                }
                float f1 = getWidth();
                float f2 = getHeight();
                int i = paramCanvas.saveLayer(0.0F, 0.0F, f1, f2, null, 31);
                int j = getWidth();
                int k = getHeight();
                localDrawable.setBounds(0, 0, j, k);
                localDrawable.draw(paramCanvas);
                if ((this.mask == null) || (this.mask.isRecycled())) {
                    Bitmap localBitmap1 = createMask();
                    this.mask = localBitmap1;
                }
                Bitmap localBitmap2 = this.mask;
                Paint localPaint3 = this.paint;
                paramCanvas.drawBitmap(localBitmap2, 0.0F, 0.0F, localPaint3);
                paramCanvas.restoreToCount(i);
                return;
            } catch (Exception localException) {
                StringBuilder localStringBuilder = new StringBuilder()
                        .append("Attempting to draw with recycled bitmap. View ID = ");
                System.out.println("localStringBuilder=="+localStringBuilder);
            }
        }
    }

    然后新建一个类CircularImage继承MaskedImage。代码如下:

    import android.content.Context;
    import android.graphics.Bitmap;
    import android.graphics.Canvas;
    import android.graphics.Paint;
    import android.graphics.RectF;
    import android.util.AttributeSet;
    
    public class CircularImage extends MaskedImage {
        public CircularImage(Context paramContext) {
            super(paramContext);
        }
    
        public CircularImage(Context paramContext, AttributeSet paramAttributeSet) {
            super(paramContext, paramAttributeSet);
        }
    
        public CircularImage(Context paramContext, AttributeSet paramAttributeSet, int paramInt) {
            super(paramContext, paramAttributeSet, paramInt);
        }
    
        public Bitmap createMask() {
            int i = getWidth();
            int j = getHeight();
            Bitmap.Config localConfig = Bitmap.Config.ARGB_8888;
            Bitmap localBitmap = Bitmap.createBitmap(i, j, localConfig);
            Canvas localCanvas = new Canvas(localBitmap);
            Paint localPaint = new Paint(1);
            localPaint.setColor(-16777216);
            float f1 = getWidth();
            float f2 = getHeight();
            RectF localRectF = new RectF(0.0F, 0.0F, f1, f2);
            localCanvas.drawOval(localRectF, localPaint);
            return localBitmap;
        }
    }

    二、自定义控件2

    创建一个类RoundImageView继承ImageView

    import android.content.Context;
    
    import android.graphics.Bitmap;
    import android.graphics.Bitmap.Config;
    import android.graphics.Canvas;
    import android.graphics.Color;
    import android.graphics.Paint;
    import android.graphics.PorterDuff.Mode;
    import android.graphics.PorterDuffXfermode;
    import android.graphics.Rect;
    import android.graphics.drawable.BitmapDrawable;
    import android.graphics.drawable.Drawable;
    import android.util.AttributeSet;
    import android.widget.ImageView;
    
    /**
     * 自定义圆形ImageView
     *
     * @author Administrator
     */
    public class RoundImageView extends ImageView {
    
        public RoundImageView(Context context) {
            super(context);
            // TODO Auto-generated constructor stub
        }
    
        public RoundImageView(Context context, AttributeSet attrs) {
            super(context, attrs);
        }
    
        public RoundImageView(Context context, AttributeSet attrs, int defStyle) {
            super(context, attrs, defStyle);
        }
    
        @Override
        protected void onDraw(Canvas canvas) {
    
            Drawable drawable = getDrawable();
    
            if (drawable == null) {
                return;
            }
    
            if (getWidth() == 0 || getHeight() == 0) {
                return;
            }
    
            Bitmap b = null;
    
            if (drawable instanceof BitmapDrawable) {
                b = ((BitmapDrawable) drawable).getBitmap();
            }
    
            if (null == b) {
                return;
            }
    
            Bitmap bitmap = b.copy(Bitmap.Config.ARGB_8888, true);
    
            int w = getWidth(), h = getHeight();
    
            Bitmap roundBitmap = getCroppedBitmap(bitmap, w);
            canvas.drawBitmap(roundBitmap, 0, 0, null);
    
        }
    
        public static Bitmap getCroppedBitmap(Bitmap bmp, int radius) {
            Bitmap sbmp;
            if (bmp.getWidth() != radius || bmp.getHeight() != radius)
                sbmp = Bitmap.createScaledBitmap(bmp, radius, radius, false);
            else
                sbmp = bmp;
            Bitmap output = Bitmap.createBitmap(sbmp.getWidth(), sbmp.getHeight(),
                    Config.ARGB_8888);
            Canvas canvas = new Canvas(output);
    
            final int color = 0xffa19774;
            final Paint paint = new Paint();
            final Rect rect = new Rect(0, 0, sbmp.getWidth(), sbmp.getHeight());
    
            paint.setAntiAlias(true);
            paint.setFilterBitmap(true);
            paint.setDither(true);
            canvas.drawARGB(0, 0, 0, 0);
            paint.setColor(Color.parseColor("#BAB399"));
            canvas.drawCircle(sbmp.getWidth() / 2 + 0.7f,
                    sbmp.getHeight() / 2 + 0.7f, sbmp.getWidth() / 2 + 0.1f, paint);
            paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN));
            canvas.drawBitmap(sbmp, rect, rect, paint);
    
            return output;
        }
    
    }
  • 相关阅读:
    Java实现 LeetCode 136 只出现一次的数字
    Java实现 LeetCode 136 只出现一次的数字
    Java实现 LeetCode 136 只出现一次的数字
    Java实现 LeetCode 135 分发糖果
    Java实现 LeetCode 135 分发糖果
    Java实现 LeetCode 135 分发糖果
    Java实现 LeetCode 134 加油站
    Java实现 LeetCode 134 加油站
    Java实现 LeetCode 134 加油站
    Java实现 LeetCode 133 克隆图
  • 原文地址:https://www.cnblogs.com/kangweifeng/p/4898271.html
Copyright © 2011-2022 走看看