当前位置: 首页 > news >正文

Android 圆形和圆角矩形总结

文章目录

  • Android 圆形和圆角矩形总结
    • ViewOutlineProvider
    • Glide
    • Canvas#clipPath()
    • CardView
    • BitmapShader
    • RoundedBitmapDrawable
    • ShapeableImageView
    • ImageFilterView
    • 源码下载

Android 圆形和圆角矩形总结

ViewOutlineProvider

ViewOutlineProvider 是 Android 5.0 引入的一个类,用来定义视图的轮廓(outline)。可以通过它来实现圆角矩形、椭圆、圆形等效果。

在这里插入图片描述

<LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:layout_margin="10dp"android:gravity="center"android:orientation="horizontal"><ImageViewandroid:id="@+id/iv_clip_circle"android:layout_width="100dp"android:layout_height="100dp"android:layout_marginRight="10dp"android:scaleType="centerCrop"android:src="@drawable/a" /><ImageViewandroid:id="@+id/iv_clip_round"android:layout_width="150dp"android:layout_height="100dp"android:scaleType="centerCrop"android:src="@drawable/a" />
</LinearLayout>
binding.ivClipCircle.clipToCircleView()
binding.ivClipRound.clipToRoundView(10F.dp)

Glide

Glide 是一个强大的图片加载库,通过它的 RequestOptions 可以轻松实现图片的圆角处理。

<LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:layout_margin="10dp"android:gravity="center"android:orientation="horizontal"><ImageViewandroid:id="@+id/iv_glide_circle"android:layout_width="100dp"android:layout_height="100dp"android:layout_marginRight="10dp"android:scaleType="centerCrop"android:src="@drawable/a" /><ImageViewandroid:id="@+id/iv_glide_round"android:layout_width="150dp"android:layout_height="100dp"android:scaleType="centerCrop"android:src="@drawable/a" />
</LinearLayout>
Glide.with(this).load(R.drawable.a).transform(CircleCrop()).into(binding.ivGlideCircle)
Glide.with(this).load(R.drawable.a).apply(RequestOptions().transform(CenterCrop(), RoundedCorners(10.dp))).into(binding.ivGlideRound)

Canvas#clipPath()

自定义 ImageView 并重写 onDraw() 方法,通过 Canvas.clipPath() 实现图片的圆角矩形和圆形效果。

<LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:layout_margin="10dp"android:gravity="center"android:orientation="horizontal"><com.example.androidui.circleround.view1.CircleImageViewandroid:layout_width="100dp"android:layout_height="100dp"android:layout_marginRight="10dp"android:scaleType="centerCrop"android:src="@drawable/a" /><com.example.androidui.circleround.view1.RoundImageViewandroid:layout_width="150dp"android:layout_height="100dp"android:scaleType="centerCrop"android:src="@drawable/a" />
</LinearLayout>
class CircleImageView @JvmOverloads constructor(context: Context,attrs: AttributeSet? = null,defStyleAttr: Int = 0
) : AppCompatImageView(context, attrs, defStyleAttr) {private val path = Path()override fun onDraw(canvas: Canvas?) {val radius = minOf(width, height) / 2Fpath.addCircle(width / 2F, height / 2F, radius, Path.Direction.CW)canvas?.clipPath(path)super.onDraw(canvas)}
}
class RoundImageView @JvmOverloads constructor(context: Context,attrs: AttributeSet? = null,defStyleAttr: Int = 0
) : AppCompatImageView(context, attrs, defStyleAttr) {private val path = Path()override fun onDraw(canvas: Canvas?) {path.addRoundRect(RectF(0F, 0F, width.toFloat(), height.toFloat()),10F.dp,10F.dp,Path.Direction.CW)canvas?.clipPath(path)super.onDraw(canvas)}
}

CardView

通过 CardView 的 app:cardCornerRadius 属性,可以非常方便地实现圆角效果。

<LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:layout_margin="10dp"android:gravity="center"android:orientation="horizontal"><androidx.cardview.widget.CardViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginRight="10dp"app:cardCornerRadius="100dp"><ImageViewandroid:layout_width="100dp"android:layout_height="100dp"android:scaleType="centerCrop"android:src="@drawable/a" /></androidx.cardview.widget.CardView><androidx.cardview.widget.CardViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"app:cardCornerRadius="10dp"><ImageViewandroid:layout_width="150dp"android:layout_height="100dp"android:scaleType="centerCrop"android:src="@drawable/a" /></androidx.cardview.widget.CardView>
</LinearLayout>

