Material组件之ShapeableImageView的使用(学习笔记)

Material组件之ShapeableImageView的使用(学习笔记)Material组件之ShapeableImageView的使用文章目录前言一、属性一览二、使用步骤1.引入库2.ShapeableImageView各种样式XML配置代码配置源码前言以往我们实

Material组件之ShapeableImageView的使用


前言

以往我们实现图片圆角、描边等需求时,一般都是使用第三方或者自定义。Glide也有个扩展库,能很轻松的实现这些需求。不过在MDC1.2.0中,已有一套实现方案,那就是ShapeableImageView。
ShapeableImageView继承自ImageView,可以为image添加描边大小、颜色,以及圆角、裁切等,这得益于它新增了一个属性shapeAppearance,具体实现在ShapeAppearanceModel,可以通过style来配置,也可以通过代码实现。

最终效果图:
最终效果图


一、属性一览

ShapeableImageView属性:

属性名 作用 参数以及含义
shapeAppearance ShapeableImageView的形状外观样式 引用style样式
shapeAppearanceOverlay ShapeableImageView的形状外观叠加样式 引用style样式
strokeColor 描边颜色
strokeWidth 描边宽度

注意: 设置描边的时候,需要添加padding属性,padding的值为strokeWidth的一半。

设置shapeAppearance或者shapeAppearanceOverlay使用的style属性:

属性名 作用 参数以及含义
cornerFamily shape属性/样式 rounded: 圆角0 –cut: 切角1
cornerSize shapeAppearance 弧度

cornerSize:

  • cornerSizeTopLeft 左上弧度
  • cornerSizeTopRight 右上弧度
  • cornerSizeBottomRight 右下弧度
  • cornerSizeBottomLeft 左下弧度

