一.先展示一下效果吧。

PorterDuffXfermode

上代码之前我们先来了解一个类PorterDuffXfermode。

使用 PorterDuff 模式可以创建一个图层混合模式,下面就是18中混合模式

// these value must match their native equivalents. See SkPorterDuff.hpublic enum Mode {/** [0, 0] */CLEAR       (0),/** [Sa, Sc] */SRC         (1),/** [Da, Dc] */DST         (2),/** [Sa + (1 - Sa)*Da, Rc = Sc + (1 - Sa)*Dc] */SRC_OVER    (3),/** [Sa + (1 - Sa)*Da, Rc = Dc + (1 - Da)*Sc] */DST_OVER    (4),/** [Sa * Da, Sc * Da] */SRC_IN      (5),/** [Sa * Da, Sa * Dc] */DST_IN      (6),/** [Sa * (1 - Da), Sc * (1 - Da)] */SRC_OUT     (7),/** [Da * (1 - Sa), Dc * (1 - Sa)] */DST_OUT     (8),/** [Da, Sc * Da + (1 - Sa) * Dc] */SRC_ATOP    (9),/** [Sa, Sa * Dc + Sc * (1 - Da)] */DST_ATOP    (10),/** [Sa + Da - 2 * Sa * Da, Sc * (1 - Da) + (1 - Sa) * Dc] */XOR         (11),/** [Sa + Da - Sa*Da,Sc*(1 - Da) + Dc*(1 - Sa) + min(Sc, Dc)] */DARKEN      (12),/** [Sa + Da - Sa*Da,Sc*(1 - Da) + Dc*(1 - Sa) + max(Sc, Dc)] */LIGHTEN     (13),/** [Sa * Da, Sc * Dc] */MULTIPLY    (14),/** [Sa + Da - Sa * Da, Sc + Dc - Sc * Dc] */SCREEN      (15),/** Saturate(S + D) */ADD         (16),OVERLAY     (17);

其中 Sa 代表source alpha ,即源 alpha 值 ,Da 代表 Destination alpha ,即 目标alpha值 ,Sc 代表 source color ,即源色值 ,Dc 代表 Destination color ,即目标色值,并且这所有的计算都以像素为单位,在某一种混合模式下,对每一个像素的alpha 和 color 通过对应算法进行运算,得出新的像素值,进行展示;具体的例子请网上寻找例子探索。

制作圆形头像

现在直接进入我们的主题---制作圆形头像!

从结果上来看应该需要一个圆,一张正方形的头像。

