牙叔教程 简单易懂

效果展示

环境

手机: Mi 11 Pro
Android版本: 11
Autojs版本: 9.0.11
图片形状: 正方形

圆形头像的7种显示方法

第1种: 使用ShapeableImageView控件

备注: material版本最低要求1.2.0, 因为ShapeableImageView控件是在1.2.0才添加的

"ui";
importClass(android.view.ViewOutlineProvider);
importClass(android.content.res.ColorStateList);
importClass(com.google.android.material.shape.RelativeCornerSize);
importClass(com.google.android.material.shape.AbsoluteCornerSize);
importClass(com.google.android.material.shape.CornerFamily);
importClass(com.google.android.material.shape.ShapeAppearanceModel);
ui.layout(<vertical><com.google.android.material.imageview.ShapeableImageViewandroid:id="@+id/image"android:layout_width="110dp"android:layout_height="110dp"android:padding="0dp"margin="20dp"app:strokeColor="#ff0000"android:src="file://./yashu.png"/></vertical>
);imgView = ui.image;
imgView.shapeAppearanceModel = ShapeAppearanceModel.builder().setAllCornerSizes(ShapeAppearanceModel.PILL).build();
第2种: 使用setOutlineProvider设置view的轮廓

默认情况下,所有的view都是矩形的,虽然可以给view设置背景圆形的图片,即可以在界面显示出圆形的内容,但是view的大小实际上依然是矩形,并且设置的图片实际上也是矩形的,只是圆形以外的区域是透明色。

如果根据view大小来生成对应的阴影,就会出现很奇怪的效果,(一个看起来圆形的view展示出的却是一个矩形的阴影)为了解决这个问题,view增加了一个新的描述来指明内容显示的形状,这就是 轮廓

"ui";
importClass(android.view.ViewOutlineProvider);
ui.layout(<vertical><imgandroid:id="@+id/image"android:layout_width="110dp"android:layout_height="110dp"android:padding="0dp"margin="20dp"app:strokeColor="#ff0000"android:src="file://./yashu.png"/></vertical>
);
let img = $images.read("./yashu.png");
imgView = ui.image;
ui.post(function () {viewOutlineProvider = new ViewOutlineProvider({getOutline: function (view, outline) {outline.setRoundRect(0, 0, imgView.width, imgView.height, imgView.width / 2);},});imgView.setOutlineProvider(viewOutlineProvider);imgView.setClipToOutline(true);
});events.on("exit", function () {img.recycle();
});
第3种: 使用card控件

将cardCornerRadius设置为控件宽度的一半即可

ui.layout(<vertical margin="100"><card android:layout_width="100dp" android:layout_height="100dp" cardCornerRadius="50dp"><imgandroid:id="@+id/image"android:layout_width="100dp"android:layout_height="100dp"android:padding="0dp"app:strokeColor="#ff0000"android:src="file://./yashu.png"/></card></vertical>
);
第4种: 设置img控件的cornerRadius属性

和控件宽度一致即可, 注意控件的单位尺寸, 不带单位默认dp, dp和px可以互相转换

ui.layout(<vertical margin="100"><img id="image" src="file://./yashu.png" w="100" h="100" radius="30" scaleType="centerCrop" /></vertical>
);
imageView = ui.image;const scale = context.getResources().getDisplayMetrics().density;
const dp2px = (dp) => Math.floor(dp * scale + 0.5);ui.post(function () {imageView.attr("cornerRadius", dp2px(100)); //没反应imageView.invalidate();
});
第5种: 绘制控件时, 将显示区域裁剪为一个圆形,

使用setBackgroundDrawable给控件设置背景, 在draw事件发生时, 裁剪画板为圆形即可,
重写draw方法, 是自定义控件中最重要的内容之一.

