美文网首页
自定义圆形imageview

自定义圆形imageview

作者: 努力不负青春 | 来源:发表于2023-06-29 00:01 被阅读0次

kotlin版

    androidx.appcompat.widget.AppCompatImageView(context, atts) {

    private var paint: Paint? = null
    private var mRadius = 0f
    private var mScale = 0f

    override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec)
        val size = min(measuredHeight, measuredWidth)
        mRadius = (size / 2).toFloat()
        setMeasuredDimension(size, size)
    }

    override fun onDraw(canvas: Canvas?) {
        paint = Paint()
        val mDrawable = drawable
        if (mDrawable != null) {
            val bitmap = mDrawable.toBitmap()
            // 初始化BitmapShader 传入bitmap
            val bitmapShader = BitmapShader(bitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP)
            mScale = (mRadius * 2.0f) / min(bitmap.height, bitmap.width)
            val matris = Matrix()
            matris.setScale(mScale, mScale)
            bitmapShader.setLocalMatrix(matris)
            paint?.shader = bitmapShader
            canvas?.drawCircle(mRadius, mRadius, mRadius, paint!!)
        } else {
            super.onDraw(canvas)
        }
    }
}

java

public class CustomImager extends androidx.appcompat.widget.AppCompatImageView {
    public CustomImager(@NonNull Context context) {
        super(context);
    }

    public CustomImager(@NonNull Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
    }

    public CustomImager(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    //画笔
    private Paint mPaint;
    //圆形图片的半径
    private int mRadius;
    //图片的宿放比例
    private float mScale;

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        //由于是圆形,宽高应保持一致
        int size = Math.min(getMeasuredWidth(), getMeasuredHeight());
        mRadius = size / 2;
        setMeasuredDimension(size, size);
    }

    @SuppressLint("DrawAllocation")
    @Override
    protected void onDraw(Canvas canvas) {

        mPaint = new Paint();

        Drawable drawable = getDrawable();

        if (null != drawable) {
            Bitmap bitmap = ((BitmapDrawable) drawable).getBitmap();

            //初始化BitmapShader,传入bitmap对象
            BitmapShader bitmapShader = new BitmapShader(bitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);
            //计算缩放比例
            mScale = (mRadius * 2.0f) / Math.min(bitmap.getHeight(), bitmap.getWidth());

            Matrix matrix = new Matrix();
            matrix.setScale(mScale, mScale);
            bitmapShader.setLocalMatrix(matrix);
            mPaint.setShader(bitmapShader);
            //画圆形,指定好坐标,半径,画笔
            canvas.drawCircle(mRadius, mRadius, mRadius, mPaint);
        } else {
            super.onDraw(canvas);
        }
    }

} 

相关文章

网友评论

      本文标题:自定义圆形imageview

      本文链接:https://www.haomeiwen.com/subject/mgdaydtx.html