View实现圆角的几种方式

1.通过给view设置background实现圆角

这种方式是通过shape设置背景色的方式实现圆角,不影响view的绘制区域,只是通过设置背景色影响显示区域来实现圆角

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <corners
        android:bottomLeftRadius="11dp"/>
    <solid android:color="@color/element_tcl_navigation_item_bg_middle_focus_color" />
</shape>

corner标签代表圆角,支持设置4个圆角一个单个圆角设置

bottomLeftRadius :左下圆角

bottomRightRadius : 右下圆角

topLeftRadius : 左上圆角

topRightRadius :右上圆角

solid标签代表填充色,纯色填充

gradient标签代表渐变色填充

shape也支持java代码创建:

GradientDrawable在Android 中便是shape标签的代码实现,

val gradientDrawable = background as GradientDrawable
gradientDrawable.setColor(Color.GRAY)
gradientDrawable.cornerRadius = 10F
view.background = gradientDrawable

上述就是代码动态创建shape的示例

想要设置某个圆角可以使用

val radii = floatArrayOf(corner,corner,0f,0f,0f,0f,corner,corner)
gradientDrawable.cornerRadii = radii

setCornerRadii(@Nullable float[] radii) 该方法实现某个圆角的设置,对应关系就是8位数组是左上,右上,右下,左下,两位对应一个圆角,值就是想要的圆角值。

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:left="5dp"
        android:right="5dp">
        <shape>
            <solid android:color="@color/white" />
            <corners
                android:bottomLeftRadius="10dp"
                android:topLeftRadius="10dp" />
        </shape>

    </item>

</layer-list>

需要注意这种layer-list的写法,这种需要代码动态创建时需要用到LayerDrawable

这种方式需要动态修改shape的时候需要

 val layerDrawable = background as LayerDrawable
 val drawable = layerDrawable.getDrawable(0)
 val drawables = arrayOf(drawable)
 val realLayoutDrawable = LayerDrawable(drawables)
        //layer drawable left 和 right的值
 realLayoutDrawable.setLayerInset(0, 5,0,5,0 )
 view.background = realLayoutDrawable

layerDrawable相当于一个数组中包含了很多GradientDrawable,需要修改时,需要先get出来 修改后再放入即setLayerInset(int index, int l, int t, int r, int b)

2.通过glide加载图片设置圆角

    fun loadImageIntoBackgroundWithSomeCorner(
        view: View,
        context: Context,
        url: String,
        topLeftCorner: Int,
        topRightCorner: Int,
        bottomLeftCorner: Int,
        bottomRightCorner: Int,
        imageLoaderDrawableListener: ImageLoaderDrawableListener
    ) {
        val roundedCorners = GranularRoundedCorners(
            topLeftCorner.toFloat(),
            topRightCorner.toFloat(),
            bottomRightCorner.toFloat(),
            bottomLeftCorner.toFloat()
        )
        val requestOptions =
            RequestOptions().transform(CenterCrop(), roundedCorners)
        Glide.with(context).asBitmap().load(url).apply(requestOptions).into(
            object : CustomViewTarget<View, Bitmap>(view) {
                override fun onLoadFailed(errorDrawable: Drawable?) {
                    imageLoaderDrawableListener.onLoadFail()
                }

                override fun onResourceReady(resource: Bitmap, transition: Transition<in Bitmap>?) {
                    if (resource != null && !resource.isRecycled) {
                        imageLoaderDrawableListener.onLoadImageSuccess(url, BitmapDrawable(context.resources, resource))
                    }
                }

                override fun onResourceCleared(placeholder: Drawable?) {
                }
            }
        )
    }

Glide加载图片圆角通过设置RequestOptions来实现

GranularRoundedCorners(
    float topLeft, float topRight, float bottomRight, float bottomLeft) {
  this.topLeft = topLeft;
  this.topRight = topRight;
  this.bottomRight = bottomRight;
  this.bottomLeft = bottomLeft;
}

GranularRoundedCorners可以设置单个圆角

RoundedCorners(int roundingRadius)

RoundedCorners是直接设置4个圆角

3.通过CardView实现圆角

CardView 是自带圆角实现的,我们只需要在它的定义中加一句 app:cardCornerRadius=”10dp” 即可。