cornerFamily:样式( rounded 或 cut

  • cornerFamilyTopLeft
  • cornerFamilyTopRight
  • cornerFamilyBottomRight
  • cornerFamilyBottomLeft

二、使用步骤

1.引入库

添加material:1.2.0依赖:

implementation 'com.google.android.material:material:1.2.0'

2.ShapeableImageView各种样式

据官方说明,此ImageView提供了对于shape更简洁的使用方式。

XML配置

  • 圆角图片
    圆角描边

布局样式:

    <!-- shapeAppearanceOverlay或shapeAppearance 加载style -->
    <!-- strokeColor描边颜色 -->
    <!-- strokeWidth描边宽度 -->
    <!-- 注意:设置描边的时候,需要添加padding属性,padding的值为strokeWidth的一半-->
    <!-- 圆角图片 -->
    <com.google.android.material.imageview.ShapeableImageView android:id="@+id/image1" android:layout_width="@dimen/dimen_80_dp" android:layout_height="@dimen/dimen_80_dp" android:layout_marginTop="@dimen/dimen_10_dp" android:padding="@dimen/dimen_1_dp" android:scaleType="fitXY" android:src="@mipmap/pic_test" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toLeftOf="@+id/image2" app:layout_constraintTop_toBottomOf="@+id/backTitleBar" app:shapeAppearanceOverlay="@style/roundedCornerImageStyle" app:strokeColor="@color/red" app:strokeWidth="@dimen/dimen_2_dp" />

圆角图片style样式:roundedCornerImageStyle

    <style name="roundedCornerImageStyle"> <item name="cornerFamily">rounded</item> <item name="cornerSize">10dp</item> </style>

  • 圆形图片
    圆形图片

布局样式:

    <!--圆形图片-->
    <com.google.android.material.imageview.ShapeableImageView android:id="@+id/image2" android:layout_width="@dimen/dimen_80_dp" android:layout_height="@dimen/dimen_80_dp" android:layout_marginTop="@dimen/dimen_10_dp" android:scaleType="fitXY" android:src="@mipmap/pic_test" app:layout_constraintLeft_toRightOf="@+id/image1" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toBottomOf="@+id/backTitleBar" app:shapeAppearanceOverlay="@style/circleImageStyle" />

圆形图片的style:circleImageStyle

    <!-- 圆形图片 -->
    <style name="circleImageStyle"> <item name="cornerFamily">rounded</item> <item name="cornerSize">50%</item> </style>

  • 切角图片
    切角图片

布局样式:

<!--切角图片-->
<com.google.android.material.imageview.ShapeableImageView android:id="@+id/image3" android:layout_width="@dimen/dimen_80_dp" android:layout_height="@dimen/dimen_80_dp" android:layout_marginTop="@dimen/dimen_10_dp" android:scaleType="fitXY" android:src="@mipmap/pic_test" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toLeftOf="@+id/image4" app:layout_constraintTop_toBottomOf="@+id/image1" app:shapeAppearanceOverlay="@style/cutImageStyle" />

切角图片style:cutImageStyle

    <!-- 切角图片 -->
    <style name="cutImageStyle"> <item name="cornerFamily">cut</item> <item name="cornerSize">12dp</item> </style>

  • 菱形图片
    菱形图片

布局样式:

    <!-- 菱形图片 -->
    <com.google.android.material.imageview.ShapeableImageView android:id="@+id/image4" android:layout_width="@dimen/dimen_80_dp" android:layout_height="@dimen/dimen_80_dp" android:layout_marginTop="@dimen/dimen_10_dp" android:scaleType="fitXY" android:src="@mipmap/pic_test" app:layout_constraintLeft_toRightOf="@+id/image3" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toBottomOf="@+id/image1" app:shapeAppearanceOverlay="@style/diamondImageStyle" />

菱形图片style:diamondImageStyle

    <!-- 菱形图片 -->
    <style name="diamondImageStyle"> <item name="cornerFamily">cut</item> <item name="cornerSize">50%</item> </style>

  • 左上角90度扇形图片
    左上角90度扇形图片

布局样式:

    <!--左上角90度扇形图片-->
    <com.google.android.material.imageview.ShapeableImageView android:id="@+id/image5" android:layout_width="@dimen/dimen_80_dp" android:layout_height="@dimen/dimen_80_dp" android:layout_marginTop="@dimen/dimen_10_dp" android:padding="@dimen/dimen_1_dp" android:scaleType="fitXY" android:src="@mipmap/pic_test" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toLeftOf="@+id/image6" app:layout_constraintTop_toBottomOf="@+id/image3" app:shapeAppearanceOverlay="@style/topLeftRoundImageStyle" app:strokeColor="@color/colorPrimary" app:strokeWidth="@dimen/dimen_2_dp" />

左上角90度扇形图片style:topLeftRoundImageStyle

    <!-- 左上角90度扇形图片 -->
    <style name="topLeftRoundImageStyle"> <item name="cornerFamilyTopLeft">rounded</item> <item name="cornerSizeTopLeft">100%</item> </style>

  • 火箭头图片

火箭头图片

布局样式:

    <!--火箭头图片-->
    <com.google.android.material.imageview.ShapeableImageView android:id="@+id/image6" android:layout_width="@dimen/dimen_80_dp" android:layout_height="@dimen/dimen_80_dp" android:layout_marginTop="@dimen/dimen_10_dp" android:padding="@dimen/dimen_1_dp" android:scaleType="fitXY" android:src="@mipmap/pic_test" app:layout_constraintLeft_toRightOf="@+id/image5" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toBottomOf="@+id/image3" app:shapeAppearanceOverlay="@style/rocketImageStyle" />

火箭头style:rocketImageStyle

    <!-- 火箭头图片 -->
    <style name="rocketImageStyle"> <item name="cornerFamilyTopLeft">rounded</item> <item name="cornerFamilyTopRight">rounded</item> <item name="cornerSizeTopLeft">70%</item> <item name="cornerSizeTopRight">70%</item> </style>

  • 水滴图片

水滴图片

布局样式:

    <!-- 水滴 -->
    <com.google.android.material.imageview.ShapeableImageView android:id="@+id/image7" android:layout_width="@dimen/dimen_80_dp" android:layout_height="@dimen/dimen_80_dp" android:layout_marginTop="@dimen/dimen_10_dp" android:padding="@dimen/dimen_1_dp" android:scaleType="fitXY" android:src="@mipmap/pic_test" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toLeftOf="@+id/image8" app:layout_constraintTop_toBottomOf="@+id/image5" app:shapeAppearanceOverlay="@style/waterImageStyle" />

水滴 style:waterImageStyle

    <!-- 水滴 -->
    <style name="waterImageStyle"> <item name="cornerFamilyBottomLeft">rounded</item> <item name="cornerFamilyBottomRight">rounded</item> <item name="cornerFamilyTopLeft">rounded</item> <item name="cornerFamilyTopRight">rounded</item> <item name="cornerSizeBottomLeft">25dp</item> <item name="cornerSizeBottomRight">25dp</item> <item name="cornerSizeTopLeft">70%</item> <item name="cornerSizeTopRight">70%</item> </style>

  • 叶子图片

叶子图片

布局样式:

    <!-- 叶子图片 -->
    <com.google.android.material.imageview.ShapeableImageView android:id="@+id/image8" android:layout_width="@dimen/dimen_80_dp" android:layout_height="@dimen/dimen_80_dp" android:layout_marginTop="@dimen/dimen_10_dp" android:padding="@dimen/dimen_1_dp" android:scaleType="fitXY" android:src="@mipmap/pic_test" app:layout_constraintLeft_toRightOf="@+id/image7" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toBottomOf="@+id/image5" app:shapeAppearanceOverlay="@style/leafImageStyle" />

叶子style:leafImageStyle

    <!-- 叶子图片 -->
    <style name="leafImageStyle"> <item name="cornerFamily">rounded</item> <item name="cornerSizeTopLeft">50%</item> <item name="cornerSizeBottomRight">50%</item> </style>

  • tip图片
    tip

布局样式:

<!-- tip图片 -->
    <com.google.android.material.imageview.ShapeableImageView android:id="@+id/image9" android:layout_width="@dimen/dimen_100_dp" android:layout_height="@dimen/dimen_30_dp" android:layout_marginTop="@dimen/dimen_10_dp" android:padding="@dimen/dimen_1_dp" android:scaleType="centerCrop" android:src="@mipmap/pic_test" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toLeftOf="@+id/image10" app:layout_constraintTop_toBottomOf="@+id/image7" app:shapeAppearanceOverlay="@style/tipImageStyle" />

tip图片style:tipImageStyle

    <!-- tip图片 -->
    <style name="tipImageStyle"> <item name="cornerFamilyTopLeft">rounded</item> <item name="cornerSizeTopLeft">50%</item> <item name="cornerFamilyBottomLeft">rounded</item> <item name="cornerSizeBottomLeft">50%</item> <item name="cornerFamilyTopRight">cut</item> <item name="cornerSizeTopRight">50%</item> <item name="cornerFamilyBottomRight">cut</item> <item name="cornerSizeBottomRight">50%</item> </style>


  • 右上角圆角图片

在这里插入图片描述

布局样式:

    <!--右上角圆角图片-->
    <com.google.android.material.imageview.ShapeableImageView android:id="@+id/image10" android:layout_width="@dimen/dimen_80_dp" android:layout_height="@dimen/dimen_80_dp" android:layout_marginTop="@dimen/dimen_10_dp" android:padding="@dimen/dimen_1_dp" android:scaleType="centerCrop" android:src="@mipmap/pic_test" app:layout_constraintLeft_toRightOf="@+id/image9" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toBottomOf="@+id/image7" app:shapeAppearanceOverlay="@style/topRightCornerStyle" />

右上角圆角图片style:topRightCornerStyle

    <!--右上角圆角图片-->
    <style name="topRightCornerStyle"> <item name="cornerFamilyTopRight">rounded</item> <item name="cornerSizeTopRight">@dimen/dimen_50_dp</item> </style>

代码配置

imageView?.shapeAppearanceModel = ShapeAppearanceModel.builder()
            .setAllCorners(CornerFamily.ROUNDED,20f)
            .setTopLeftCorner(CornerFamily.CUT,RelativeCornerSize(0.3f))
            .setTopRightCorner(CornerFamily.CUT,RelativeCornerSize(0.3f))
            .setBottomRightCorner(CornerFamily.CUT,RelativeCornerSize(0.3f))
            .setBottomLeftCorner(CornerFamily.CUT,RelativeCornerSize(0.3f))
            .setAllCornerSizes(ShapeAppearanceModel.PILL)
            .setTopLeftCornerSize(20f)
            .setTopRightCornerSize(RelativeCornerSize(0.5f))
            .setBottomLeftCornerSize(10f)
            .setBottomRightCornerSize(AbsoluteCornerSize(30f))
            .build()

代码接收一个ShapeAppearanceModel,通过构建者模式实现,setTopLeft表示处理左上角,其他同理。
cornerSize表示设置的大小,有RelativeCornerSize和AbsoluteCornerSize,RelativeCornerSize构造方法接收一个百分比,范围0-1;AbsoluteCornerSize构造方法接收一个具体数值,这个数值就是圆角的数值。
这里还有个CornerFamily,它表示处理的方式,有ROUNDED和CUT两种,ROUNDED是圆角,CUT是直接将圆角部分裁切掉。setAllCornerSizes(ShapeAppearanceModel.PILL)可以直接实现圆形效果。

源码

通过R文件可以查看当前ShapeableImageView具有的属性:

    <declare-styleable name="ShapeableImageView">
    <attr name="strokeWidth"/>
    <attr name="strokeColor"/>

    <!-- Shape appearance style reference for ShapeableImageView. Attribute declaration is in the shape package. -->
    <attr name="shapeAppearance"/>
    <!-- Shape appearance overlay style reference for ShapeableImageView. To be used to augment attributes declared in the shapeAppearance. Attribute declaration is in the shape package. -->
    <attr name="shapeAppearanceOverlay"/>
  </declare-styleable>
<declare-styleable name="ShapeAppearance">
    <!-- Corner size to be used in the ShapeAppearance. All corners default to this value -->
    <attr format="dimension|fraction" name="cornerSize"/>
    <!-- Top left corner size to be used in the ShapeAppearance. -->
    <attr format="dimension|fraction" name="cornerSizeTopLeft"/>
    <!-- Top right corner size to be used in the ShapeAppearance. -->
    <attr format="dimension|fraction" name="cornerSizeTopRight"/>
    <!-- Bottom right corner size to be used in the ShapeAppearance. -->
    <attr format="dimension|fraction" name="cornerSizeBottomRight"/>
    <!-- Bottom left corner size to be used in the ShapeAppearance. -->
    <attr format="dimension|fraction" name="cornerSizeBottomLeft"/>

    <!-- Corner family to be used in the ShapeAppearance. All corners default to this value -->
    <attr format="enum" name="cornerFamily">
      <enum name="rounded" value="0"/>
      <enum name="cut" value="1"/>
    </attr>
    <!-- Top left corner family to be used in the ShapeAppearance. -->
    <attr format="enum" name="cornerFamilyTopLeft">
      <enum name="rounded" value="0"/>
      <enum name="cut" value="1"/>
    </attr>
    <!-- Top right corner family to be used in the ShapeAppearance. -->
    <attr format="enum" name="cornerFamilyTopRight">
      <enum name="rounded" value="0"/>
      <enum name="cut" value="1"/>
    </attr>
    <!-- Bottom right corner family to be used in the ShapeAppearance. -->
    <attr format="enum" name="cornerFamilyBottomRight">
      <enum name="rounded" value="0"/>
      <enum name="cut" value="1"/>
    </attr>
    <!-- Bottom left corner family to be used in the ShapeAppearance. -->
    <attr format="enum" name="cornerFamilyBottomLeft">
      <enum name="rounded" value="0"/>
      <enum name="cut" value="1"/>
    </attr>
  </declare-styleable>

今天的文章Material组件之ShapeableImageView的使用(学习笔记)分享到此就结束了,感谢您的阅读。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/66236.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注