转载自:http://blog.csdn.NET/lmj623565791/article/details/24555655
自定义View实现圆角和圆形的效果:

核心代码

/*** 根据原图和变长绘制圆形图片** @param _bitmap* @param _min* @return*/private Bitmap createCircleImage(Bitmap _bitmap, int _min) {Paint _paint = new Paint();_paint.setAntiAlias(true);Bitmap _target = Bitmap.createBitmap(_min, _min, Bitmap.Config.ARGB_8888);//产生一个同样大小的画布Canvas _canvas = new Canvas(_target);//首先绘制圆形_canvas.drawCircle(_min / 2, _min / 2, _min / 2, _paint);//使用SRC_IN_paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));//绘制图片_canvas.drawBitmap(_bitmap, 0, 0, _paint);return _target;}

其实主要靠:paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));这行代码,为什么呢,我给大家解释下,SRC_IN这种模式,两个绘制的效果叠加后取交集展现后图,怎么说呢,咱们第一个绘制的是个圆形,第二个绘制的是个Bitmap,于是交集为圆形,展现的是BItmap,就实现了圆形图片效果。圆角,其实就是先绘制圆角矩形,是不是很简单,以后别人再说实现圆角,你就把这一行代码给他就行了。
从Android的示例中,给大家证明一下:
下面有一张PorterDuff.Mode的16中效果图,咱们的只是其一:

源码咱们只关心谁先谁后绘制的:

canvas.translate(x, y);
canvas.drawBitmap(mDstB, 0, 0, paint);
paint.setXfermode(sModes[i]);
canvas.drawBitmap(mSrcB, 0, 0, paint);
paint.setXfermode(null);
canvas.restoreToCount(sc);

可以看出先绘制的Dst,再绘制的Src,最后的展示是SrcIn那个图:显示的区域是二者交集,展示的是Src(后者)。和咱们前面结论一致。效果16种,大家可以自由组合展示不同的效果。

一、自定义属性

<declare-styleable name="CustomCircleImage"><attr name="borderRadius" format="dimension" /><attr name="type"><enum name="circle" value="0" /><enum name="round" value="1" /></attr><attr name="src" format="reference" /></declare-styleable>

二、构造函数中获取属性

private int mType;private static final int TYPE_CIRCLE = 0;private static final int TYPE_ROUND = 1;//图片private Bitmap mBitmap;//圆角的大小private int mRadius;//控件的宽度private int mWidth;//控件的高度private int mHeight;public CustomCircleImage(Context context) {this(context, null);}public CustomCircleImage(Context context, AttributeSet attrs) {this(context, attrs, 0);}public CustomCircleImage(Context context, AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);initAttrs(context, attrs);}private void initAttrs(Context context, AttributeSet attrs) {TypedArray _typedArray = context.obtainStyledAttributes(attrs, R.styleable.CustomCircleImage);mRadius = (int) _typedArray.getDimension(R.styleable.CustomCircleImage_borderRadius, 10);mType = _typedArray.getInt(R.styleable.CustomCircleImage_type, 0);mBitmap = BitmapFactory.decodeResource(getResources(), _typedArray.getResourceId(R.styleable.CustomCircleImage_src, 0));_typedArray.recycle();}

三、onMeasure方法

@Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {super.onMeasure(widthMeasureSpec, heightMeasureSpec);mWidth = getOnMeasure(widthMeasureSpec);mHeight = getOnMeasure(heightMeasureSpec);setMeasuredDimension(mWidth, mHeight);}private int getOnMeasure(int _measureSpec) {int _size = 100;int _measureMode = View.MeasureSpec.getMode(_measureSpec);int _measureSize = View.MeasureSpec.getSize(_measureSpec);if (MeasureSpec.EXACTLY == _measureMode) {_size = _measureSize;}return _size;}

四、onDraw方法

