• 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;
        }
    
    }
  • 相关阅读:
    主要工业以太网性能横向比较
    聊一聊工业以太网
    FPGA学习之RoadMap
    我眼中的FPGA
    板级通信总线之SPI及其Verilog实现
    ALTERA FPGA中实现低于时钟周期的端口延时
    Javascript 闭包浅析(一)
    node.js docker centos7 下环境构建命令
    ruby sass 命令
    如何配置nginx的反向代理nodes 3000端口项目
  • 原文地址:https://www.cnblogs.com/kangweifeng/p/4898271.html
Copyright © 2020-2023  润新知