android 圆角实现方案小结

Posted 许佳佳233

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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等,都可以实现圆角。

优点

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

劣势

  • 如果原本没有使用这个第三方库的话,需要额外依赖,会增加包大小。
  • 使用场景需要根据第三方库提供的能力来,定制化能力低。

以上是关于android 圆角实现方案小结的主要内容,如果未能解决你的问题,请参考以下文章

android 圆角实现方案小结

圆角之图片实现方法小结

Android 圆角的效果实现

圆角之图片实现方法小结二

用于背景的 Android 圆角边缘

Android 实现圆角方式