代码注释很多,简单说下思路,然后直接贴代码

1、截取选定图片中间区域(宽等于高的正方形)

2、按照控件大小进行缩放

3、画圆,设置paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN));

4、画图

package com.dyk.thebest.view;import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Bitmap.Config;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.PorterDuff.Mode;
import android.graphics.PorterDuffXfermode;
import android.graphics.Rect;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.util.Log;
import android.widget.ImageView;/*** 自定义圆形图片* <p>* 在<u><font color="#0000ff">onMeasure()</font></u>中强制设置控件的宽高一致 <br/>* 在<u><font color="#0000ff">getCroppedBitmap()</font></u>中截取图片中间区域并返回一个bitmap对象* * @author 一口仨馍**/
public class RoundImageView extends ImageView {public RoundImageView(Context context, AttributeSet attrs) {super(context, attrs);}public RoundImageView(Context context, AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);}@Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {super.onMeasure(widthMeasureSpec, heightMeasureSpec);// 强制设置圆形图片控件的宽高一致int min = Math.min(getMeasuredWidth(), getMeasuredHeight());setMeasuredDimension(min, min);}@Overrideprotected void onDraw(Canvas canvas) {Drawable drawable = getDrawable();if (drawable == null) {return;}if (getWidth() == 0 || getHeight() == 0) {return;}// 注意:此条语句不能智能提示,只能手动输入Bitmap b = ((BitmapDrawable) drawable).getBitmap();if (null == b) {return;}Bitmap bitmap = b.copy(Bitmap.Config.ARGB_8888, true);// 因为后来在onMeasure中强制设置了控件宽高相等,所以相当于下面的w强制等于h// min == w == h == sbmp.getWidth() == sbmp.getHeight()是成立的int w = getWidth(), h = getHeight();int min = Math.min(w, h);Bitmap roundBitmap = getCroppedBitmap(bitmap, min);canvas.drawBitmap(roundBitmap, 0, 0, null);}/*** 截取bmp中间区域的图像,并缩放至与视图宽高大小一致。画图。* * @param bmp*            Bitmap对象* @param min*            视图宽高的最小值,单位:px* @return bitmap*/public static Bitmap getCroppedBitmap(Bitmap bmp, int min) {// 截取后的bitmapBitmap squareBitmap;int bmpWidth = bmp.getWidth();int bmpHeight = bmp.getHeight();int squareWidth = 0, squareHeight = 0;int x = 0, y = 0;if (bmpHeight > bmpWidth) {// 高大于宽squareWidth = squareHeight = bmpWidth;x = 0;y = (bmpHeight - bmpWidth) / 2;// 截取正方形图片squareBitmap = Bitmap.createBitmap(bmp, x, y, squareWidth,squareHeight);} else if (bmpHeight < bmpWidth) {// 宽大于高squareWidth = squareHeight = bmpHeight;x = (bmpWidth - bmpHeight) / 2;y = 0;squareBitmap = Bitmap.createBitmap(bmp, x, y, squareWidth,squareHeight);} else {squareBitmap = bmp;}Bitmap sbmp;//对截取后的squareBitmap缩放至控件宽高if (squareBitmap.getWidth() != min || squareBitmap.getHeight() != min) {sbmp = Bitmap.createScaledBitmap(squareBitmap, min, min, false);} else {sbmp = squareBitmap;}Bitmap output = Bitmap.createBitmap(sbmp.getWidth(), sbmp.getHeight(),Config.ARGB_8888);Canvas canvas = new Canvas(output);final Paint paint = new Paint();//指定抠图/画图区域final Rect rect = new Rect(0, 0, sbmp.getWidth(), sbmp.getHeight());paint.setAntiAlias(true);paint.setFilterBitmap(true);paint.setDither(true);canvas.drawARGB(0, 0, 0, 0);//将内容以外的区域设置为完全透明的黑色paint.setColor(Color.parseColor("#BAB399"));canvas.drawCircle(sbmp.getWidth() / 2 + 0.7f,sbmp.getHeight() / 2 + 0.7f, min / 2 + 0.1f, paint);paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN));canvas.drawBitmap(sbmp, rect, rect, paint);return output;}
}

