android 圆角实现方案小结

概述

在实际工作中,android经常有需要实现圆角的场景。
笔者根据自己的经验,整理了下几种可行的圆角实现方案,分别适合不同的场景,期望能够对你有所帮助。

方案类型

  • 一、定义drawable文件
  • 二、自定义需要实现圆角的View
  • 三、自定义圆角View的父布局
  • 四、使用第三方库

一、定义drawable文件

例子

<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <corners android:radius="10dp"/>
    <solid android:color="#2196F3"/>
</shape>
    <FrameLayout
        android:layout_width="100dp"
        android:layout_height="100dp"
        android:background="@drawable/round_radius"/>

优势

  • 实现简单

劣势

  • 必须设置为View的background。
    View设置background无效的情况不可用,比如background被子View遮盖,或者background已经定制化不可被覆盖等。

二、自定义需要实现圆角的View

例子

这部分内容笔者之前实现过,有兴趣的可以参考看下:
android 自定义圆角button(自定义View Demo)

补充说明:此答案并不是唯一的,自定义View,读者完全可以按照自己的需要来实现。

优势

  • 适合于大量使用相同圆角控件的场景,可以提高复用率。
    如:有大量需要圆角,并且均会设置bitmap的背景图片的场景。

劣势

  • 在复杂场景下使用不方便
    如,会被子View遮盖的场景
  • 在简单场景下不如直接定义drawable来的方便

三、自定义圆角View的父布局

例子

public class RoundRadiusLayout extends FrameLayout {

    private int mRadius = 0;

    public RoundRadiusLayout(@NonNull Context context) {
        this(context,null);
    }

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


    public void setRadius(int radius) {
        this.mRadius = radius;
    }

    @Override
    protected void dispatchDraw(Canvas canvas) {
        Path path = new Path();
        RectF rectF = new RectF(0, 0, getWidth(), getHeight());
        path.addRoundRect(rectF, mRadius, mRadius, Path.Direction.CW);

        canvas.clipPath(path);
        super.dispatchDraw(canvas);
    }
}
        RoundRadiusLayout roundRadiusLayout=findViewById(R.id.rrl_main);
        roundRadiusLayout.setRadius(20);

        View testView=new View(this);
        testView.setBackgroundColor(Color.BLUE);
        roundRadiusLayout.addView(testView,new FrameLayout.LayoutParams(100,100));

优势

  • 适合复杂场景,不会被子View所影响,几乎在所有场景都可以实现圆角。

劣势

  • 可能会增加View的层级
    如果原来的View不支持重写dispatchDraw的方法的话,那么就需要再添加一个父布局,这样必然会增加View的层级。

四、使用第三方库

这点就比较开放了,常用的第三方库如fresco等,都可以实现圆角。

优点

  • 使用简单,不需要自己实现

劣势

  • 如果原本没有使用这个第三方库的话,需要额外依赖,会增加包大小。
  • 使用场景需要根据第三方库提供的能力来,定制化能力低。
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值