自定义圆形Imageview

来源:互联网 发布:货币资金管理优化论文 编辑:程序博客网 时间:2024/05/16 18:54

1:学习一定要善于总结,和敢于使用新的知识

2:一直使用的都是别人写好的控件,今天趁着国庆放假有时间,尝试自己写经常要用到的框架


3:知识总结:

一:用于创建canvas的bitmap不能是已经存在的bitmap


 二:这个自定view中遇到一个坑就是图片的大小和遮罩大小不匹配是,需要我们对bitmap做伸缩处理,这个用到bitmapshader渲染器,它的使用很简单,只需要算出要画的图片的宽高和整个view的宽高比,用矩阵设置bitmapshader后,再用bitmapshader设置paint,最后使用

Rect destRect = new Rect(0,0,getWidth(),getHeight());Rect  srcRect = new Rect(0,0,bitmap.getWidth(),bitmap.getHeight());canvas.drawBitmap(bitmap,srcRect,destRect,paint);
将图片画出来这里的destRect代表画的目标区域大小,srcRect指的是原图片显示的位置

最后附上代码,当然如果是用于项目中,建议还是用开源的项目中的,本控件仅供大家学习参考,和本人练手

package com.xubaipei.viewlib;import android.content.Context;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.PorterDuff;import android.graphics.PorterDuffXfermode;import android.graphics.Rect;import android.graphics.RectF;import android.graphics.Shader;import android.graphics.drawable.BitmapDrawable;import android.graphics.drawable.Drawable;import android.support.v7.app.WindowDecorActionBar;import android.util.AttributeSet;import android.widget.ImageView;/** * Created by Administrator on 2016/10/6. */public class CircleImageView extends ImageView {    public CircleImageView(Context context) {        this(context,null);    }    public CircleImageView(Context context, AttributeSet attrs) {        this(context, attrs,0);    }    public CircleImageView(Context context, AttributeSet attrs, int defStyleAttr) {        super(context, attrs, defStyleAttr);        initView();    }    public void initView(){    }    @Override    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {        int widthSpecMode = MeasureSpec.getMode(widthMeasureSpec);        int width = MeasureSpec.getSize(widthMeasureSpec);        int heightSpecMode = MeasureSpec.getMode(heightMeasureSpec);        int height = MeasureSpec.getSize(heightMeasureSpec);        BitmapDrawable drawable =(BitmapDrawable) getDrawable();        Bitmap bitmap = drawable.getBitmap();        if (widthSpecMode == MeasureSpec.AT_MOST){            width =  bitmap.getWidth();        }        if (heightSpecMode == MeasureSpec.AT_MOST){            height = bitmap.getHeight();        }        int min = Math.min(width,height);        setMeasuredDimension(min,min);    }    @Override    protected void onDraw(Canvas canvas) {        Paint paint = new Paint();        paint.setAntiAlias(true);        paint.setStyle(Paint.Style.FILL);        paint.setColor(Color.BLACK);        Bitmap circleBitmap = getCircleBitmap();        canvas.drawBitmap(circleBitmap, 0, 0, paint);    }    public void drawCircle(Canvas canvas){        Paint paint = new Paint();        paint.setAntiAlias(true);        paint.setStyle(Paint.Style.FILL);        paint.setColor(Color.BLACK);        canvas.drawCircle(getWidth() / 2, getHeight() / 2, getWidth() / 2, paint);    }    private void setShader(Bitmap bitmap,Paint paint){        int bitMinSize = Math.min(bitmap.getWidth(), bitmap.getHeight());        float scale =  getWidth() * 1.0f/bitMinSize;        Matrix matrix = new Matrix();        matrix.setScale(scale,scale);        BitmapShader shader = new BitmapShader(bitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);        shader.setLocalMatrix(matrix);        paint.setShader(shader);    }    public Bitmap getCircleBitmap( ){        Paint paint = new Paint();        paint.setAntiAlias(true);        paint.setStyle(Paint.Style.FILL);        paint.setColor(Color.BLACK);        paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));        Bitmap outBitmap = Bitmap.createBitmap(getWidth(),getHeight(), Bitmap.Config.ARGB_8888);        BitmapDrawable drawable =(BitmapDrawable) getDrawable();        Bitmap bitmap = drawable.getBitmap();        setShader(bitmap, paint);        Canvas canvas = new Canvas(outBitmap);        drawCircle(canvas);        Rect destRect = new Rect(0,0,getWidth(),getHeight());        Rect  srcRect = new Rect(0,0,bitmap.getWidth(),bitmap.getHeight());        canvas.drawBitmap(bitmap,srcRect,destRect,paint);        return outBitmap;    }}

0 0
原创粉丝点击