Android自定义AvatarImageView实现头像裁剪及形状效果

0 下载量 201 浏览量 更新于2024-09-01 收藏 271KB PDF 举报
"这篇教程详细介绍了如何在Android中自定义AvatarImageView来实现各种头像显示效果,包括圆形以及其他不规则形状。文中提到了三种实现自定义形状图形的方法:PorterDuffXfermode、BitmapShader和ClipPath,并重点讲解了使用PorterDuffXfermode的方式。" 在Android开发中,AvatarImageView通常用于显示用户的头像,通常是圆形,但有时可能需要更复杂的形状。本教程主要探讨了如何通过自定义视图来实现这一功能。作者首先展示了实现后的效果图,以激发读者的兴趣。 PorterDuffXfermode是一种图像混合模式,用于控制Canvas上的两个图层如何相互作用。这个模式由16种不同的枚举值来表示,每种值都有特定的图形处理效果: 1. PorterDuff.Mode.CLEAR:绘制的内容不会显示在画布上。 2. PorterDuff.Mode.SRC:只显示上层绘制的图像。 3. PorterDuff.Mode.DST:只显示下层绘制的图像。 4. PorterDuff.Mode.SRC_OVER:正常绘制,上层覆盖下层。 5. PorterDuff.Mode.DST_OVER:两层都显示,下层在上层之上。 6. PorterDuff.Mode.SRC_IN:仅显示两图层交集部分的上层。 7. PorterDuff.Mode.DST_IN:仅显示两图层交集部分的下层。 8. PorterDuff.Mode.SRC_OUT:显示上层的非交集部分。 9. PorterDuff.Mode.DST_OUT:显示下层的非交集部分。 10. PorterDuff.Mode.SRC_ATOP:显示下层非交集部分与上层交集部分。 11. PorterDuff.Mode.DST_ATOP:显示上层非交集部分与下层交集部分。 12. PorterDuff.Mode.XOR:去除两图层的交集部分。 13. PorterDuff.Mode.DARKEN:取两图层全部,交集部分颜色变深。 14. PorterDuff.Mode.LIGHTEN:取两图层全部,点亮交集部分颜色。 15. PorterDuff.Mode.MULTIPLY:取两图层交集部分叠加后颜色。 16. PorterDuff.Mode.SCREEN:取两图层全部,交集部分变为透明色。 作者在1.1小节中提到的思路可能是这样的:创建一个新的ImageView子类,重写其onDraw()方法,在该方法中利用PorterDuffXfermode进行图形处理。首先,将原始图像绘制到Canvas上,然后根据所需的形状(例如圆形)创建一个遮罩,使用PorterDuffXfermode的适当模式将遮罩应用到Canvas上,从而裁剪出所需的形状。 通过这种方式,开发者不仅可以实现圆形头像,还可以根据需要实现其他形状,如椭圆、带有缺口的圆形等。BitmapShader和ClipPath是另外两种实现自定义形状的方法,分别通过纹理着色和路径裁剪来达到目的,它们各有特点,适用于不同的场景。 通过自定义AvatarImageView并巧妙运用PorterDuffXfermode,开发者能够轻松实现各种头像显示效果,提升应用的用户体验。对于Android开发者来说,理解并掌握这些技术对于丰富界面设计和优化用户体验至关重要。
2019-09-24 上传
可生成圆形、方形、及方形的组合头像。项目地址:https://github.com/Pedroafa/avatar-android 效果图:如何使用:首先创建个ImageView<ImageView             android:id="@ id/roundedAvatar"             android:layout_height="fill_parent"             android:layout_width="fill_parent"/>2. //通过AvatarDrawableFactory生成各种形状的Drawable AvatarDrawableFactory avatarDrawableFactory = new AvatarDrawableFactory(getResources()); BitmapFactory.Options options = new BitmapFactory.Options(); options.inMutable = false; Bitmap avatar = BitmapFactory.decodeResource(getResources(), R.drawable.avatar, options); //圆形的 Drawable roundedAvatarDrawable = avatarDrawableFactory.getRoundedAvatarDrawable(avatar);//生成圆形的Drawable ImageView roundedAvatarView = (ImageView)rootView.findViewById(R.id.roundedAvatar); roundedAvatarView.setImageDrawable(roundedAvatarDrawable);其他形状的://圆形的且带边框的 Drawable borderedRoundedAvatarDrawable = avatarDrawableFactory.getBorderedRoundedAvatarDrawable(avatar); ImageView borderedRoundedAvatarView = (ImageView)rootView.findViewById(R.id.borderedRoundedAvatar); borderedRoundedAvatarView.setImageDrawable(borderedRoundedAvatarDrawable); //方形的 Drawable squaredAvatarDrawable = avatarDrawableFactory.getSquaredAvatarDrawable(avatar); ImageView squaredAvatarView = (ImageView)rootView.findViewById(R.id.squaredAvatar); squaredAvatarView.setImageDrawable(squaredAvatarDrawable); //俩个方形的组合头像 Drawable doubleSquaredAvatarDrawable = avatarDrawableFactory.getSquaredAvatarDrawable(avatar, avatar); ImageView doubleSquaredAvatarView = (ImageView)rootView.findViewById(R.id.doubleSquaredAvatar); doubleSquaredAvatarView.setImageDrawable(doubleSquaredAvatarDrawable); //三个方形的组合头像 Drawable tripleSquaredAvatarDrawable = avatarDrawableFactory.getSquaredAvatarDrawable(avatar, avatar, avatar); ImageView tripleSquaredAvatarView = (ImageView)rootView.findViewById(R.id.tripleSquaredAvatar); tripleSquaredAvatarView.setImageDrawable(tripleSquaredAvatarDrawable); //四个方形的组合头像 Drawable quadrupleSquaredAvatarDrawable = avatarDrawableFactory                     .getSquaredAvatarDrawable(avatar, avatar, avatar, avatar); ImageView quadrupleSquaredAvatarView = (ImageView)rootView.findViewById(R.id.quadrupleSquaredAvatar); quadrupleSquaredAvatarView.setImageDrawable(quadrupleSquaredAvatarDrawable);