十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
Android应用开发中,很多头像都要求显示成圆形的,这就可以使用android的canvas、paint这些类来进行设置圆形,先设置paint的样式为圆形,然后把你要设置成圆形的图片重新赋值给paint这个类:canvas.drawBitmap(tempBmp, rect, rect, paint);
成都创新互联是网站建设专家,致力于互联网品牌建设与网络营销,专业领域包括成都网站设计、成都网站制作、电商网站制作开发、成都小程序开发、微信营销、系统平台开发,与其他网站设计及系统开发公司不同,我们的整合解决方案结合了恒基网络品牌建设经验和互联网整合营销的理念,并将策略和执行紧密结合,且不断评估并优化我们的方案,为客户提供全方位的互联网品牌整合方案!
核心代码如下(引用这位前辈:,我增加一些注释,原来是没有注释):
package com.liang.round;
import android.annotation.SuppressLint;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Bitmap.Config;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.PorterDuff;
import android.graphics.PorterDuffXfermode;
import android.graphics.Rect;
import android.view.View;
public class MyView extends View {
private Bitmap bmp = null;
private Paint paint = null;
public MyView(Context context) {
super(context);
// TODO Auto-generated constructor stub
paint = new Paint();//实例化画笔类
BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeResource(context.getResources(), R.drawable.test ,options);//获得你存放在drawable下的正方形图片
options.inJustDecodeBounds = false;
Bitmap tempBmp = BitmapFactory.decodeResource(context.getResources(), R.drawable.test ,options);//实例化一个bitmap图片类
int width = options.outWidth;
int height = options.outHeight;
int size = widthheight?height:width;//边框
int pos = (int)(size/2);
double radius = pos * Math.sin(45 * 180 / Math.PI);//半径
size = (int)(radius * 2);
pos = (int)(size/2);
bmp = Bitmap.createBitmap(size, size, Config.ARGB_8888);
Canvas canvas = new Canvas(bmp);
Rect rect = new Rect(0, 0, size, size);
paint.setAntiAlias(true);
canvas.drawCircle(pos, pos, (float)radius, paint);
paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_ATOP));
canvas.drawBitmap(tempBmp, rect, rect, paint);
tempBmp.recycle();
}
@SuppressLint("DrawAllocation")
@Override
protected void onDraw(Canvas canvas) {
// TODO Auto-generated method stub
super.onDraw(canvas);
if(bmp != null){
if(!bmp.isRecycled()){
canvas.drawBitmap(bmp, 100, 100, paint);
}
}
}
}
android中的imageview只能显示矩形的图片,这样一来不能满足我们其他的需求,比如要显示圆形的图片,这个时候,我们就需要自定义imageview了,其原理就是首先获取到图片的bitmap,然后进行裁剪圆形的bitmap,然后在ondraw()进行绘制圆形图片输出。
我们要实现的图片控件继承自 AppCompatImageView ,它是 ImageView 的子类,但提供了更好的兼容性,我们在此基础上添加了若干自定义的属性和方法以实现最终的 NiceImageView :
要实圆角或者圆形的显示效果,就是对图片显示的内容区域进行“裁剪”,只显示指定的区域即可。如何做呢?
一种比较直接的办法是这样的,由于图片是被绘制在画布上的,所以用 canvas 的 clipPath() 方法先将画布裁剪成指定形状,这样就能让图片按指定形状显示了,重新 draw() 方法即可:
这样使用 src 、 background 属性给ImageView设置显示的图片都能达到预期的显示效果。但是由于 clipPath() 方法不支持抗锯齿,图片边缘会有明显的毛糙感,体验并不理想,所以需要寻找其它方法。
另一种方法是使用图像的 Alpha 合成模式 ,即
PorterDuff 来实现, 官方文档 。这里我们使用其中的 DST_IN 模式。整个过程就是先绘制目标图像,也就是图片;再绘制原图像,即一个圆角矩形或者圆形,这样最终目标图像只显示和原图像重合的区域。
到这里就实现了显示为圆角或者圆形了。但是需要通过 src 属性或者对应的方法来设置图片,否则不能达到预期效果。
绘制边框就相对容易理解了,只需要绘制一个指定样式的圆角矩形或者圆形即可:
当图片显示为圆形时,还可以绘制一个内边框,但圆角矩形的话由于圆角大小的问题,目前只能设置一个边框咯。
但是有个问题,绘制的边框会覆盖在图片上,如果边框太宽会导致图片的可见区域变小了,影像显示效果,像这样,左下角的花盆不见了:
那么如何让边框不覆盖在图片上呢?可以在 Alpha 合成绘制前先将画布缩小一定比例,最后再绘制边框,这样问题就解决了。
缩放后的ImageView显示区域的宽高就是原宽、高分别减去2倍的边框宽度,这样缩小的比例也就显而易见了。效果如下,左下角的花盆出来了:
遮罩可以理解为一层带透明度的颜色,遮罩默认不绘制,当制定了遮罩颜色时才会绘制,实现很简单:
例如加一个透明度30%的红色遮罩后的效果:
核心的实现逻辑就这些了,剩下的就是自定义属性和方法了,有兴趣的可以看源码,都很简单,希望对你有所帮助吧!
更多细节及用法见GitHub:
如果你需要实现类似钉钉的圆形组合头像,例如:
话不多说 先上图
实现原理:
1、先画出中心进度问题
2、圆形进度灰色背景、圆形进度值带光晕
3、时钟刻度
github:
最近在苦练Kotlin,一款不错的app(开眼)中的布局吸引了我,也在不懈的努力下通过Kotlin语言完成了开眼首页的RecyclerView多ViewType布局效果,开心!(文末会贴出来)其中用到的图片处理控件很实用,也在日常的项目中会经常用到,因此安利给大家!
本次就针对Android开发中的图片处理给大家安利两个开源库:CircleImageView(圆形图片)+RoundedImageView(圆角图片)。
Tips: Kotlin实现,写完整个项目会分享git源码给大家!
没错,这是一个RecyclerView布局实现的~
Android 7.1 以上的原生 Android 系统,一些基于 AOSP 的第三方 ROM 也适用,例如 Lineage OS、OMNI ROM、Paranoid Android 等等
设备已经 root
启动器支持启用圆形图标规范,推荐 Pixel Launcher、Lawnchair、Nova Launcher 等等
需要用到的工具是 MT 文件管理器 2.0:
打开 MT 文件管理器,授予适当的权限后,定位至 /system/framework 目录,找到 framework-res.apk 这个文件并将其复制到内部储存备用。
点击备用的 framework-res.apk 文件,选择「查看」,在打开的界面定位至 resources.arsc 文件并打开。
请进行严格定位
在 resources.arsc 的目录中定位至 android - bool - bool 标签,然后点击右上角菜单输入关键字「Round」进行过滤。
决定谁圆谁方的就是它啦
找到 config_useRoundIcon 一项,将其数值从 false 修改为 true,然后保存并退出编辑,用于开启圆形图标规范的 framework-res.apk 文件就已经修改好了。
权限设置示意图
接下来我们要做的就是将修改后的 framework-res.apk 替换回去,这里建议大家先将它拷贝至 /system 目录下,修改权限为「-rw-r--r--」,然后再移动至 /system/framework 文件夹中进行替换。替换后重启手机,清除启动器数据或安装一个支持圆形图标规范的启动器就能看见效果。
一些适配了圆形图标的应用也会「换装」