ui.layout(<vertical margin="100"><View id="image" w="100" h="100" /></vertical>
);
imageView = ui.image;
let img = $images.read("./yashu.png");
bitmap = img.getBitmap();
const scale = context.getResources().getDisplayMetrics().density;
const dp2px = (dp) => Math.floor(dp * scale + 0.5);ui.post(function () {var drawable = new android.graphics.drawable.Drawable({draw: function (canvas) {let paint = new Paint();var path = new Path();path.addCircle(imageView.getWidth() / 2, imageView.getHeight() / 2, imageView.getWidth() / 2, Path.Direction.CCW);canvas.clipPath(path);dst = new Rect(0, 0, imageView.getWidth(), imageView.getHeight()); //截取图片左上1/4的区域canvas.drawBitmap(bitmap, null, dst, paint);},});imageView.setBackgroundDrawable(drawable);
});
第6种: 使用BitmapShader

将图片添加到shader, 再给画笔设置shader, 画笔在画板上画一个圆形即可

"ui";
importClass(android.graphics.Rect);
importClass(android.graphics.PorterDuffXfermode);
importClass(android.graphics.Path);
importClass(android.graphics.Xfermode);
importClass(android.graphics.Paint);
importClass(android.graphics.Bitmap);
importClass(android.graphics.BitmapShader);
importClass(android.graphics.Shader);
importClass(android.graphics.Matrix);
importClass(android.graphics.PorterDuff);
ui.layout(<vertical margin="100"><View id="image" w="100" h="100" /></vertical>
);
imageView = ui.image;
let img = $images.read("./yashu.png");
bitmap = img.getBitmap();
const scale = context.getResources().getDisplayMetrics().density;
const dp2px = (dp) => Math.floor(dp * scale + 0.5);ui.post(function () {var drawable = new android.graphics.drawable.Drawable({draw: function (canvas) {let paint = new Paint();radius = imageView.getWidth() / 2;bitmapShader = new BitmapShader(bitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);mScale = (radius * 2.0) / Math.min(bitmap.getHeight(), bitmap.getWidth());matrix = new Matrix();matrix.setScale(mScale, mScale);bitmapShader.setLocalMatrix(matrix);paint.setShader(bitmapShader);canvas.drawCircle(radius, radius, radius, paint);},});imageView.setBackgroundDrawable(drawable);
});
events.on("exit", function () {img.recycle();
});
第7种: 使用PorterDuffXfermode

实例化canvas时, 加入空图片作为实例参数,
然后绘制圆形, 再设置图层叠加模式为SRC_IN,

再绘制图片, 然后把canvas的画板内容保存为图片,
将该图片设置到img控件即可

"ui";
importClass(android.graphics.Rect);
importClass(android.graphics.RectF);
importClass(android.graphics.PorterDuffXfermode);
importClass(android.graphics.Path);
importClass(android.graphics.Xfermode);
importClass(android.graphics.Paint);
importClass(android.graphics.Bitmap);
importClass(android.graphics.PorterDuff);
ui.layout(<vertical margin="100"><img id="image" w="100" h="100" /></vertical>
);
imageView = ui.image;
let img = $images.read("./yashu.png");
bitmap = img.getBitmap();
const scale = context.getResources().getDisplayMetrics().density;
const dp2px = (dp) => Math.floor(dp * scale + 0.5);
let newImg;
ui.post(function () {let paint = new Paint();let mBitmap = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), Bitmap.Config.ARGB_8888);let canvas = new Canvas(mBitmap);let rect = new Rect(0, 0, img.getWidth(), img.getWidth());let rectF = new RectF(rect);let ratio = 2;canvas.drawRoundRect(rectF, img.getWidth() / ratio, img.getWidth() / ratio, paint);paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));let dst = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight()); //截取图片左上1/4的区域canvas.drawBitmap(bitmap, null, dst, paint);newImg = canvas.toImage();imageView.setImageBitmap(newImg.bitmap);
});events.on("exit", function () {img.recycle();newImg && newImg.recycle();
});

名人名言

思路是最重要的, 其他的百度, bing, stackoverflow, github, 安卓文档, autojs文档, 最后才是群里问问
— 牙叔教程

声明

部分内容来自网络
本教程仅用于学习, 禁止用于其他用途

bilibili

牙叔教程

微信公众号 牙叔教程

QQ群

747748653

