RoundRectImageView.java 3.84 KB
package com.wd.common.widget;

import android.annotation.SuppressLint;
import android.content.Context;
import android.graphics.Canvas;
import android.util.AttributeSet;
import android.view.MotionEvent;

import androidx.annotation.Nullable;

public class RoundRectImageView extends androidx.appcompat.widget.AppCompatImageView {

    private RoundRectHelper roundRectHelper;

    public RoundRectImageView(Context context) {
        super(context);
        init(context, null);
    }

    public RoundRectImageView(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
        init(context, attrs);
    }

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

    private void init(Context context, AttributeSet attrs) {
        roundRectHelper = new RoundRectHelper(this, attrs);
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    }

    @Override
    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
        super.onSizeChanged(w, h, oldw, oldh);
        roundRectHelper.onSizeChanged(this, w, h, oldw, oldh);
    }

    @Override
    protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
        super.onLayout(changed, left, top, right, bottom);
    }

    public void setStrokeColor(int strokeColor) {
        roundRectHelper.setStrokeColor(strokeColor);
        invalidate();
    }

    public void setStrokeWidth(float strokeWidth) {
        roundRectHelper.setStrokeWidth(strokeWidth);
        invalidate();
    }

    @SuppressLint("NewApi")
    @Override
    protected void onDraw(Canvas canvas) {
        canvas.saveLayer(null, null);
        super.onDraw(canvas);
        roundRectHelper.onDrawClip(this, canvas);
        canvas.restore();
    }

    @Override
    public boolean dispatchTouchEvent(MotionEvent event) {
        if (roundRectHelper.dispatchTouchEvent(event)) {
            return super.dispatchTouchEvent(event);
        }
        return false;

    }

    public void setRadius(int radius) {
        roundRectHelper.setRadius(radius);
        invalidate();
    }

    public float getRadius() {
        return roundRectHelper.getRadius();
    }

    @Override
    public void invalidate() {
        if (roundRectHelper != null) {
            roundRectHelper.refreshRegion(this, getWidth(), getHeight());
        }
        super.invalidate();
    }

    public void setTopRadius(int radius) {
        roundRectHelper.setRadiusTopLeft(radius);
        roundRectHelper.setRadiusTopRight(radius);
        invalidate();
    }

    public void setBottomRadius(int radius) {
        roundRectHelper.setRadiusBottomLeft(radius);
        roundRectHelper.setRadiusBottomRight(radius);
        invalidate();
    }

    public void setLeftRadius(int radius) {
        roundRectHelper.setRadiusTopLeft(radius);
        roundRectHelper.setRadiusBottomLeft(radius);
        invalidate();
    }

    public void setRightRadius(int radius) {
        roundRectHelper.setRadiusTopRight(radius);
        roundRectHelper.setRadiusBottomRight(radius);
        invalidate();
    }

    public void setLeftTopRadius(int radius) {
        roundRectHelper.setRadiusTopLeft(radius);
        invalidate();
    }

    public void setRightTopRadius(int radius) {
        roundRectHelper.setRadiusTopRight(radius);
        invalidate();
    }

    public void setLeftBottomRadius(int radius) {
        roundRectHelper.setRadiusBottomLeft(radius);
        invalidate();
    }

    public void setRightBottomRadius(int radius) {
        roundRectHelper.setRadiusBottomRight(radius);
        invalidate();
    }

    public void setMaskColor(int color) {
        roundRectHelper.setMaskColor(color);
        invalidate();
    }
}