【Android】多种方式实现圆角控件View、图片、配景、边框(最全) ...

打印 上一主题 下一主题

主题 1001|帖子 1001|积分 3003


实现方式

button按钮、ImageView、自界说View等各种控件大概布局常常需要如许的样式:

下面是多种方式去实现圆角效果(圆角配景大概圆角边框),各有千秋吧:
1. shape

在drawable文件夹中新建一个shape.xml文件,在其中设置配景颜色和圆角半径即可:
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <shape xmlns:android="http://schemas.android.com/apk/res/android"
  3.     android:shape="rectangle" >
  4.     <!-- 设置背景颜色 -->
  5.     <solid android:color="#02B4FE" />
  6.     <!-- 设置边框颜色和粗细 -->
  7.     <stroke android:color="#02B4FE" android:width="1dp"/>
  8.    
  9.     <!-- 圆角半径 -->
  10.    
  11.         <!-- 统一设置四个角 -->
  12.     <corners android:Radius="5dp" />
  13.         <!-- 单独设置四个角 -->
  14.         <corners
  15.         android:topRightRadius="5dp"
  16.         android:bottomRightRadius="5dp"
  17.         android:topLeftRadius="5dp"
  18.         android:bottomLeftRadius="5dp"/>
  19. </shape>
复制代码

在布局大概控件中设置配景即可:
  1. android:background="@drawable/shape"
复制代码
特点:一种新的设置就需要重新创建文件,在xml中设置,可以设置配景大概边框,可以单独设置某个角。
2. ViewOutlineProvider

Android 5.x引入的新特性,用于实现View的阴影和轮廓
  1. view.setOutlineProvider(new ViewOutlineProvider() {
  2.             @Override
  3.             public void getOutline(View view, Outline outline) {
  4.                 // 设置圆角半径为5
  5.                 outline.setRoundRect(0, 0, view.getWidth(), view.getHeight(), 5);
  6.                 // 设置按钮为圆形
  7.                 outline.setOval(0, 0, view.getWidth(), view.getHeight());
  8.             }
  9.         });
  10. view.setClipToOutline(true);
复制代码
特点:不需要新建文件,在java中设置,不能单独设置某个角。
3. CardView

CardView嵌套view可以实现阴影和圆角,通过cardCornerRadius设置圆角半径,cardElevation设置阴影
  1.         <androidx.cardview.widget.CardView
  2.             android:layout_width="match_parent"
  3.             android:layout_height=""
  4.             app:cardCornerRadius="5dp"
  5.             app:cardElevation="0dp"
  6.             app:cardUseCompatPadding="false">
  7.             <ImageView
  8.                 android:layout_width="match_parent"
  9.                 android:layout_height="match_parent"/>
  10.         </androidx.cardview.widget.CardView>
复制代码
特点:不需要新建文件,在xml中设置,不能单独设置某个角。
4. 第三方库

这里以Glide为例,在Glide中设置圆角可以利用transform()方法应用 RoundedCorners / GranularRoundedCorners 转换
  1. // 设置圆角半径为10dp
  2. int radius = 10;
  3. //统一设置4个角
  4. RequestOptions options = new RequestOptions().transform(new RoundedCorners(radius));
  5. //单独设置某个角
  6. RequestOptions options = new RequestOptions().transform(new GranularRoundedCorners(radius, radius, radius, radius));
  7. // 在ImageView上显示圆角图片
  8. Glide.with(context)
  9.      .load(imageUrl)
  10.      .apply(options)
  11.      .into(imageView);
复制代码
特点:不需要新建文件,需要导入第三方包,在java中设置,可以单独设置某个角。
5. GradientDrawable和RoundedBitmapDrawable

