前言:我们都知道as(Android Studio)里面的所有可以使用图片的控件,都是方方正正的,如果我们做头像作用时,方方正正的就很奇怪,我们就想要一个圆的图片了。这里介绍一种自定义控件的方式来实现。

我们预计的效果:                                                       

首先,先自定义一个Java类;并实现圆的效果,代码如下。

package com.c201801090105.example.pengjian;import android.annotation.SuppressLint;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapShader;
import android.graphics.Canvas;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.graphics.Shader;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;import androidx.annotation.Nullable;public class Circle extends androidx.appcompat.widget.AppCompatImageView {//画笔private Paint mPaint;//圆形图片的半径private int mRadius;//图片的宿放比例private float mScale;public Circle(Context context) {super(context);}public Circle(Context context, @Nullable AttributeSet attrs) {super(context, attrs);}public Circle(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);}@Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {super.onMeasure(widthMeasureSpec, heightMeasureSpec);//由于是圆形,宽高应保持一致int size = Math.min(getMeasuredWidth(), getMeasuredHeight());mRadius = size / 2;setMeasuredDimension(size, size);}@SuppressLint("DrawAllocation")@Overrideprotected void onDraw(Canvas canvas) {mPaint = new Paint();Drawable drawable = getDrawable();if (null != drawable) {Bitmap bitmap = ((BitmapDrawable) drawable).getBitmap();//初始化BitmapShader,传入bitmap对象BitmapShader bitmapShader = new BitmapShader(bitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);//计算缩放比例mScale = (mRadius * 2.0f) / Math.min(bitmap.getHeight(), bitmap.getWidth());Matrix matrix = new Matrix();matrix.setScale(mScale, mScale);bitmapShader.setLocalMatrix(matrix);mPaint.setShader(bitmapShader);//画圆形,指定好坐标,半径,画笔canvas.drawCircle(mRadius, mRadius, mRadius, mPaint);} else {super.onDraw(canvas);}}}

然后,在布局文件里面直接使用即可。

 <com.c201801090105.example.pengjian.Circleandroid:id="@+id/touxiang"android:layout_width="100dp"android:layout_height="100dp"app:layout_constraintBottom_toBottomOf="parent"app:layout_constraintEnd_toEndOf="parent"app:layout_constraintStart_toStartOf="parent"app:srcCompat="@drawable/dibu" />

注意:

这种方法必须是设置src,设置background不会生效

在ImageView中src与background是有区别的

background会根据ImageView组件给定的长宽进行拉伸,而src就存放的是原图的大小,不会进行拉伸。src是图片内容(前景),bg是背景,可以同时使用。此外scaleType只是对src起作用,bg可设置透明度。

在动态加载图片中设置src可以参考imageview的几种设置方式

Android自定义控件实现圆形图片相关推荐

  1. Android自定义控件NumberCircleProgressBar(圆形进度条)的实现

    Android自定义控件NumberCircleProgressBar(圆形进度条)的实现

  2. Android 自定义控件之圆形页面指示器CirclePageIndicator带划动效果

    Android 自定义控件之圆形页面指示器CirclePageIndicator带划动效果 前言 感谢 效果图 目标 流程 自定义属性 自定义默认属性 自定义接口 创建控件类继承View 声明属性变量 ...

  3. android 自定义时钟,Android自定义控件之圆形时钟(续)

    在上篇文章中,我向大家介绍了如何通过自定义View一步步画出一个漂亮的圆形时钟.如果你还没看的话,我不建议你接着往下看,因为这篇文章是接着上篇的文章,如果直接看的话可能会不知所云,所以还是建议你先看一 ...

  4. android画一个圆形图片组件

    imageview 显示圆形图片如下图. 圆形头像原理. 1.根据图片创建一个大小相同的画布. 2.在画布上画一个圆形. 3.画一个绘制交集,显示上层. // 将圆形图片,返回Bitmappublic ...

  5. Android 小工具--圆形图片

    1.CircleImageView类代码 public class CircleImageView extends androidx.appcompat.widget.AppCompatImageVi ...

  6. Android自定义圆角圆形图片

    转载请注明出处:http://blog.csdn.net/binbinqq86/article/details/79463977 说起Android里面的自定义圆角圆形图片,已经算是老生常谈的话题了, ...

  7. Android 自定义控件之圆形扩散View(DiffuseView)

    实现效果 使用 属性方法 代码 源码下载 参考链接 实现效果 使用 XML中: <com.airsaid.diffuseview.widget.DiffuseViewandroid:id=&qu ...

  8. Android自定义控件之圆形头像

    重写ImageView public class CircleImageView extends ImageView {private static final ScaleType SCALE_TYP ...

  9. Android 圆形图片 CircleImageView(Xfermode方式)

    Android中实现圆形图片,总的说来有2种方法. Xfermode方式,就是本文要讲的实现方式. BitmapShader(着色器)和Matrix(矩阵)方式 第二种实现方式的代表作,就是Henni ...

最新文章

  1. poj 2677 tour
  2. gdb 查看,执行汇编代码
  3. 将特定像素点在图像上连接起来_图像分割【论文解读】快速图像分割的SuperBPD方法 CVPR-2020...
  4. python图像边缘提取_python通过robert、sobel、Laplace算子实现图像边缘提取详解
  5. Ubuntu16.04 安装配置Caffe
  6. Java Character 方法
  7. 如何让不懂信息化的甲方客户看懂需求文档,并确认签字?
  8. 从输入一个url到浏览器页面展示都经历了哪些过程?
  9. 使用tar或dd等完成Linux系统备份恢复
  10. ad logon hour
  11. 【学习】在Windows10平台使用Docker ToolBox安装docker(一)
  12. Python练手经典100例
  13. 「上海院子」打造不可复制的国宅风华
  14. Traitors Eight 硅谷“八叛徒”
  15. torch.optim 中的优化器
  16. 三极管分压共射放大电路
  17. 有限域GF(2^8).md
  18. MBR2060FCT肖特基二极管,ASEMI品牌原装ASEMI品牌肖特基二极管MBR2060FCT,最大正向整流电流:20A;反向峰值电压:60V;MBR2060FCT广泛应用于开关电源、LED电源
  19. pdf压缩工具_18MB秒变1MB,最好用的PDF在线压缩工具
  20. 二叉树的深度怎么算(Java代码实现)

热门文章

  1. linux备份还原命令
  2. 超级账本Fabric 2.x 详细安装步骤及可能问题解决方式
  3. c语言ax2十bx十c 0求根,ax2+bx+c=0的求根公式
  4. android 微信图片选择,Android之仿微信图片选择器
  5. Unity Shader实现图像渐变
  6. Unity3d--坦克对战游戏 AI 设计
  7. PHP服务器在线测速系统源码+亲测可用
  8. XYOJ1257: 捕杀恶龙(break+j=k)
  9. MSP430控制AD7712采集数据
  10. 重力回弹(小球自由落体)