BitmapShader

BitmapShader 是 Android 中的一种着色器,通过它可以实现自定义的圆角和圆形图片。

 <LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:layout_margin="10dp"android:gravity="center"android:orientation="horizontal"><com.example.androidui.circleround.view2.CircleImageViewandroid:layout_width="100dp"android:layout_height="100dp"android:layout_marginRight="10dp"android:scaleType="centerCrop"android:src="@drawable/a" /><com.example.androidui.circleround.view2.RoundImageViewandroid:layout_width="150dp"android:layout_height="100dp"android:scaleType="centerCrop"android:src="@drawable/a" /></LinearLayout>
class CircleImageView @JvmOverloads constructor(context: Context,attrs: AttributeSet? = null,defStyleAttr: Int = 0
) : AppCompatImageView(context, attrs, defStyleAttr) {private val paint by lazy { Paint(Paint.ANTI_ALIAS_FLAG) }override fun onDraw(canvas: Canvas) {drawable ?: returnval bitmap = drawableToBitmap(drawable) ?: returngetShader(bitmap)val radius = minOf(width, height) / 2fcanvas.drawCircle(width / 2F, height / 2F, radius, paint)}private fun drawableToBitmap(drawable: Drawable): Bitmap? {return when (drawable) {is BitmapDrawable -> drawable.bitmapelse -> {val bitmap = Bitmap.createBitmap(drawable.intrinsicWidth,drawable.intrinsicHeight,Bitmap.Config.ARGB_8888)val canvas = Canvas(bitmap)drawable.setBounds(0, 0, canvas.width, canvas.height)drawable.draw(canvas)bitmap}}}private fun getShader(bitmap: Bitmap) {val shader = BitmapShader(bitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP)val matrix = Matrix()val scale: Floatval dx: Floatval dy: Floatif (bitmap.width * height > width * bitmap.height) {scale = height / bitmap.height.toFloat()dx = (width - bitmap.width * scale) * 0.5fdy = 0f} else {scale = width / bitmap.width.toFloat()dx = 0fdy = (height - bitmap.height * scale) * 0.5f}matrix.setScale(scale, scale)matrix.postTranslate(dx, dy)shader.setLocalMatrix(matrix)paint.shader = shader}}
class RoundImageView @JvmOverloads constructor(context: Context,attrs: AttributeSet? = null,defStyleAttr: Int = 0
) : AppCompatImageView(context, attrs, defStyleAttr) {private val paint by lazy { Paint(Paint.ANTI_ALIAS_FLAG) }override fun onDraw(canvas: Canvas) {drawable ?: returnval bitmap = drawableToBitmap(drawable) ?: returngetShader(bitmap)val rect = RectF(0F, 0F, width.toFloat(), height.toFloat())canvas.drawRoundRect(rect, 10F.dp, 10F.dp, paint)}private fun drawableToBitmap(drawable: Drawable): Bitmap? {return when (drawable) {is BitmapDrawable -> drawable.bitmapelse -> {val bitmap = Bitmap.createBitmap(drawable.intrinsicWidth,drawable.intrinsicHeight,Bitmap.Config.ARGB_8888)val canvas = Canvas(bitmap)drawable.setBounds(0, 0, canvas.width, canvas.height)drawable.draw(canvas)bitmap}}}private fun getShader(bitmap: Bitmap) {val shader = BitmapShader(bitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP)val matrix = Matrix()val scale: Floatval dx: Floatval dy: Floatif (bitmap.width * height > width * bitmap.height) {scale = height / bitmap.height.toFloat()dx = (width - bitmap.width * scale) * 0.5fdy = 0f} else {scale = width / bitmap.width.toFloat()dx = 0fdy = (height - bitmap.height * scale) * 0.5f}matrix.setScale(scale, scale)matrix.postTranslate(dx, dy)shader.setLocalMatrix(matrix)paint.shader = shader}}

RoundedBitmapDrawable

RoundedBitmapDrawable 是 Android 提供的一个工具类,用于处理圆形或圆角矩形的图片显示。

RoundedBitmapDrawable 不支持 ImageView 的 scaleType属性。

<LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:layout_margin="10dp"android:gravity="center"android:orientation="horizontal"><ImageViewandroid:id="@+id/iv1"android:layout_width="100dp"android:layout_height="100dp"android:layout_marginRight="10dp" /><ImageViewandroid:id="@+id/iv2"android:layout_width="150dp"android:layout_height="100dp" />
</LinearLayout>
binding.iv1.post {val bitmap = BitmapFactory.decodeResource(resources, R.drawable.a)val scaleBitmap =centerCropBitmap(bitmap, binding.iv1.measuredWidth, binding.iv1.measuredHeight)val circleDrawable = RoundedBitmapDrawableFactory.create(resources, scaleBitmap).apply {paint.isAntiAlias = trueisCircular = true}binding.iv1.setImageDrawable(circleDrawable)
}
binding.iv2.post {val bitmap = BitmapFactory.decodeResource(resources, R.drawable.a)val scaleBitmap =centerCropBitmap(bitmap, binding.iv2.measuredWidth, binding.iv2.measuredHeight)val roundDrawable = RoundedBitmapDrawableFactory.create(resources, scaleBitmap).apply {paint.isAntiAlias = truesetCornerRadius(10F.dp)}binding.iv2.setImageDrawable(roundDrawable)
}

ShapeableImageView

ShapeableImageView 是 Android Material Components 库中的一个控件,用于轻松实现自定义形状的 ImageView。通过 ShapeableImageView,开发者可以轻松地实现圆形、圆角矩形、不同角的圆角以及其他复杂形状,而无需依赖 XML 的 shape 文件或者第三方库。

<LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:layout_margin="10dp"android:gravity="center"android:orientation="horizontal"><com.google.android.material.imageview.ShapeableImageViewandroid:layout_width="100dp"android:layout_height="100dp"android:layout_marginRight="10dp"android:scaleType="centerCrop"android:src="@drawable/a"app:shapeAppearance="@style/CircleStyle" /><com.google.android.material.imageview.ShapeableImageViewandroid:layout_width="150dp"android:layout_height="100dp"android:scaleType="centerCrop"android:src="@drawable/a"app:shapeAppearance="@style/RoundStyle" />
</LinearLayout>
<style name="CircleStyle"><item name="cornerSize">50%</item>
</style><style name="RoundStyle"><item name="cornerSize">10dp</item>
</style>

ImageFilterView

ImageFilterView 是 Android 提供的一个特殊的 ImageView,它继承自 ImageView 并扩展了其功能。

<LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:layout_margin="10dp"android:gravity="center"android:orientation="horizontal"><androidx.constraintlayout.utils.widget.ImageFilterViewandroid:layout_width="100dp"android:layout_height="100dp"android:layout_marginRight="10dp"android:scaleType="centerCrop"android:src="@drawable/a"app:roundPercent="1" /><androidx.constraintlayout.utils.widget.ImageFilterViewandroid:layout_width="150dp"android:layout_height="100dp"android:scaleType="centerCrop"android:src="@drawable/a"app:round="10dp" />
</LinearLayout>

源码下载

http://www.dtcms.com/a/337938.html

相关文章:

  • MyCAT完整实验报告
  • Unity作为库导入Android原生工程
  • AVB(Android Verified Boot)中vbmeta结构浅析
  • Unity2022打包安卓报错的奇葩问题
  • Java面试宝典:Redis 入门与应用
  • 【OpenAI】 GPT-4o-realtime-preview 多模态、实时交互模型介绍+API的使用教程!
  • 线程间同步机制与进程间通信
  • 数据处理和统计分析 —— Pandas 基础(附数据集)
  • SMTPman,smtp ssl助力安全高效邮件传输!
  • redhat9从github下拉软件包一直报错
  • petalinux2023.1编译pmu-rom-native...fetch error问题
  • 39-Linux下安装python
  • BPO(Business Process Optimization,业务流程优化)
  • FPGA驱动量子革命:微美全息(NASDAQ:WIMI)实现数字量子计算关键验证
  • 任务六 歌手页面功能开发
  • single cell ATAC(11)ArchR鉴定标记Peak
  • Spring AI RAG 检索增强 应用
  • RAG深入解读:文本分块、混合检索、重排序、bge微调(工程落地实践)
  • Android 流式布局实现方案全解析
  • Android输入框文字不垂直居中
  • Maven Shade Plugin 插件使用说明
  • 【音视频】ISP能力
  • 阿里云odps和dataworks的区别
  • 多数据源 Demo
  • 机器学习之数据预处理(二)
  • HBM CPU Cache / GPU Cache 的关系
  • 第一阶段C#-14:委托,事件
  • ubuntu 下载安装tomcat简单配置(傻瓜式教程)
  • minio安装和配置
  • JUC读写锁