Android 自定义圆形图片相关推荐

  1. Android 自定义圆形图片 CircleImageView

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

  2. android 自定义圆形图片素材,Android 使用shape制作drawable素材

    Android开发中,资源文件中会有大量的图片素材文件,这样会额外增加APP的大小,有时面对对APP 大小有限制的,那就要考虑尽可能的对图片进行压缩处理或者减少资源文件中图片的数量,那么减少了资源素材 ...

  3. Android实现圆形图片

    一.概述 圆形图片现在越来越多应用于Android应用中, 但是用的最多的地方当属于, 头像的显示. 比如QQ, 新浪微博,微信中很多地方都是用了圆形头像,所以有必要深究一下. 二.圆形图片的实现方式 ...

  4. android自定义控件圆形图片

     属性: <com.example.mywechat11.MyCircleImageViewandroid:id="@+id/friend_head"android:layo ...

  5. Android自定义圆形进度条

    Android自定义圆形进度条 github地址:https://github.com/opq1289/CircleProgressView 效果图: 无动画: 有动画: 整圆: 切割圆: 具体步骤: ...

  6. 鸿蒙os事例代码,鸿蒙HarmonyOS App开发造轮子之自定义圆形图片组件的实例代码

    一.背景 在采用Java配合xml布局编写鸿蒙app页面的时候,发现sdk自带的Image组件并不能将图片设置成圆形,反复了翻阅了官方API手册(主要查阅了Compont和Image相关的API),起 ...

  7. Kotlin实战练习——自定义圆形图片三种实现方式

    Kotlin实战练习--自定义圆形图片三种实现方式 前言 如今Kotlin越来越重要,本人也开始了Kotlin的学习.为了检测学习效果,加深学习印象,同时回顾一下以前的一些知识点,决定从写一个自定义圆 ...

  8. Unity 自定义圆形图片

    使用Mask组件的缺点 我们知道项目中可以这样展示圆形图片,一般是Image组件,下面再加上一个圆形Mask.但是这样做有几个缺点: 使用Mask会额外消耗多一个Drawcall来创建Mask,做像素 ...

  9. android 自定义圆形pop,Android布局自定义Shap圆形ImageView可以单独设置背景与图片...

    一.图片预览: 一.实现功能: 需求要实现布局中为圆形图片,图片背景与图标分开且合并到一个ImageView. 二.具体实现: XML中布局中定义ImageView,关健设置两个参数 Android: ...

最新文章

  1. 安装linux 系统报错:No DEFAULT or UI configuration directive found 解决方法
  2. android设备获取wifi和蓝牙状态并进行打开或关闭操作
  3. win7 X64 编译ffmpeg
  4. java备忘录_Java 8备忘单中的可选
  5. ReentrantLock可重入锁
  6. IDEA JetBrains Mono字体介绍和安装
  7. matlab 1到无穷_从零开始的matlab学习笔记——(6)符号计算与极限
  8. 开了个股票模拟仓来玩玩
  9. 学以致用十四-----打造一个简单的vim IDE
  10. [CATARC_2017] 第三周 残四周
  11. vba 定义数组_excel自定义排序的三种方法
  12. 数据库课程设计练习- 视图的使用
  13. ​LeetCode刷题实战592:分数加减运算
  14. 乐山市计算机学校灵异事件,我也来说个以前上学时候的灵异事件
  15. 【解决】InsecureRequestWarning: Unverified HTTPS request is being made to host ‘www.dytt89.com‘.
  16. Maven setting文件配置错误:Non-parseable settings..in comment after two dashes (--) next character must be
  17. UVa Problem 10310 Dog and Gopher (狗拿地鼠)
  18. CAN 总线的常用拓扑
  19. 玩树莓派(raspberry pi) 2/3 raspbian的遇到的一些问题
  20. 分享105个PHP源码,总有一款适合您

热门文章

  1. 未找到beta版怎么解决_刚刚,谷歌正式发布Android 11 Beta版,带来多项重磅更新...
  2. javascript乘法和加法_JavaScript大数相加相乘的实现方法实例
  3. 数据库中的datatime的长度怎么设定_软件测试必备之数据库知识(一)
  4. php常见排序算去,PHP兑现常见排序算法
  5. mediawiki java api_维基百科 MediaWiki API 解析
  6. 微信小程序把繁琐的判断用Js简单的解决
  7. 【BZOJ1016】【Luogu P4208】 [JSOI2008]最小生成树计数 最小生成树,矩阵树定理
  8. CDN全站加速助力企业云上升级
  9. json的简单的数据格式
  10. elasticsearch-.yml(中文配置详解)