1.使用Xfermode 相交模式

见:http://blog.csdn.net/zcn596785154/article/details/79180145

2.通过裁剪画布区域实现

Canvas类提供了ClipPath, ClipRect, ClipRegion 等方法来裁剪画布,通过他们的不同组合,可以得到任意形状的画布,然后在这个区域上画图,就可以获得对应形状的View了。但是,使用裁剪画布的方式实现圆形头像会有锯齿,边缘不如其他方式平滑。代码如下:

//为了保证绘制出来的View为圆形,如果图片的长宽不一致,长的部分会被截断
​@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {super.onMeasure(widthMeasureSpec, heightMeasureSpec);int mSize = Math.min(getMeasuredWidth(), getMeasuredHeight());mRadius = mSize / 2;setMeasuredDimension(mSize, mSize);
}@Override
protected void onDraw(Canvas canvas) {mPath.addCircle(mRadius, mRadius, mRadius, Path.Direction.CW);canvas.clipPath(mPath);super.onDraw(canvas);
}

3.使用BitmapShader

Shader就是画笔Paint的渲染器,本质上这种方法其实是画圆,只是渲染时采用了我们设置的图片。

BitmapShader是Shader的子类,可以通过Paint.setShader(Shader shader)进行设置,然后用这个Paint绘图时,就会根据你设置的TileMode,对绘制区域进行着色。BitmapShader的构造方法:
mBitmapShader = new BitmapShader(bitmap, TileMode.CLAMP, TileMode.CLAMP);

参数TileMode的取值有三种:
- CLAMP 拉伸:拉伸的是图片最后的那一个像素
- REPEAT 重复:就是横向、纵向不断重复这个bitmap
- MIRROR 镜像:横向、纵向不断翻转重复

代码示例如下:

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {super.onMeasure(widthMeasureSpec, heightMeasureSpec);mSize = Math.min(getMeasuredWidth(), getMeasuredHeight());mRadius = mSize / 2;setMeasuredDimension(mSize, mSize);
}@Override
protected void onDraw(Canvas canvas) {//得到原bitmapBitmap src = ((BitmapDrawable) getDrawable()).getBitmap();if (src == null) {super.onDraw(canvas);return;}//把bitmap缩小为和View大小一致Bitmap newBitmp = Bitmap.createScaledBitmap(src, mSize, mSize, false);if (newBitmp == null) {return;}//将缩小后的bitmap设置为画笔的shadermBitmapShader = new BitmapShader(newBitmp, Shader.TileMode.REPEAT,Shader.TileMode.REPEAT);//生成用来绘图的bitmap,并在其上用画笔绘图Bitmap dest = Bitmap.createBitmap(mSize, mSize, Bitmap.Config.ARGB_8888);if (dest == null) {return;}Canvas c = new Canvas(dest);Paint paint = new Paint();paint.setAntiAlias(true);paint.setShader(mBitmapShader);c.drawCircle(mRadius, mRadius, mRadius, paint);//将最后生成的bitmap绘制到View的canvas上canvas.drawBitmap(dest, 0, 0, paint);
}

