一.第三方RoundedImageView

1.在Android Studio中,可进入模块设置中添加库依赖。 进入Module结构设置添加库依赖 ,输入RoundedImageView然后搜索添加

2.在Moudle的build.gradle中添加如下代码,添加完之后在Build中进行下Make Module操作(编译下Module),使自己添加的依赖生效

implementation ‘com.makeramen:roundedimageview:2.3.0’

3.添加相关属性:

控件属性:
riv_border_width: 边框宽度
riv_border_color: 边框颜色
riv_oval: 是否圆形
riv_corner_radius: 圆角弧度
riv_corner_radius_top_left:左上角弧度
riv_corner_radius_top_right: 右上角弧度
riv_corner_radius_bottom_left:左下角弧度
riv_corner_radius_bottom_right:右下角弧度

4.示例布局:

    <com.makeramen.roundedimageview.RoundedImageViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:src="@mipmap/avatar"app:riv_border_color="#333333"app:riv_border_width="2dp"app:riv_oval="true" /><com.makeramen.roundedimageview.RoundedImageViewxmlns:app="http://schemas.android.com/apk/res-auto"android:layout_width="wrap_content"android:layout_height="wrap_content"android:scaleType="fitCenter"android:src="@mipmap/avatar"app:riv_border_color="#333333"app:riv_border_width="2dp"app:riv_corner_radius="10dp"app:riv_mutate_background="true"app:riv_oval="false"app:riv_tile_mode="repeat" /><com.makeramen.roundedimageview.RoundedImageViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:scaleType="fitCenter"android:src="@mipmap/avatar"app:riv_border_color="#333333"app:riv_border_width="2dp"app:riv_corner_radius_top_left="25dp"app:riv_corner_radius_bottom_right="25dp"app:riv_mutate_background="true"app:riv_oval="false"app:riv_tile_mode="repeat" /><com.makeramen.roundedimageview.RoundedImageViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:scaleType="fitCenter"android:src="@mipmap/avatar"app:riv_border_color="#333333"app:riv_border_width="2dp"app:riv_corner_radius_top_right="25dp"app:riv_corner_radius_bottom_left="25dp"app:riv_mutate_background="true"app:riv_oval="false"app:riv_tile_mode="repeat" /><com.makeramen.roundedimageview.RoundedImageViewandroid:layout_width="96dp"android:layout_height="72dp"android:scaleType="center"android:src="@mipmap/avatar"app:riv_border_color="#333333"app:riv_border_width="2dp"app:riv_corner_radius="25dp"app:riv_mutate_background="true"app:riv_oval="true"app:riv_tile_mode="repeat" />

 <com.makeramen.roundedimageview.RoundedImageViewandroid:id="@+id/imCompanyHeadItem"android:layout_width="50dp"android:layout_marginTop="10dp"android:layout_marginRight="6.5dp"android:layout_marginLeft="6.5dp"android:src="@drawable/head_home"android:layout_gravity="center"android:layout_height="50dp"app:riv_border_color="@color/_c7ced8"app:riv_border_width="1dp"app:riv_corner_radius_top_left="5dp"app:riv_corner_radius_bottom_right="5dp"app:riv_corner_radius_bottom_left="5dp"app:riv_corner_radius_top_right="5dp"app:riv_mutate_background="true"app:riv_oval="false"app:riv_tile_mode="repeat"/>

二.自定义RoundImageView

1.布局:

 <com.iruiyou.pet.utils.RoundImageViewandroid:id="@+id/headIv"android:layout_width="125dp"android:layout_height="125dp"android:layout_marginTop="92dp"android:src="@drawable/head_home"loonggg:border_incolor="#000fff"loonggg:border_outcolor="#fff000"loonggg:border_width="10dp"app:layout_constraintLeft_toLeftOf="parent"app:layout_constraintRight_toRightOf="parent"app:layout_constraintTop_toTopOf="parent"/>

2.自定义类:

