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 圆角实现方案小结的主要内容,如果未能解决你的问题,请参考以下文章