栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Android CornerBackgroundLayout(背景角为圆角或缺角)

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Android CornerBackgroundLayout(背景角为圆角或缺角)

功能

1.支持背景圆角显示
2.支持背景缺角显示

效果

使用

注意:YouPackNamae替换为对应项目的包名。

    
    
源码

注意:复制源码,导入对应项目的R资源包;如果是support包项目,把import android.x相关包替换为support的导入包即可。

attrs.xml
    
    
    
    
    
    
    
    
        
        
        
        
        
        
        
    
CornerBackgroundLayout
import android.content.Context;
import android.content.res.Resources;
import android.content.res.TypedArray;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.PorterDuff;
import android.graphics.PorterDuffXfermode;
import android.graphics.RectF;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;

import android.util.AttributeSet;
import android.widget.RelativeLayout;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;



public class CornerBackgroundLayout extends RelativeLayout {

    
    private int solid = Color.parseColor("#0A4CFE");
    
    private float lackRadius = -1;
    
    private float leftTopLackRadius = 0;
    
    private float leftBottomLackRadius = 0;
    
    private float rightTopLackRadius = 0;
    
    private float rightBottomLackRadius = 0;
    
    private float radius = density(8);

    public CornerBackgroundLayout(@NonNull Context context) {
        super(context);
        initAttributeSet(context, null);
    }

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

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

    private void initAttributeSet(Context context, AttributeSet attrs) {
        if (attrs != null) {
            TypedArray array = context.obtainStyledAttributes(attrs, R.styleable.CornerBackgroundLayout);
            solid = array.getColor(R.styleable.CornerBackgroundLayout_solid, solid);
            lackRadius = array.getDimension(R.styleable.CornerBackgroundLayout_lackRadius, lackRadius);
            leftTopLackRadius = array.getDimension(R.styleable.CornerBackgroundLayout_leftTopLackRadius, leftTopLackRadius);
            leftBottomLackRadius = array.getDimension(R.styleable.CornerBackgroundLayout_leftBottomLackRadius, leftBottomLackRadius);
            rightTopLackRadius = array.getDimension(R.styleable.CornerBackgroundLayout_rightTopLackRadius, rightTopLackRadius);
            rightBottomLackRadius = array.getDimension(R.styleable.CornerBackgroundLayout_rightBottomLackRadius, rightBottomLackRadius);
            if (lackRadius != -1) {
                leftTopLackRadius = leftBottomLackRadius = rightTopLackRadius = rightBottomLackRadius = lackRadius;
            }
            array.recycle();
        }
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        Bitmap bitmap = makeLackBitmap(getMeasuredWidth(), getMeasuredHeight(), radius, new float[]{leftTopLackRadius, leftBottomLackRadius, rightTopLackRadius, rightBottomLackRadius});
        Drawable drawable = new BitmapDrawable(getResources(), bitmap);
        setBackground(drawable);
    }

    protected float density(int value) {
        return Resources.getSystem().getDisplayMetrics().density * value;
    }

    
    protected Bitmap makeLackBitmap(int width, int height, float radius, float lackRadius[]) {
        Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
        Canvas canvas = new Canvas(bitmap);
        Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
        paint.setColor(solid);
        RectF rectF = new RectF(0, 0, width, height);
        canvas.drawRoundRect(rectF, radius, radius, paint);
        paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_OUT));
        paint.setColor(Color.TRANSPARENT);
        //左上
        if (lackRadius.length > 0) {
            canvas.drawCircle(0, 0, lackRadius[0], paint);
        }
        //左下
        if (lackRadius.length > 1) {
            canvas.drawCircle(0, height, lackRadius[1], paint);
        }
        //右上
        if (lackRadius.length > 2) {
            canvas.drawCircle(width, 0, lackRadius[2], paint);
        }
        //右下
        if (lackRadius.length > 3) {
            canvas.drawCircle(width, height, lackRadius[3], paint);
        }
        return bitmap;
    }

    public void setSolid(int solid) {
        this.solid = solid;
        invalidate();
    }

    
    public void setRadius(float radius) {
        this.radius = radius;
        invalidate();
    }

    
    public void setLackRadius(float lackRadius) {
        this.lackRadius = lackRadius;
        leftTopLackRadius = leftBottomLackRadius = rightTopLackRadius = rightBottomLackRadius = lackRadius;
        invalidate();
    }

    
    public void setLeftTopLackRadius(float leftTopLackRadius) {
        this.leftTopLackRadius = leftTopLackRadius;
        invalidate();
    }

    
    public void setLeftBottomLackRadius(float leftBottomLackRadius) {
        this.leftBottomLackRadius = leftBottomLackRadius;
        invalidate();
    }

    
    public void setRightTopLackRadius(float rightTopLackRadius) {
        this.rightTopLackRadius = rightTopLackRadius;
        invalidate();
    }

    
    public void setRightBottomLackRadius(float rightBottomLackRadius) {
        this.rightBottomLackRadius = rightBottomLackRadius;
        invalidate();
    }

}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/704347.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号