import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.PorterDuff;
import android.graphics.PorterDuffXfermode;
import android.graphics.Rect;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.NinePatchDrawable;
import android.util.AttributeSet;
import android.widget.ImageView;
import com.iruiyou.pet.R;/*** 自定义圆形头像*/
public class RoundImageView extends ImageView {private int mBorderThickness = 0;private Context mContext;private int defaultColor = 0xFFFFFFFF;// 外圆边框颜色private int mBorderOutsideColor = 0;// 内圆边框颜色private int mBorderInsideColor = 0;// RoundImageView控件默认的长、宽private int defaultWidth = 0;private int defaultHeight = 0;public RoundImageView(Context context) {super(context);mContext = context;}public RoundImageView(Context context, AttributeSet attrs) {super(context, attrs);mContext = context;// 设置RoundImageView的属性值,比如颜色,宽度等setRoundImageViewAttributes(attrs);}public RoundImageView(Context context, AttributeSet attrs, int defStyle) {super(context, attrs, defStyle);mContext = context;setRoundImageViewAttributes(attrs);}// 从attr.xml文件中获取属性值,并给RoundImageView设置private void setRoundImageViewAttributes(AttributeSet attrs) {TypedArray a = mContext.obtainStyledAttributes(attrs,R.styleable.round_image_view);mBorderThickness = a.getDimensionPixelSize(R.styleable.round_image_view_border_width, 0);mBorderOutsideColor = a.getColor(R.styleable.round_image_view_border_outcolor, defaultColor);mBorderInsideColor = a.getColor(R.styleable.round_image_view_border_incolor, defaultColor);a.recycle();}// 具体解释:比如我自定义一个控件,怎么实现呢,以RoundImageView为例,首先是继承ImageView,然后实现其构造函数,在构造函数中,获取attr中的属性值(再次解释:这里获取的具体的这个属性的值是怎么来的呢?比如颜色和宽度,这个在attr.xml中定义了相关的名字,而在使用RoundImageView的xml布局文件中,我们会设置其值,这里需要用的值,就是从那里设置的),并设置在本控件中,然后继承onDraw方法,画出自己想要的图形或者形状即可/*** 这个是继承的父类的onDraw方法** onDraw和下面的方法不用管,基本和学习自定义没关系,就是实现怎么画圆的,你可以改变下面代码试着画三角形头像,哈哈*/@Overrideprotected void onDraw(Canvas canvas) {Drawable drawable = getDrawable();if (drawable == null) {return;}if (getWidth() == 0 || getHeight() == 0) {return;}this.measure(0, 0);if (drawable.getClass() == NinePatchDrawable.class)return;Bitmap b = ((BitmapDrawable) drawable).getBitmap();Bitmap bitmap = b.copy(Bitmap.Config.ARGB_8888, true);if (defaultWidth == 0) {defaultWidth = getWidth();}if (defaultHeight == 0) {defaultHeight = getHeight();}int radius = 0;// 这里的判断是如果内圆和外圆设置的颜色值不为空且不是默认颜色,就定义画两个圆框,分别为内圆和外圆边框if (mBorderInsideColor != defaultColor&& mBorderOutsideColor != defaultColor) {radius = (defaultWidth < defaultHeight ? defaultWidth: defaultHeight) / 2 - 2 * mBorderThickness;// 画内圆drawCircleBorder(canvas, radius + mBorderThickness / 2,mBorderInsideColor);// 画外圆drawCircleBorder(canvas, radius + mBorderThickness+ mBorderThickness / 2, mBorderOutsideColor);} else if (mBorderInsideColor != defaultColor&& mBorderOutsideColor == defaultColor) {// 这里的是如果内圆边框不为空且颜色值不是默认值,就画一个内圆的边框radius = (defaultWidth < defaultHeight ? defaultWidth: defaultHeight) / 2 - mBorderThickness;drawCircleBorder(canvas, radius + mBorderThickness / 2,mBorderInsideColor);} else if (mBorderInsideColor == defaultColor&& mBorderOutsideColor != defaultColor) {// 这里的是如果外圆边框不为空且颜色值不是默认值,就画一个外圆的边框radius = (defaultWidth < defaultHeight ? defaultWidth: defaultHeight) / 2 - mBorderThickness;drawCircleBorder(canvas, radius + mBorderThickness / 2,mBorderOutsideColor);} else {// 这种情况是没有设置属性颜色的情况下,即没有边框的情况radius = (defaultWidth < defaultHeight ? defaultWidth: defaultHeight) / 2;}Bitmap roundBitmap = getCroppedRoundBitmap(bitmap, radius);canvas.drawBitmap(roundBitmap, defaultWidth / 2 - radius, defaultHeight/ 2 - radius, null);}/*** 获取裁剪后的圆形图片* @param bmp* @param radius*            半径* @return*/public Bitmap getCroppedRoundBitmap(Bitmap bmp, int radius) {Bitmap scaledSrcBmp;int diameter = radius * 2;// 为了防止宽高不相等,造成圆形图片变形,因此截取长方形中处于中间位置最大的正方形图片int bmpWidth = bmp.getWidth();int bmpHeight = bmp.getHeight();int squareWidth = 0, squareHeight = 0;int x = 0, y = 0;Bitmap squareBitmap;if (bmpHeight > bmpWidth) {// 高大于宽squareWidth = squareHeight = bmpWidth;x = 0;y = (bmpHeight - bmpWidth) / 2;// 截取正方形图片squareBitmap = Bitmap.createBitmap(bmp, x, y, squareWidth,squareHeight);} else if (bmpHeight < bmpWidth) {// 宽大于高squareWidth = squareHeight = bmpHeight;x = (bmpWidth - bmpHeight) / 2;y = 0;squareBitmap = Bitmap.createBitmap(bmp, x, y, squareWidth,squareHeight);} else {squareBitmap = bmp;}if (squareBitmap.getWidth() != diameter|| squareBitmap.getHeight() != diameter) {scaledSrcBmp = Bitmap.createScaledBitmap(squareBitmap, diameter,diameter, true);} else {scaledSrcBmp = squareBitmap;}Bitmap output = Bitmap.createBitmap(scaledSrcBmp.getWidth(),scaledSrcBmp.getHeight(), Bitmap.Config.ARGB_8888);Canvas canvas = new Canvas(output);Paint paint = new Paint();Rect rect = new Rect(0, 0, scaledSrcBmp.getWidth(),scaledSrcBmp.getHeight());paint.setAntiAlias(true);paint.setFilterBitmap(true);paint.setDither(true);canvas.drawARGB(0, 0, 0, 0);canvas.drawCircle(scaledSrcBmp.getWidth() / 2,scaledSrcBmp.getHeight() / 2, scaledSrcBmp.getWidth() / 2,paint);paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));canvas.drawBitmap(scaledSrcBmp, rect, rect, paint);bmp = null;squareBitmap = null;scaledSrcBmp = null;return output;}/*** 画边缘的圆,即内圆或者外圆*/private void drawCircleBorder(Canvas canvas, int radius, int color) {Paint paint = new Paint();/* 去锯齿 */paint.setAntiAlias(true);paint.setFilterBitmap(true);paint.setDither(true);paint.setColor(color);/* 设置paint的 style 为STROKE:空心 */paint.setStyle(Paint.Style.STROKE);/* 设置paint的外框宽度 */paint.setStrokeWidth(mBorderThickness);canvas.drawCircle(defaultWidth / 2, defaultHeight / 2, radius, paint);}
}

