Android笔记 圆形ImageView

通过直接继承ImageView,使用BitmapShader圆形绘制实现。具体的可看鸿洋大大的博客:http://blog.csdn.net/lmj623565791/article/details/41967509
直接上代码

package com.bencoo.kme.widget;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapShader;
import android.graphics.Canvas;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.graphics.Shader.TileMode;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.widget.ImageView;

public class CircleImageView extends ImageView {
    /**
     * 宽度
     */
    private int mWidth;
    /**
     * 圆半径
     */
    private int mRadius;
    /**
     * 矩阵
     */
    private Matrix mMatrix;
    /**
     * 渲染图形 给图像着色
     */
    private BitmapShader mShader;
    /**
     * 笔
     */
    private Paint mBitmapPaint;
    public CircleImageView(Context context) {
        super(context);
        init();
    }

    public CircleImageView(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    public CircleImageView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        init();
    }
    /**
     * @description 初始化
     */
    private void init(){
        mMatrix=new Matrix();
        mBitmapPaint=new Paint();
        mBitmapPaint.setAntiAlias(true);
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        mWidth=Math.min(getMeasuredWidth(), getMeasuredHeight());
        mRadius=mWidth/2;
        setMeasuredDimension(mWidth, mWidth);
    }
    /**
     * @description Drawable转成Bitmap
     * @param drawable
     * @return
     */
    private Bitmap drawableToBitmap(Drawable drawable){
        if(drawable instanceof BitmapDrawable){
            BitmapDrawable bd=(BitmapDrawable) drawable;
            return bd.getBitmap();
        }
        int width=drawable.getIntrinsicWidth();
        int height=drawable.getIntrinsicHeight();
        Bitmap bitmap=Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
        Canvas canvas=new Canvas(bitmap);
        drawable.setBounds(0,0,width,height);
        drawable.draw(canvas);
        return bitmap;

    }
    /**
     * @description 初始Shader
     */
    private void setUpShader(){
        Drawable drawable=getDrawable();
        if(drawable==null){
            return;
        }
        Bitmap bitmap=drawableToBitmap(drawable);
        mShader=new BitmapShader(bitmap, TileMode.CLAMP, TileMode.CLAMP);
        int width=bitmap.getWidth();
        int height=bitmap.getHeight();
        //计算缩放比例
        float scale=1.0f;
        int bSize=Math.min(width, height);
        scale=mWidth*1.0f/bSize;
        //矩阵
        mMatrix.setScale(scale, scale);
        //Shader设置矩阵
        mShader.setLocalMatrix(mMatrix);
        //给笔设置Shader
        mBitmapPaint.setShader(mShader);

    }
    @Override
    protected void onDraw(Canvas canvas) {
        Drawable drawable=getDrawable();
        if(drawable==null){
            return;
        }
        setUpShader();
        canvas.drawCircle(mRadius, mRadius, mRadius, mBitmapPaint);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值