预想方法一:底部一个圆,然后在绘制一张头像在圆上,利用圆来限制头像的显示大小。

 public void initBitmap() {//禁用硬件加速器,因为有些硬件加速器不支持setLayerType(LAYER_TYPE_SOFTWARE, null);//设置抗锯齿mpaint = new Paint(Paint.ANTI_ALIAS_FLAG);mpaint.setColor(Color.YELLOW);
<span style="line-height: 21.06px;"><span style="white-space: pre;">   </span>//创建以头像为底图</span>
        mbitmap = BitmapFactory.decodeResource(getResources(), R.drawable.head);//以后的绘制都将显示在moutbitmap上面moutbitmap = Bitmap.createBitmap(mbitmap.getWidth(), mbitmap.getHeight(), Config.ARGB_8888);Canvas canvas_outbitmap = new Canvas(moutbitmap);//Dstcanvas_outbitmap.drawCircle(mbitmap.getWidth() / 2, mbitmap.getHeight() / 2, mbitmap.getWidth() / 2, mpaint);PorterDuffXfermode mode = new PorterDuffXfermode(Mode.SRC_IN);mpaint.setXfermode(mode);//Srccanvas_outbitmap.drawBitmap(mbitmap, 0, 0, mpaint);}
 @Overrideprotected void onDraw(Canvas canvas) {Log.i("clx", "onDraw");canvas.drawBitmap(moutbitmap, 0, 0, null);}

mbitmap = BitmapFactory.decodeResource(getResources(), R.drawable.head);
        //以后的绘制都将显示在moutbitmap上面
        moutbitmap = Bitmap.createBitmap(mbitmap.getWidth(), mbitmap.getHeight(), Config.ARGB_8888);
        Canvas canvas_outbitmap = new Canvas(moutbitmap);

创建一张BitMap图,大小为原图的大小mbitmap.getWidth(), mbitmap.getHeight()。

因为在直接在BitMap上修改,所以创建一个Canvas画布,new Canvas(moutbitmap),在该canvas上绘制相当于在刚创建的Bitmap上绘制。

接下来就在该画布上涂涂改改咯。

混合模式就是两个图层叠加绘制,所以首先先绘制目标图层(可以理解成最底下的图层)

canvas_outbitmap.drawCircle(mbitmap.getWidth() / 2, mbitmap.getHeight() / 2, mbitmap.getWidth() / 2, mpaint);

从参数来看绘制一个mbitmap大小的圆。

第二步就是把头像给混合上去。

需要什么样的混合模式首先要先设置,部分该mode的alpha是怎么混合了,直接看英文意思,Source In 就是接下来绘制源图层将限制在目标图层里。

PorterDuffXfermode mode = new PorterDuffXfermode(Mode.SRC_IN);
        mpaint.setXfermode(mode);

第三步:绘制源图层。

//Src
        canvas_outbitmap.drawBitmap(mbitmap, 0, 0, mpaint);

最后一步就是只需要把混合好的bitmap绘制到你的屏幕就好了。

 canvas.drawBitmap(moutbitmap, 0, 0, null);

-----待续------

“老师!!!,我还有另一种做法!!!!”

上面一种方法的最底层的图层是使用drawCircle绘制的,现在我们使用另一种方式,我们不用画圆,直接使用一张圆的图。

绘制的步骤差不多。

 // 从canvas层面去除锯齿canvas.setDrawFilter(mDrawFilter);canvas.drawColor(Color.TRANSPARENT);int sc = canvas.saveLayer(0, 0, mTotalWidth, mTotalHeight, null, Canvas.ALL_SAVE_FLAG);// 绘制波纹部分canvas.drawBitmap(mSrcBitmap, mSrcRect, mDestRect, mBitmapPaint);// 设置图像的混合模式mBitmapPaint.setXfermode(mPorterDuffXfermode);// 绘制遮罩圆canvas.drawBitmap(mMaskBitmap, mMaskSrcRect, mMaskDestRect, mBitmapPaint);mBitmapPaint.setXfermode(null);/*** canvas.saveLayer()方法会返回一个int值,用于表示layer的ID,* 在我们对这个新layer绘制完成后可以通过调用canvas.restoreToCount(layer)* 或者canvas.restore()把这个layer绘制到canvas默认的layer上去,这样就完成了一个layer的绘制工作。*/canvas.restoreToCount(sc);

这里就不分析了。

代码代码

圆形头像制作,仿QQ做法。相关推荐

  1. android qq 圆形头像,Android仿QQ圆形头像个性名片

    先看看效果图: 中间的圆形头像和光环波形讲解请看:https://www.jb51.net/article/96508.htm 周围的气泡布局,因为布局RatioLayout是继承自ViewGroup ...

  2. 视频教程-C# 实战项目——制作仿QQ软件-C#

    C# 实战项目--制作仿QQ软件 专注编程领域,拥有多年开发经验 王小科 ¥49.00 立即订阅 扫码下载「CSDN程序员学院APP」,1000+技术好课免费看 APP订阅课程,领取优惠,最少立减5元 ...

  3. 自定义圆形ImageView(仿QQ头像)

    我们可以发现,现在的app对圆形图片的使用越来越普遍,特别是用户的头像等.圆形图片外观柔和.友好.饱满,能大大提升用户的视觉体验.所以今天我们就来看看怎样自定义圆形的ImageView(一些说明与应该 ...

  4. android 模仿qq 上传头像,Android 仿qq上传头像(一)

    转载请注明出处http://blog.csdn.net/u014163726/article/details/44994197 这么长时间没写博客感觉手都要生了啊,最近因为工作的关系来到了上海,目前还 ...

  5. 制作仿“QQ秀”的虚拟形象

    http://www.knowsky.com/3657.html 不知大家有没有玩过"QQ秀"?玩过的话一定会想自己也做一个类似的功能.不过没有玩过也没关系,你可以看看下面的演示. ...

  6. android选择头像弹窗,仿QQ的头像选择弹出的对话框

    这个例子是点击按钮后,选择菜单会从屏幕底部慢慢弹出来,按菜单以外的屏幕,菜单会消失. 先看一下效果吧. 对话框布局xml文件如下: android:layout_width="match_p ...

  7. typecho本地上传头像_微信QQ抖音透明头像制作方法,还有不会的吗?

       精彩内容每天更新 她搂着被子从床上坐起来,愣了十几秒,听到厨房有动静后,这才撒着脚往房间外跑,看到一抹修长背影在厨房里忙活. 邵允琛做好早餐从厨房出来,见陆瑶穿着睡裙站那,眉头皱了皱," ...

  8. android mysql上传头像,Android自定义控件仿QQ编辑和选取圆形头像

    android大家都有很多需要用户上传头像的需求,有的是选方形,有的是圆角矩形,有的是圆形. 首先我们要做一个处理图片的自定义控件,把传入的图片,经过用户选择区域,处理成一定的形状. 有的app是通过 ...

  9. android 高仿qq,Android高仿QQ头像截取

    花费了半天时间,把 仿QQ头像截取的方法整理了下,并制作了一个demo以供大家参考,基本上实现了qq中我的资料界面上(包括背景透明化,上滑标题栏显示,下拉隐藏等)的大致效果,先上图看效果吧: 支持的功 ...

  10. Android:高仿QQ头像截取

    花费了半天时间,把 仿QQ头像截取的方法整理了下,并制作了一个demo以供大家参考,基本上实现了qq中我的资料界面上(包括背景透明化,上滑标题栏显示,下拉隐藏等)的大致效果,先上图看效果吧: 支持的功 ...

最新文章

  1. Python获取代码运行时间
  2. Linux 下zip包的压缩与解压
  3. git stash 强制恢复_开发中必须要掌握的 Git 技巧
  4. C# Settings使用小结
  5. 在MFC中创建动态控件的生成与响应
  6. ZOJ-1654 Place the Robots 拆行拆列构图+二分匹配 Or 最大独立点集+TLE
  7. 篡改referer_HTTP_REFERER的用法及伪造
  8. ASP.NET数据库编程入门
  9. 互联网架构,究竟为什么需要配置中心?
  10. python numpy array转置_Python numpy数组转置与轴变换
  11. 10倍,BoostKit鲲鹏全局缓存3大创新技术助力Ceph性能提升
  12. radiogroup多选_【RadioGroup】实现单选并获得所选项值 | 学步园
  13. python爬虫好学不_python爬虫难学吗
  14. DataFormatString 的使用
  15. 微信h5 支付,已经获得weixin://wap/pay?prepayid,但是无法调起微信客户端支付
  16. python去重txt文本_Python文本去重
  17. ps剪贴蒙版教程(ps创建剪贴蒙版步骤)
  18. Redis 数据丢失问题排查
  19. 香港理工大学计算机专业课程,香港理工大学计算机系包括哪些专业
  20. soul显示服务器异常,soul账号状态异常是什么意思?soul账号异常操作多久解封

热门文章

  1. 插上U盾计算机无法识别,U盾插入电脑后没反应,网上银行识别不了?
  2. 超级节点的困境,社区治理的尴尬 |链捕手
  3. 神经网络和深度学习简史(全)
  4. 计算机与网络技术 英语,计算机与网络英语词汇(S3)
  5. cad 打开硬件加速卡_Win10系统运行CAD不流畅解决方法
  6. 五年上市路,君亭才刚刚出发
  7. 腾讯java校招,09.26 腾讯校招前端一面经历
  8. Redhat 7.2 安装网卡驱动
  9. OpenGL教程——windows安装openGL
  10. Python中关于函数的操作