3.res--values--attrs.xml文件

<?xml version="1.0" encoding="utf-8"?>
<resources><declare-styleable name="round_image_view"><attr name="border_width" format="dimension" /><attr name="border_incolor" format="color" /><attr name="border_outcolor" format="color"></attr></declare-styleable>
</resources>

三.第三方NiceImageView

1.效果图如下:

2.特点:

基于AppCompatImageView扩展

支持圆角、圆形显示

可绘制边框,圆形时可绘制内外两层边框

支持边框不覆盖图片

可绘制遮罩

3.基本用法:

 1. 添加JitPack仓库 在项目根目录下的 build.gradle 中添加仓库:

allprojects {repositories {...maven { url "https://jitpack.io" }}
}

2. 添加项目依赖

dependencies {implementation 'com.github.SheHuan:NiceImageView:1.0.5'
}

3. 在布局文件中添加CornerLabelView

<com.shehuan.niv.NiceImageViewandroid:layout_width="200dp"android:layout_height="200dp"android:layout_marginTop="10dp"android:src="@drawable/cat"app:border_color="#FF7F24"app:border_width="4dp"app:is_circle="true" />

4.支持的属性、方法

属性名 含义 默认值 对应方法
is_circle 是否显示为圆形(默认为矩形) false isCircle()
corner_top_left_radius 左上角圆角半径 0dp setCornerTopLeftRadius()
corner_top_right_radius 右上角圆角半径 0dp setCornerTopRightRadius()
corner_bottom_left_radius 左下角圆角半径 0dp setCornerBottomLeftRadius()
corner_bottom_right_radius 右下角圆角半径 0dp setCornerBottomRightRadius()
corner_radius 统一设置四个角的圆角半径 0dp setCornerRadius()
border_width 边框宽度 0dp setBorderWidth()
border_color 边框颜色 #ffffff setBorderColor()
inner_border_width 相当于内层边框(is_circle为true时支持) 0dp setInnerBorderWidth()
inner_border_color 内边框颜色 #ffffff setInnerBorderColor()
is_cover_src border、inner_border是否覆盖图片内容 false isCoverSrc()
mask_color 图片上绘制的遮罩颜色 不设置颜色则不绘制 setMaskColor()

可参考:https://github.com/SheHuan/NiceImageView

5.其它:

如果你需要实现类似钉钉的圆形组合头像,例如:

可以先生成对应的Bitmap,并用圆形的 NiceImageView 显示即可。如何生成组合Bitmap可以参考这里:CombineBitmap

四.如果你的项目中只有圆形的图片而不需要设置圆角图片的话,可以试试下面的第三方:

https://github.com/hdodenhof/CircleImageView

https://github.com/open-android/RoundedImageView