Android绘制圆形图片的方法相关推荐

  1. android绘制圆形图片、圆圈以及图片缩放

    这两天做开发,需要将图片资源做成圆形,并且要对图片进行缩放,研究了半天,终于整出来了,效果如下: 代码如下: package com.android.mywidget; import android. ...

  2. android 绘制圆形图片

    1.自定义CircleImageView,加载即可使用 import android.content.Context; import android.content.res.TypedArray; i ...

  3. android glide圆形图片,Glide原生方法加载圆形图片

    项目中需要用圆形图片,我们知道,Android原生是没有好用的圆形图片的,何况还要网络加载什么的.今天找了下Glide加载圆形图片的方法,基本都是这种,说得倒是很明白的,但是我自己加载时候没有找到相应 ...

  4. Android 自定义圆形图片 CircleImageView

    1.效果预览 1.1.布局中写自定义圆形图片的路径即可 1.2.然后看一看图片效果 1.3.原图是这样的 @mipmap/ic_launcher 2.使用过程 2.1.CircleImageView源 ...

  5. android xml 圆形图片,Android ImageView实现圆角,圆形图片

    UI设计中,为了有更好的效果,用户的头像很多以圆形方式显示,其实现的步骤 1 在res/values/attrs中添加 2 自定义View,CustomImageView.java package c ...

  6. Android 绘制圆形进度条

    Android 绘制圆形进度条 最近项目上有一些需求,需要绘制圆形的进度条满足设计上和交互上的需求: 实现思路 在画布上直接绘制View,需要了解一下几点 1.需要画一个圆 2.圆圈上有不同进度的颜色 ...

  7. quartz2D 如何绘制圆形图片, 及圆环图片

    转载自:http://www.cnblogs.com/yuwei0911/p/5277886.html -(void)touchesBegan:(NSSet<UITouch *> *)to ...

  8. UIImageView绘制圆形图片

    参考网上的资料,自实现了一个UIImageView绘制圆形图片功能. 先看效果: 代码如下: - (void)buttonAction:(id)sender { //方式1,见上图的方式1效果.通过i ...

  9. 如何在html5中实现多圆,JavaScript与html5如何实现canvas绘制圆形图案的方法介绍

    这篇文章主要介绍了js+html5实现canvas绘制圆形图案的方法,涉及html5图形绘制的基础技巧,需要的朋友可以参考下 本文实例讲述了js+html5实现canvas绘制圆形图案的方法.分享给大 ...

最新文章

  1. 多目标跟踪(MOT)入门
  2. 曾经百度大佬吹过的牛实现了,看完这个,带你搞定AI前沿技术
  3. dede使用方法----如何调用最新文章,最热文章,友情链接
  4. python数据导出excel_python 数据生成excel导出(xlwt,wlsxwrite)代码实例
  5. Modules(最小树形图)
  6. 《图解 HTTP》读书笔记(未完待续)
  7. SpringBoot创建项目入门案例
  8. sql怎么撤回update_腾讯SQL“现役运动员”给你的实践小技巧
  9. 【实践驱动开发3-004】TI WL1835MODCOM8 在android的移植 - 系统结构初始化和参考列表
  10. iptables总结--理解四表五链/snat/dnat/redirect/synproxy/性能
  11. Use Amazon VM to try Openstack (1) (with DevStack)
  12. linux之切换用户su(switch user)
  13. zabbix 邮件报警配置
  14. AtCoder Beginner Contest 083
  15. android 关联按键和坐标,给大家分享一个,按键精灵安卓版,找多图, 以及找多图返回多个坐标的,相信大家绝对用得到 _ 按键精灵手机版 - 按键精灵论坛...
  16. [2022 Google开发者大会] 机器学习-TensorFlow会议记录
  17. 姿态估计1-03:FSA-Net(头部姿态估算)-白话给你讲论文-翻译无死角(1)
  18. 几个免费好用的IP查询接口
  19. Java 用键盘输入 int型 String型 char型数据 示例:简单计算功能 eclipse
  20. pageX,clientX,offsetLeft,scrollLeft的区别

热门文章

  1. 【Python】Python安装cv2库
  2. google三篇论文之GFS
  3. 2023/2/16/day1
  4. Windows11打开IE模式提示“找不到Internet Explorer”怎么办
  5. 基于 SpringBoot + Vue 的在线课堂前后端分离项目
  6. gradle不同版本下载太慢---腾讯做了国内镜像可以直接下载
  7. 常见的CSS字体样式属性/font-size/font-family/font-weight/font-style/font综合属性/@font-face属性/学习笔记
  8. [法语] 讲法语的42个国家与地区
  9. 2022金领奖“中国杰出青年创新50人”评选启动,寻找优秀企业领袖
  10. Go 新关键字 any,interface 会成历史吗?