Android简单制作自定义圆形头像
第一步创建ReundImageView类
/** * 圆形ImageView,可设置最多两个宽度不同且颜色不同的圆形边框。 * 设置颜色在xml布局文件中由自定义属性配置参数指定 */ public class RoundImageView extends ImageView {private int mBorderThickness = 0; private Context mContext; private int defaultColor = 0xFFFFFFFF; // 如果只有其中一个有值,则只画一个圆形边框 private int mBorderOutsideColor = 0; private int mBorderInsideColor = 0; // 控件默认长、宽 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; setCustomAttributes(attrs); }public RoundImageView(Context context, AttributeSet attrs, int defStyle) {super(context, attrs, defStyle); mContext = context; setCustomAttributes(attrs); }private void setCustomAttributes(AttributeSet attrs) {TypedArray a = mContext.obtainStyledAttributes(attrs,R.styleable.roundedimageview); mBorderThickness = a.getDimensionPixelSize(R.styleable.roundedimageview_border_thickness, 0); mBorderOutsideColor = a.getColor(R.styleable.roundedimageview_border_outside_color,defaultColor); mBorderInsideColor = a.getColor(R.styleable.roundedimageview_border_inside_color, defaultColor); }@Override protected 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(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 */ 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(), 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(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); } }
第二步在values目录下创建attr.xml文件
<?xml version="1.0" encoding="utf-8"?> <resources> <declare-styleable name="roundedimageview"> <attr name="border_thickness" format="dimension" /> <attr name="border_inside_color" format="color" /> <attr name="border_outside_color" format="color"></attr> </declare-styleable> </resources>
第三步在Activity写下面代码就可以了,注意:com.example.careycai.demo.ReundImageView一定改成自己路径
<!-- 没有指定圆形ImageView属性时,默认没有外边圆颜色 --> <!-- 需要将图片资源自定为src ,或在程序中setImageResource(res) 不能设置background为图片,这样不能达到圆形效果--> <!-- border_outside_color 外部圆圈的颜色 --> <!-- border_inside_color 内部部圆圈的颜色 --> <!-- border_thickness 外圆和内圆的宽度 --> <com.example.careycai.demo.RoundImageView android:layout_width="100dp" android:layout_height="100dp" android:src="@drawable/android" imagecontrol:border_inside_color="#bc0978" imagecontrol:border_outside_color="#ba3456" imagecontrol:border_thickness="1dp" /> <com.example.careycai.demo.RoundImageView android:id="@+id/tu" android:layout_width="100dp" android:layout_height="100dp" android:layout_alignParentTop="true" android:layout_centerHorizontal="true" android:layout_gravity="center_vertical" android:src="@drawable/android" />
Android简单制作自定义圆形头像相关推荐
- android分析之自定义圆形头像
package de.hdodenhof.circleimageview; public class CircleImageView extends ImageView { private stati ...
- android 自定义圆形头像,android自定义圆形头像
这几天看了项目框架里面的圆形头像,发现其实这个东西并不是很难的东西,学会了原理,无论圆形头像,五角星头像都可以实现. 目前我上传的Demo里用了两种实现方式,那么我们分别来讲讲这两种实现方式: Bit ...
- ios/Android工程:自定义圆形/扇形运动轨迹,cos\sin值的简单运用
ios/Android工程:利用cos\sin函数创建圆形轨迹 设备/引擎:Mac(11.6)/cocos 开发工具:Xcode(13.0) 开发需求:利用cos\sin函数创建圆形轨迹,并让元素按给 ...
- Android使用 CircleImageView 实现圆形头像的方法
圆形头像看起来非常美观,下文通过实例代码给大家介绍android中使用CircleImageView实现圆形头像的方法,一起看看吧 有时我们在应用中会用到圆形头像,下面是利用CircleImageVi ...
- android圆形头像 demo,Android图像处理之绘制圆形头像
在Android中,绘制圆形和绘制图片都是很容易的事情,但是绘制圆形图片就有点难倒人了.以前为了偷懒就直接去github上找一个开源项目,后来才发现绘制圆形图片其实也是很简单的事.绘制圆形图片也需要两 ...
- android 自定义 theme,为Android手机制作自定义主题
我是一名新的移动开发人员,我知道如何在应用程序上放置主题,到目前为止,我已经能够制作2个移动应用程序,但我想尝试为手机制作自定义主题.我想知道是否有人对以下内容有想法. 1.how to make a ...
- android简单的自定义涂鸦控件
简单的自定义涂鸦控件,没有写自定义属性 java代码中找到view后直接setBitmap(Bitmap bitmap)后就可以使用了 提供清除方法clear() 保存可以参考另一篇view转bitm ...
- 圆形头像 android,android 一个简单的实现圆形头像的Demo
[实例简介] [实例截图] [核心代码] package davidzoomimageviewrounddemo.qq986945193.com.davidzoomimageviewrounddemo ...
- Android中快速自定义圆形ImageView图形!
一.问题在哪里? 问题来源于app开发中一个很常见的场景--用户头像要展示成圆的: 二.怎么搞? 机智的我,第一想法就是,切一张中间圆形透明.四周与底色相同.尺寸与头像相同的蒙板图片,盖在 ...
- java登录界面圆形头像_自定义圆形头像
在很多应用中,我们看到,个人主页里面的头像一般都是圆的,设计成圆的会使整个界面布局变的优雅漂亮.那么,怎么使头像变圆呢?有的人说可以在上面加一个中间为透明圆形的png图,用它来遮盖住头像不就行了嘛,但 ...
最新文章
- smarty_modifier_truncate,无或者有md_substr的情况下都能正确截取字符串的php函数,可用于smarty。...
- IOS开发之OC-Switf 混编 -(OC 引 Swift 文件)
- 【unity】简要分析yield及协同程序的用法
- linux automake-1.16 编译错误 Try `--no-discard-stderr' if option outputs to stderr
- 在想要放弃的时候想想是什么在支撑着你走到了这一步。
- 信息安全系统设计基础第一周学习总结
- 使用Docker分分钟启动常用应用
- Linux网络编程---I/O复用模型之select
- python学习---语法
- swagger2 注解说明文档
- mvc三层架构_Java架构-代码分层的设计之道
- 数据结构与算法之三直接插入排序
- 普惠AI,将是开发者下一个风口吗?看看他们怎么说
- 030_磁盘调度策略比较
- 2 数据可视化大屏 - 布局
- 简单socket聊天小程序+socket简单封装
- 5G.gNB——eNB的变身
- android 全景拼接软件,这款全景图片拼接软件很强大
- 大数据预处理之数据集成
- 开机后黑屏看不到桌面_电脑开机黑屏只有鼠标怎么办?电脑开机后不显示桌面的多种解决方法...