RoundedImageView设置各种圆形、方形头像相关推荐

  1. Android 第三方RoundedImageView设置各种圆形、方形头像

    Android 自定义CoolImageView实现QQ首页背景图片动画效果 一.第三方RoundedImageView 1.在Android Studio中,可进入模块设置中添加库依赖. 进入Mod ...

  2. php设置用户头像,php制作圆形用户头像的实例_自定义封装类源代码

    思路 使用图层的方法设计,共需要创建3个图像层 1.底层:最后生成的图像 2.真实用户头像:作为中间层,用户上传的真实头像图片 3.圆形蒙版:作为最上层,在蒙版中绘制圆形,并设置为透明 如图: 代码如 ...

  3. cocos creator shader 方形头像变为圆形头像

    将方形头像转变为圆形头像我起初的思路就是,先在一个图片上绘制一个在中心点带颜色的圆: 1:如果uv坐标在圆内的话就会和图片的颜色进行混合只不过混合的时候,带颜色的圆的插值为0,图片的插值为1 2:如果 ...

  4. 【HTML5】网页实用技巧3:将方形图片设置成圆形后,添加圆形虚线边框

    需要实现的效果:将原本是方形的图片,变成圆形,且添加一个圆形边框 实现思路: ①制作一个正方形div盒子,将图片放在div盒子里 ②将div盒子,设置边框样式 ③将盒子设置成圆形(利用 border- ...

  5. iOS开发 --制作圆形的头像(UIImage)

    有时候我们的应用需要登录,登录后的用户信息中有用户头像,以前使用的方形图片比较丑陋,现在基本所有的应用都是使用圆形都头像了,但是用户上传上来都图片不一定是圆形的(基本上都不是),这个时候就需要我们程序 ...

  6. 将王者荣耀头像设置成和微信头像不一样

    要将王者荣耀头像设置得和微信头像不一样怎么要做呢?因为游戏本身是无法自己设置头像的,所以玩家的头像都是和微信或者QQ相同,那么要怎么才能不一样呢?下面就来教程 这里以微信为例: 首先我们需要在微信的设 ...

  7. iOS制作圆形图片头像

    iOS制作圆形图片头像,两行代码就行了,很简单. self.aImage.layer.masksToBounds = YES; self.aImage.layer.cornerRadius = 40; ...

  8. 把方形头像切成圆形的头像工具类

    1.前言 现在很多的App的头像显示都改成的圆形的了,这样让人不会感觉生硬,像微信的公众号列表,易信的头像,来往的头像等等. 做为程序猿肯定要跟上这个技术,所以找到了这个工具函数 /*** Crops ...

  9. Android实现本地上传图片并设置为圆形头像

    我们在做项目的时候会用到圆形的图片,比如用户头像,类似QQ.用户在用QQ更换头像的时候,上传的图片都是矩形的,但显示的时候确是圆形的.那么这是如何实现的呢,下面我们就来探讨下吧. 先从本地把图片上传到 ...

最新文章

  1. 虚拟化中的SR-IOV
  2. Android实例RSS客户端开发(1)
  3. WebSocket 中的Netty
  4. STL中迭代器的作用,有指针为何还要迭代器
  5. 统计学习/机器学习常用小知识
  6. linux编译blas,Linux下安装BLAS,CBLAS,LAPACK
  7. c:forEach 如何输出序号
  8. c语言添加收支情况,C语言编写一个计算个人所得税的程序,要求输入收入金额,能够输...
  9. python通信原理_用python通过原始套接字发送scapy包
  10. bzoj 2752 9.20考试第三题 高速公路(road)题解
  11. 【报告分享】2020年数字政府新基建发展白皮书.pdf(附下载链接)
  12. NOIP模拟 整数划分(数论,质因数分解,状压DP)
  13. RunLoop已入门?不来应用一下?
  14. winpe 能否修复服务器系统盘,U盘WINPE、光盘WINPE系统(启动修复盘)制作图文教程...
  15. 9个超绚丽的HTML5 3D图片动画特效
  16. 百度地图绘制自定义区域
  17. MySQL Java的JDBC编程
  18. 英语语法笔记——名词性从句(三)
  19. android 分享给好友,如何将安卓手机安装的APP分享给好友简单方法分享
  20. ActiveX控件属性的下拉列表

热门文章

  1. x264压制4K HDR电影的vs转换脚本,由HDR到SDR
  2. JOIM:Android通过IPCamera通过互联网实时监控功能的实现
  3. 管理信息化企业如何开展品牌营销?
  4. 几个好看的CSS渐变色
  5. 睿智的目标检测53——Pytorch搭建YoloX目标检测平台
  6. 2020ICPC上海区域赛总结
  7. 建模竞赛省奖论文完整版+代码附录支撑材料
  8. 一种基于NTC热敏电阻测量的温度模块
  9. POI HSSFWorkbook导出Excel到本地电脑
  10. WSDM2023推荐系统论文集锦