@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);switch (mType) {//如果是绘制圆形case TYPE_CIRCLE://长度如果不一致,则按照小的进行压缩int _min = Math.min(mWidth, mHeight);mBitmap = Bitmap.createScaledBitmap(mBitmap, _min, _min, false);canvas.drawBitmap(createCircleImage(mBitmap, _min), 0, 0, null);break;case TYPE_ROUND:canvas.drawBitmap(createRoundImage(mBitmap), 0, 0, null);break;}}/*** 根据原图和变长绘制圆形图片** @param _bitmap* @param _min* @return*/private Bitmap createCircleImage(Bitmap _bitmap, int _min) {Paint _paint = new Paint();_paint.setAntiAlias(true);Bitmap _target = Bitmap.createBitmap(_min, _min, Bitmap.Config.ARGB_8888);//产生一个同样大小的画布Canvas _canvas = new Canvas(_target);//首先绘制圆形_canvas.drawCircle(_min / 2, _min / 2, _min / 2, _paint);//使用SRC_IN_paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));//绘制图片_canvas.drawBitmap(_bitmap, 0, 0, _paint);return _target;}/*** 根据原图添加圆角** @param _bitmap* @return*/private Bitmap createRoundImage(Bitmap _bitmap) {Paint _paint = new Paint();_paint.setAntiAlias(true);Bitmap _target = Bitmap.createBitmap(mWidth, mHeight, Bitmap.Config.ARGB_8888);//产生一个同样大小的画布Canvas _canvas = new Canvas(_target);RectF rect = new RectF(0, 0, _bitmap.getWidth(), _bitmap.getHeight());_canvas.drawRoundRect(rect, mRadius, mRadius, _paint);_paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));_canvas.drawBitmap(_bitmap, 0, 0, _paint);return _target;}

五、布局中使用

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"android:layout_width="match_parent"android:layout_height="match_parent"><com.millet.myblogexercise.CustomCircleImage.CustomCircleImage
        android:layout_width="match_parent"android:layout_height="match_parent"app:src="@mipmap/d"app:type="circle" /></RelativeLayout>

Android实现圆角和圆形相关推荐

  1. android fresco 圆角,Fresco 圆形 圆角 动图

    添加依赖: compile 'com.facebook.fresco:fresco:0.12.0' // 支持 GIF 动图,需要添加 compile 'com.facebook.fresco:ani ...

  2. Android BitmapShader 实战 实现圆形、圆角图片

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/41967509,本文出自:[张鸿洋的博客] 1.概述 记得初学那会写过一篇博客An ...

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

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

  4. Android BitmapShader实现圆角、圆形ImageView

    项目中,有时候我们会有需要圆角,或者是圆形的ImageView,自身的ImageView不带啊,不像Button可以利用shape来简单的实现圆角啊..啊..不要急,小司机来和大家一起实现你的需求. ...

  5. Android Glide加载圆形图片、圆角图片,部分圆角图片的使用方法

    Android Glide加载圆形图片.圆角图片,部分圆角图片的使用方法 前言 Gilde圆形图片/头像 Gilde普通圆角图片即四个角都是圆角 Gilde对指定角设置圆角 前言 通过本文,您可以实现 ...

  6. Android 完美实现图片圆角和圆形(对实现进行分析)

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/24555655 本来想在网上找个圆角的例子看一看,不尽人意啊,基本都是官方的Dem ...

  7. Android图片缓存框架 - Fresco实现圆角或圆形图片 (四)

    目录 1.Fresco 简介 2. Fresco 文档 3. Fresco开发步骤 4. Fresco加载图片6种方式 5. Drawees xm属性设置 6 Fresco实现圆角或圆形图片 6.1 ...

  8. 使用RoundedBitmapDrawable快速生成圆角和圆形图片

    原文出处:http://www.tuicool.com/articles/eIBbArA 上一篇 <[Material Design]使用Palette类提取图片的颜色信息> 主要介绍了如 ...

  9. android 简单实现圆角,Android 实现圆角图片的简单实例

    Android 实现圆角图片的简单实例 实现效果图: 本来想在网上找个圆角的例子看一看,不尽人意啊,基本都是官方的Demo的那张原理图,稍后会贴出.于是自己自定义了个View,实现图片的圆角以及圆形效 ...

  10. android imageview 锯齿,[置顶] android 自定义圆角ImageView以及锯齿的处理

    看到很多人开发过程中要使用圆角图片时,解决方法有: 1.重新绘制一张图片 2.通过布局来配置 3.通过重写View来实现 其中1,2在这里就不讲了,重点讲讲方法三的实现. 实现一:通过截取画布一个圆形 ...

最新文章

  1. 如何用机器学习方法进行数据建模?(文末福利)
  2. Flatten Nested Arrays(展平嵌套数组)
  3. PHP如何防止XSS攻击
  4. SVCHOST.exe进程之谜
  5. pandas读取大文件csv容易出现的错误
  6. 使用python和pandas进行同类群组分析
  7. iPhone 13有搞头,经典功能或将回归!
  8. SAP License:SAP有限度的多语言支持
  9. 503小组第三章编程作业
  10. html全屏代码怎么写,JS实现全屏的四种写法
  11. sql2005没有服务器名称
  12. 心电电路算法滤波_简述心电信号采集原理及电路设计
  13. ArcgisPro3.0-3.0.1中文安装包下载及安装教程
  14. 酒店管理系统-概要设计说明书
  15. 绝地求生主播御用手机雷达分屏
  16. 现代优化算法 之 禁忌搜索算法
  17. android画板的实验报告,几何画板实验报告
  18. 解决mysql开启GTID主从同步出现1236错误问题
  19. JavaScript严格检查模式strict的使用
  20. Flutter高仿微信-第59篇-同步数据

热门文章

  1. 漫画:如何实现大整数相乘?
  2. 高通如何通过9008端口读取EMMC的分区
  3. [RK3399][Android7.1] 调试笔记 --- 查看开机上一次kernel log
  4. 第二部分 Automake的标准工程组织
  5. ffmpeg文档7:快进快退
  6. 易语言皮肤模块200个_S7200 SMART 模拟量模块种类amp;选型须知
  7. 错误使用 eig 输入矩阵包含 nan 或 inf_特斯拉AI主管提醒你神经网络的几大常见错误...
  8. 【排列组合、思维】Combinatorics Homework
  9. 自从有了计算机和网络才有信息技术,2015年信息技术会考模拟选择题6(俞同明版)...
  10. OpenCV图像处理基础操作(3)