GradientDrawable:
  1.         // 设置圆角半径为10dp
  2.         int radius = 10;
  3.        
  4.         //同时设置四个角
  5.     GradientDrawable drawable = new GradientDrawable();
  6.     drawable.setShape(GradientDrawable.RECTANGLE);
  7.     drawable.setCornerRadius(radius);
  8.     drawable.setColor(0xFFE1F5ED);
  9.     imageView.setImageDrawable(drawable);
  10.    
  11.     //单独设置四个角
  12.     GradientDrawable drawable = new GradientDrawable();
  13.     drawable.setShape(GradientDrawable.RECTANGLE);
  14.     drawable.setColor(0xFFE1F5ED);
  15.     float[] rad = new float[]{
  16.         radius, radius,
  17.         0f, 0f,
  18.         0f, 0f,
  19.         radius, radius
  20.     };
  21.     drawable.setCornerRadii(rad);
  22.     imageView.setImageDrawable(drawable);
复制代码
RoundedBitmapDrawable:通过RoundedBitmapDrawableFactory创建RoundedBitmapDrawable,第二个参数可以传入Bitmap(可将drawable文件转成Bitmap)、filepath、InputStream三种
  1.         RoundedBitmapDrawable drawable = RoundedBitmapDrawableFactory.create(getResources(),...);
  2.         drawable.setCornerRadius(radius);
  3.         imageView.setImageDrawable(drawable);
复制代码
特点:不需要新建文件,在java中设置,GradientDrawable可以单独设置某个角,RoundedBitmapDrawable不能单独设置。
可以将这两种运用在自界说View大概Button中去·自界说控件的属性,补充了利用shape元素的缺点,当项目中需要很多不同的样式时,只需要修改对应的属性值。
6. 自界说Drawable

新建RoundRectDrawable类,实现Drawable抽象方法,用画笔绘制draw圆角配景(圆角边框也雷同)
  1. import android.graphics.*
  2. import android.graphics.drawable.Drawable
  3. class RoundRectDrawable() : Drawable() {
  4.     private val paint = Paint()
  5.     private val path = Path()
  6.     private lateinit var rect: RectF
  7.     private var radius: FloatArray = floatArrayOf(
  8.         0f, 0f,
  9.         0f, 0f,
  10.         0f, 0f,
  11.         0f, 0f
  12.     )
  13.     init {
  14.         paint.isAntiAlias = true
  15.         paint.isDither = true
  16.     }
  17.     constructor(color: Int, radius: FloatArray) : this() {
  18.         this.radius = radius
  19.         paint.color = color
  20.     }
  21.     constructor(color: Int, radius: Float) : this(
  22.         color, floatArrayOf(
  23.             radius, radius,
  24.             radius, radius,
  25.             radius, radius,
  26.             radius, radius
  27.         )
  28.     )
  29.     constructor(color: Int) : this(
  30.         color, floatArrayOf(
  31.             0f, 0f,
  32.             0f, 0f,
  33.             0f, 0f,
  34.             0f, 0f
  35.         )
  36.     )
  37.     override fun setBounds(left: Int, top: Int, right: Int, bottom: Int) {
  38.         super.setBounds(left, top, right, bottom)
  39.         rect = RectF(
  40.             left.toFloat(),
  41.             top.toFloat(),
  42.             right.toFloat(),
  43.             bottom.toFloat()
  44.         )
  45.     }
  46.     override fun draw(canvas: Canvas) {
  47.         path.addRoundRect(
  48.             rect,
  49.             radius,
  50.             Path.Direction.CW
  51.         )
  52.         canvas.drawPath(path, paint)
  53.     }
  54.     override fun setAlpha(alpha: Int) {
  55.         paint.alpha = alpha
  56.         invalidateSelf()
  57.     }
  58.     override fun setColorFilter(colorFilter: ColorFilter?) {
  59.         paint.colorFilter = colorFilter
  60.         invalidateSelf()
  61.     }
  62.     override fun getOpacity(): Int {
  63.         return PixelFormat.TRANSLUCENT
  64.     }
  65. }
复制代码
在自界说View中利用:设置background属性
  1. AppCompatTextView(context).apply {
  2.             setTextColor(0xFF06CB7C.toInt())
  3.             background = RoundRectDrawable(0xFFE1F5ED.toInt(), 5)
  4.             text = ""
  5.         }
复制代码
特点:在java中设置,一次设置多次利用,可以单独设置某个角(这里是统一设置)

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

万有斥力

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表