圆形头像的7种显示方法相关推荐

  1. Flutter实现圆形头像的几种方法

    Flutter的ClipRect的使用场景 ClipRect可以用来裁剪容器内部的子元素,以避免超出容器的范围而溢出.常见的应用场景有: 将一个图像裁剪成不同形状,如圆形.方形.椭圆等: 将一个复杂的 ...

  2. Android 圆形头像的两种实现方式

    Android 圆形头像的两种实现方式 前言 这篇博客只是为了做一个记录而已,方便而后查询,核心代码都是直接采用鸿洋博客里面的代码的. 圆形头像在实际开发中实际很常见,一般来说,主要有两种实现方式: ...

  3. WordPress制作圆形头像友情链接页面的方法

    网上看见过很多种友情链接页面,我比较喜欢的是圆形头像的这种,先看看效果吧:传送门 就是这种上面是圆形的友链用户头像,下面是友链用户网站名,然后鼠标移上去头像会旋转,怎么实现这种效果呢?我在网上找了很多 ...

  4. android开启照相功能,Android打开系统相机并拍照的2种显示方法

    本文实例为大家分享了Android打开系统相机并拍照的具体实现代码,供大家参考,具体内容如下 目标效果: 第二张为点击第一个按钮拍照后显示的,比较模糊,第三章为点击第二个按钮拍照后显示的,比较清楚. ...

  5. Android imageview 圆形头像

    工作中经常用到圆形头像 有两种解决方法 1.处理bitmap /*** * 头像切成圆形显示* **/ public Bitmap toRoundBitmap(Bitmap bitmap) {//圆形 ...

  6. android 清空canvas部分内容_Android自定义View实现圆形头像效果

    在我们的APP中通常会遇到,展示圆形头像的需求,一般通过Glide就能实现,但是让我们做一个圆形头像,如果让我们自定义实现这种效果,该怎样做呢? 好,接下来本文通过三种方式来实现这种效果! 注意:这是 ...

  7. Andorid显示圆形图片的4种方式

    这篇博客主要讲解了Android实现圆形图片的4种方式. Android中并没有一个原生的控件,可以显示圆形或圆角图片,因此需要我们自己去定义这样一个控件. 实现圆形/圆角图片的核心思想,就是按照一定 ...

  8. Flutter的圆形头像四种简单用法

    文章目录 一.ClipOval 二.CircleAvatar 三.ClipRRect 四.Container+BoxDecoration 一.ClipOval 该方式属于绘图功能,只能简单的显示圆形头 ...

  9. android 头像简称,Android环信显示头像及昵称的简单方法

    在我们日常应用开发中,很多时候产品需要IM聊天功能.考虑到时间.难度等问题一般会选择集成一些比较稳定的第三方SDK来实现功能.最近的项目也有IM需求,因为之前用过环信,感觉还不错,所以就再次使用了环信 ...

最新文章

  1. IDEA 常用设置
  2. 32位汇编寄存器及汇编指令
  3. python中的@符号的作用
  4. C++和 C 的区别
  5. springboot入门(项目)
  6. c++ 检查缓冲大小与记录大小是否匹配_后端程序员不得不会的 Nginx 转发匹配规则...
  7. 如何通过 PL/SQL Developer 将 Excel 数据导入 Oracle 对应的表中
  8. oracle备份和还原
  9. leetcode183. 从不订购的客户(SQL)
  10. 任意占空比的方波程序
  11. 大学英语综合教程一 Unit 3 课文内容英译中 中英翻译
  12. 成都以前的计算机学校图片,成都计算机中职图片介绍
  13. java swing高仿qq聊天_GitHub - sxei/myqq: Java版SWing“高”仿QQ即时通聊天系统
  14. 使用R,ggplot2绘制NMDS图
  15. chrome浏览器无法登录印象笔记
  16. ecshop 模版写php,ecshop 模板直接使用运算符
  17. c语言y为奇数的关系表达,设y是int型,请写出y为奇数的关系表达式
  18. HTML圣诞树代码(动态音效)(我非原创作者,原作者是复旦大学的学长,如有侵权请联系)
  19. 三年前端开发面试经验加感悟(干货分享)
  20. 时之扉手游如何在电脑上玩 时之扉手游模拟器教程

热门文章

  1. win2008 r2 安装sqlserver 2000
  2. Intel NUC冥王峡谷
  3. dota改高清分辨率mark
  4. Codeforces 575C 状压+KM
  5. PSIM联合VS--PLL锁相环
  6. php readfile 中文,有关php readfile()函数的文章推荐10篇
  7. python绑定内核_进程绑定CPU
  8. 安卓移动办公软件_移动办公软件,是让老板喜欢还是员工喜欢?
  9. 想成为六西格玛黑带大师?这些你了解吗
  10. ERP与电子商务融合破冰