android绘制圆形图片的两种方式

看下效果先
下面有完整的示例代码
使用BitmapShader(着色器)
我们在绘制view 的时候 就是小学上美术课 用水彩笔在本子上画画 使用着色器绘制圆形图片最简单的理解方式 就是把bitmap当做一种颜色 设置给paint ,paint都已经有颜色了 你想让它方了,圆了,扁了 还不是看你心情 canvas调用那个方法咯
实现的大致思路如下:
1. 创建一个类 继承imageView 重写onDraw()
2. 获取到bitmap图片
3. 计算图片的缩放比例 使用矩阵matrix 进行缩放
4. 创建BitmapShader着色器 设置缩放矩阵
5. paint设置着色器 绘制
具体实现 注释也标注的很清楚
private void shaderCircle(Canvas canvas){
//获取Drawable
Drawable resources=getDrawable();
float scale = 1.0f;//缩放比例
int mRadius=0;//圆的半径
if (resources instanceof BitmapDrawable){
//获取bitmap
Bitmap bitmap=((BitmapDrawable) resources).getBitmap();
if (bitmap==null) return;
// 获取bitmap宽高中的小值
int minBitMap = Math.min(bitmap.getWidth(), bitmap.getHeight());
//取view宽高中的小值 尽量保证图片内容的显示
int minValue=Math.min(getWidth(),getHeight());
//设置半径
mRadius=minValue/2;
//计算缩放比例 一定要*1.0f 因为int之间的计算结果会四舍五入0或1 效果就不美丽了
scale=minValue*1.0f/minBitMap;
//设置缩放比例
matrix.setScale(scale,scale);
/**
* 创建着色器 设置着色模式
* TileMode的取值有三种:
* CLAMP 拉伸 REPEAT 重复 MIRROR 镜像
*/
BitmapShader shader=new BitmapShader(bitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);
//设置矩阵
shader.setLocalMatrix(matrix);
paint.setShader(shader);
canvas.drawCircle(mRadius, mRadius, mRadius, paint);
}
}
使用Xfermode 设置图片相交模式
简单说呢 在一张画布上画了两张图片 这两张图的以怎样的方式显示出来 例如:只显示上层图片,只显示下层图片 ,显示两张图的交集部分 等等等
实现思路
1.创建一个空bitmap 根据这个bitmap创建一个Canvas
2.设置Canvas透明 画一个想要实现的形状
3.设置图形相交模式
4.获取图片资源 绘制到Canvas
实现代码
private Bitmap getCircleBitmap(){
Drawable drawable=getDrawable();
if (drawable instanceof BitmapDrawable) {
Paint paint=new Paint();
paint.setAntiAlias(true);
//获取资源图片
Bitmap bitmap = ((BitmapDrawable) drawable).getBitmap();
//创建空位图
Bitmap output=Bitmap.createBitmap(getWidth(),getHeight(),Bitmap.Config.ARGB_8888);
//创建画板
Canvas canvas=new Canvas(output);
//绘制整个画板为透明
canvas.drawColor(Color.TRANSPARENT);
paint.setColor(Color.WHITE);
//绘制圆角图片
if (type==ROUND){
canvas.drawRoundRect(new RectF(0, 0, getWidth(), getHeight()), mRound, mRound,paint);
}else{
//绘制圆形图片
//取view宽高中的小值 尽量保证图片内容的显示
int minValue = Math.min(getWidth(), getHeight());
//设置半径
mRadius = minValue / 2;
canvas.drawCircle(mRadius,mRadius,mRadius,paint);
}
//设置图形相交模式
paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
Rect src=new Rect(0,0,bitmap.getWidth(),bitmap.getHeight());
Rect dst=new Rect(0,0,output.getWidth(),output.getHeight());
canvas.drawBitmap(bitmap,src,dst,paint);
return output;
}
return null;
}
这个特别经典的图......
PorterDuff.Mode.CLEAR 清除画布上图像 PorterDuff.Mode.SRC 显示上层图像 PorterDuff.Mode.DST 显示下层图像 PorterDuff.Mode.SRC_OVER上下层图像都显示,上层居上显示 PorterDuff.Mode.DST_OVER 上下层都显示,下层居上显示 PorterDuff.Mode.SRC_IN 取两层图像交集部分只显示上层图像 PorterDuff.Mode.DST_IN 取两层图像交集部分,只显示下层图像 PorterDuff.Mode.SRC_OUT 取上层图像非交集部分 PorterDuff.Mode.DST_OUT 取下层图像非交集部分 PorterDuff.Mode.SRC_ATOP 取下层图像非交集部分与上层图像交集部分 PorterDuff.Mode.DST_ATOP 取上层图像非交集部分与下层图像交集部分 PorterDuff.Mode.XOR 取两层图像的非交集部分
参考文档
继承ImageVIew完成圆形和圆角图片控件的实现过程(使用着色器)
<declare-styleable name="CircleImage">
<attr name="imageRound" format="dimension"/>
<attr name="imageType">
<enum name="circle" value="0"/>
<enum name="round" value="1"/>
</attr>
</declare-styleable>
public class CircleImage extends ImageView {
private Matrix matrix;
private Paint paint;
private int mRound;//圆角度数
private int mRadius;//圆的半径
private int type;//控件类型
private final int CIRCLE=0;//圆形
private final int ROUND=1;//圆角
public CircleImage(Context context) {
super(context,null);
}
public CircleImage(Context context, AttributeSet attrs) {
super(context, attrs);
matrix=new Matrix();
paint=new Paint();
paint.setAntiAlias(true);
initAttrValues(context,attrs);
}
@Override
protected void onDraw(Canvas canvas) {
if (getDrawable() == null) {
return;
}
setShader();
if (type==CIRCLE){
canvas.drawCircle(mRadius, mRadius, mRadius, paint);
}else{
canvas.drawRoundRect(new RectF(0, 0, getWidth(), getHeight()), mRound, mRound,paint);
}
}
/**
* 初始化属性集合
* @param context
* @param attrs
*/
private void initAttrValues(Context context, AttributeSet attrs){
TypedArray typedArray=context.obtainStyledAttributes(attrs, R.styleable.CircleImage);
for (int i=0;i<typedArray.getIndexCount();i++){
int index=typedArray.getIndex(i);
switch (index){
case R.styleable.CircleImage_imageRound:
mRound =typedArray.getDimensionPixelSize(index,
(int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,10,getResources().getDisplayMetrics()));
break;
case R.styleable.CircleImage_imageType:
type=typedArray.getInt(index,CIRCLE);
break;
}
}
}
/**
* 设置着色器
*/
private void setShader() {
//获取Drawable
Drawable resources=getDrawable();
float scale = 1.0f;//缩放比例
if (resources instanceof BitmapDrawable) {
//获取bitmap
Bitmap bitmap = ((BitmapDrawable) resources).getBitmap();
if (bitmap == null) return;
//圆形
if (type==CIRCLE){
// 获取bitmap宽高中的小值
int minBitMap = Math.min(bitmap.getWidth(), bitmap.getHeight());
//取view宽高中的小值 尽量保证图片内容的显示
int minValue = Math.min(getWidth(), getHeight());
//设置半径
mRadius = minValue / 2;
//计算缩放比例 一定要*1.0f 因为int之间的计算结果会四舍五入0或1 效果就不美丽了
scale = minValue * 1.0f / minBitMap;
}else{
//比较view和图片宽高比例大的 要让缩放后的图片大于view
scale = Math.max(getWidth() * 1.0f / bitmap.getWidth(), getHeight()
* 1.0f / bitmap.getHeight());
}
//设置缩放比例
matrix.setScale(scale, scale);
/**
* 创建着色器 设置着色模式
* TileMode的取值有三种:
* CLAMP 拉伸 REPEAT 重复 MIRROR 镜像
*/
BitmapShader shader = new BitmapShader(bitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);
//设置矩阵
shader.setLocalMatrix(matrix);
//设置着色
paint.setShader(shader);
}
}
/**
* 测试转换效果 没什么卵用 可以删除
* @param event
* @return
*/
@Override
public boolean onTouchEvent(MotionEvent event) {
if (event.getAction()==MotionEvent.ACTION_DOWN){
if (type==CIRCLE){
mRound =10;
type=ROUND;
}else{
type=CIRCLE;
}
invalidate();
}
return super.onTouchEvent(event);
}
}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
# android绘制圆形图片
# android
# 绘制圆形
# Android裁剪图片为圆形图片的实现原理与代码
# Android中Glide加载圆形图片和圆角图片实例代码
# Android实现圆形图片的两种方式
# 详解Android中Glide与CircleImageView加载圆形图片的问题
# 分享一个Android设置圆形图片的特别方法
# Android编程绘制圆形图片的方法
# Android自定义View实现旋转的圆形图片
# Android实现圆形图片或者圆角图片
# Android使用自定义ImageView实现圆形图片效果
# Android实现圆形图片效果
# 着色器
# 只显示
# 两张
# 圆角
# 创建一个
# 两层
# 就不
# 镜像
# 有三种
# 四舍五入
# 居上
# 两种
# 你想
# 看你
# 重写
# 要让
# 很清楚
# 让它
# 用水
# 最简单
相关文章:
岳西云建站教程与模板下载_一站式快速建站系统操作指南
如何在Golang中处理模块冲突_解决依赖版本不兼容问题
香港服务器建站指南:免备案优势与SEO优化技巧全解析
宝塔面板创建网站无法访问?如何快速排查修复?
黑客入侵网站服务器的常见手法有哪些?
完全自定义免费建站平台:主题模板在线生成一站式服务
如何在VPS电脑上快速搭建网站?
学校建站服务器如何选型才能满足性能需求?
如何在万网自助建站平台快速创建网站?
如何快速生成ASP一键建站模板并优化安全性?
小米网站链接制作教程,请问miui新增网页链接调用服务有什么用啊?
北京建设网站制作公司,北京古代建筑博物馆预约官网?
C#怎么创建控制台应用 C# Console App项目创建方法
建站之星代理平台如何选择最佳方案?
官网网站制作腾讯审核要多久,联想路由器newifi官网
如何快速查询网站的真实建站时间?
如何通过cPanel快速搭建网站?
微信h5制作网站有哪些,免费微信H5页面制作工具?
网站制作价目表怎么做,珍爱网婚介费用多少?
建站之星伪静态规则如何正确配置?
如何用AWS免费套餐快速搭建高效网站?
重庆市网站制作公司,重庆招聘网站哪个好?
如何选择高效稳定的ISP建站解决方案?
建站之星如何通过成品分离优化网站效率?
,怎么在广州志愿者网站注册?
如何用PHP快速搭建高效网站?分步指南
香港代理服务器配置指南:高匿IP选择、跨境加速与SEO优化技巧
小程序网站制作需要准备什么资料,如何制作小程序?
如何快速搭建高效可靠的建站解决方案?
极客网站有哪些,DoNews、36氪、爱范儿、虎嗅、雷锋网、极客公园这些互联网媒体网站有什么差异?
建站之星官网登录失败?如何快速解决?
用v-html解决Vue.js渲染中html标签不被解析的问题
黑客如何通过漏洞一步步攻陷网站服务器?
公司网站制作需要多少钱,找人做公司网站需要多少钱?
logo在线制作免费网站在线制作好吗,DW网页制作时,如何在网页标题前加上logo?
网页设计网站制作软件,microsoft office哪个可以创建网页?
哪家制作企业网站好,开办像阿里巴巴那样的网络公司和网站要怎么做?
建站之星CMS建站配置指南:模板选择与SEO优化技巧
如何快速查询域名建站关键信息?
jQuery 常见小例汇总
在线制作视频的网站有哪些,电脑如何制作视频短片?
安徽网站建设与外贸建站服务专业定制方案
建站之星3.0如何解决常见操作问题?
在线ppt制作网站有哪些软件,如何把网页的内容做成ppt?
定制建站如何定义?其核心优势是什么?
建站之星如何防范黑客攻击与数据泄露?
免费制作统计图的网站有哪些,如何看待现如今年轻人买房难的情况?
如何选择可靠的免备案建站服务器?
公司网站的制作公司,企业网站制作基本流程有哪些?
如何在建站主机中优化服务器配置?
*请认真填写需求信息,我们会在24小时内与您取得联系。