<?xml version="1.0" encoding="utf-8"? 
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
 xmlns:app="http://schemas.android.com/apk/res-auto"
 android:layout_width="match_parent"
 android:layout_height="match_parent" 

 <androidx.cardview.widget.CardView
   android:layout_width="256dp"
   android:layout_height="128dp"
   app:cardBackgroundColor="#0084FF"
   app:cardCornerRadius="10dp"
   app:layout_constraintBottom_toBottomOf="parent"
   app:layout_constraintEnd_toEndOf="parent"
   app:layout_constraintStart_toStartOf="parent"
   app:layout_constraintTop_toTopOf="parent" / 

</androidx.constraintlayout.widget.ConstraintLayout 

CardView是原生组件,缺点是只支持四个圆角设置

4.利用View 的 ViewOutlineProvider 实现圆角

ViewOutlineProvider 是Android 5.0之后新增的设置圆角的方式。

@RequiresApi(Build.VERSION_CODES.LOLLIPOP)
class VideoListOutlineProvider(private val radius: Int, private val ancorView: View?) :
    ViewOutlineProvider() {

    companion object {
        const val radiusLeft = 1
        const val radiusRight = 2
    }

    //圆角左边或者右边
    private var radiusDirection = radiusLeft

    constructor(radiusDirection: Int, radius: Int, ancorView: View?) : this(radius, ancorView) {
        this.radiusDirection = radiusDirection
    }


    override fun getOutline(view: View, outline: Outline?) {

        if (radiusDirection == radiusLeft) {
          
            outline?.setRoundRect(0, 0, view.width + radius, view.height, radius.toFloat())
            
        } else if (radiusDirection == radiusRight) {
                outline?.setRoundRect(-radius, 0, view.width, view.height, radius.toFloat())
            
        }
        }
}

这种实现方式,本质上是修改了 View 的轮廓。

本质来说,此种方式只支持设置4个圆角,但是可以控制裁剪区域实现单个圆角的绘制,需要注意识别清楚裁剪区域,不然会导致view直接被裁剪丢弃。具体参照上述实现。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android 应用程序中,实现事件监听器可以使用以下几种方式: 1. 匿名内部类 使用匿名内部类来实现事件监听器,通常用于只需要在一个地方使用的简单事件监听器。例如,在按钮的点击事件上添加一个匿名内部类,可以在按钮被点击时执行相应的操作。示例代码如下: ``` Button button = findViewById(R.id.button); button.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // 执行相应的操作 } }); ``` 2. 内部类 使用内部类来实现事件监听器,通常用于需要在多个地方使用的复杂事件监听器。例如,创建一个内部类 MyClickListener 来实现按钮的点击事件监听器,并在多个 Activity 中使用该监听器。示例代码如下: ``` public class MainActivity extends AppCompatActivity { private Button button; private MyClickListener clickListener; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); button = findViewById(R.id.button); clickListener = new MyClickListener(); button.setOnClickListener(clickListener); } private class MyClickListener implements OnClickListener { @Override public void onClick(View v) { // 执行相应的操作 } } } ``` 3. 外部类 使用外部类来实现事件监听器,通常用于需要在多个 Activity 或 Fragment 中使用的复杂事件监听器。例如,创建一个外部类 MyClickListener 来实现按钮的点击事件监听器,并在多个 Activity 或 Fragment 中使用该监听器。示例代码如下: ``` public class MyClickListener implements OnClickListener { @Override public void onClick(View v) { // 执行相应的操作 } } public class MainActivity extends AppCompatActivity { private Button button; private MyClickListener clickListener; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); button = findViewById(R.id.button); clickListener = new MyClickListener(); button.setOnClickListener(clickListener); } } public class SecondActivity extends AppCompatActivity { private Button button; private MyClickListener clickListener; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_second); button = findViewById(R.id.button); clickListener = new MyClickListener(); button.setOnClickListener(clickListener); } } ``` 4. XML 中定义 使用 XML 中定义事件监听器,与在代码中实现事件监听器类似。例如,在布局文件中定义一个 Button,使用 android:onClick 属性来指定按钮的点击事件监听器。示例代码如下: ``` <Button android:id="@+id/button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Click Me" android:onClick="onButtonClick" /> ``` 在 Activity 或 Fragment 中定义一个名为 onButtonClick 的方法,该方法将自动成为按钮的点击事件监听器。示例代码如下: ``` public void onButtonClick(View view) { // 执行相应的操作 } ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值