ShapeableImageView的实现方式其实和我很久以前写的一篇任意切割的实现方式本质是一样的,但是做到了更好封装和解耦(Google牛逼!)。 ShapeableImageView继承自ImageView,在onDraw方法中,调用了ImageView的绘制方法后,通过使用Xfermode的画笔来绘制路径,达到蒙蔽遮盖的效果,不懂的朋友百度Xfermode学习下。至于外边框则就是普通的画笔来绘制路径了。
以下使用方式参照推荐的Android ShapeableImageView使用 的案例转化为KT代码的效果图及其实现
// 圆形图片 iv_1.shapeAppearanceModel = ShapeAppearanceModel.builder() .setAllCornerSizes(RelativeCornerSize(0.5f)) .build() // 切角图片 iv_2.shapeAppearanceModel = ShapeAppearanceModel.builder() .setAllCorners(CutCornerTreatment()) .setAllCornerSizes(dp2px(15f)) .build() // 菱形图片 iv_3.shapeAppearanceModel = ShapeAppearanceModel.builder() .setAllCorners(CutCornerTreatment()) .setAllCornerSizes(RelativeCornerSize(0.5f)) .build() // 左上角90度扇形图片 iv_4.shapeAppearanceModel = ShapeAppearanceModel.builder() .setTopLeftCorner(RoundedCornerTreatment()) .setTopLeftCornerSize(RelativeCornerSize(1f)) .build() // 火箭头图片 iv_5.shapeAppearanceModel = ShapeAppearanceModel.builder() .setTopLeftCorner(RoundedCornerTreatment()) .setTopRightCorner(RoundedCornerTreatment()) .setTopLeftCornerSize(RelativeCornerSize(0.7f)) .setTopRightCornerSize(RelativeCornerSize(0.7f)) .build() // 水滴 iv_6.shapeAppearanceModel = ShapeAppearanceModel.builder() .setAllCorners(RoundedCornerTreatment()) .setTopLeftCornerSize(RelativeCornerSize(0.7f)) .setTopRightCornerSize(RelativeCornerSize(0.7f)) .setBottomLeftCornerSize(dp2px(25f)) .setBottomRightCornerSize(dp2px(25f)) .build() // 叶子图片 iv_7.shapeAppearanceModel = ShapeAppearanceModel.builder() .setTopLeftCorner(RoundedCornerTreatment()) .setBottomRightCorner(RoundedCornerTreatment()) .setTopLeftCornerSize(RelativeCornerSize(0.5f)) .setBottomRightCornerSize(RelativeCornerSize(0.5f)) .build() // tip图片 iv_8.shapeAppearanceModel = ShapeAppearanceModel.builder() .setTopLeftCorner(RoundedCornerTreatment()) .setBottomLeftCorner(RoundedCornerTreatment()) .setTopRightCorner(CutCornerTreatment()) .setBottomRightCorner(CutCornerTreatment()) .setAllCornerSizes(RelativeCornerSize(0.5f)) .build() <!-- 圆形图片 --> <style name="circleImageStyle"> <item name="cornerFamily">rounded</item> <item name="cornerSize">50%</item> </style> <!-- 切角图片 --> <style name="cutImageStyle"> <item name="cornerFamily">cut</item> <item name="cornerSize">15dp</item> </style> <!-- 菱形图片 --> <style name="diamondImageStyle"> <item name="cornerFamily">cut</item> <item name="cornerSize">50%</item> </style> <!-- 左上角90度扇形图片 --> <style name="topLeftRoundImageStyle"> <item name="cornerFamilyTopLeft">rounded</item> <item name="cornerSizeTopLeft">100%</item> </style> <!-- 火箭头图片 --> <style name="rocketImageStyle"> <item name="cornerFamilyTopLeft">rounded</item> <item name="cornerFamilyTopRight">rounded</item> <item name="cornerSizeTopLeft">70%</item> <item name="cornerSizeTopRight">70%</item> </style> <!-- 水滴 --> <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> <!-- 叶子图片 --> <style name="leafImageStyle"> <item name="cornerFamilyTopLeft">rounded</item> <item name="cornerFamilyBottomRight">rounded</item> <item name="cornerSizeTopLeft">50%</item> <item name="cornerSizeBottomRight">50%</item> </style> <!-- 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>