Android圆形图片控件效果图如下:

代码如下:

RoundImageView.java

  1. package com.dxd.roundimageview;
  2. import android.content.Context;
  3. import android.content.res.TypedArray;
  4. import android.graphics.Bitmap;
  5. import android.graphics.Bitmap.Config;
  6. import android.graphics.Canvas;
  7. import android.graphics.Paint;
  8. import android.graphics.PorterDuff.Mode;
  9. import android.graphics.PorterDuffXfermode;
  10. import android.graphics.Rect;
  11. import android.graphics.drawable.BitmapDrawable;
  12. import android.graphics.drawable.Drawable;
  13. import android.graphics.drawable.NinePatchDrawable;
  14. import android.util.AttributeSet;
  15. import android.util.Log;
  16. import android.widget.ImageView;
  17.  
  18. import com.alan.myimageview.R;
  19.  
  20. /**
  21. * 圆形ImageView,可设置最多两个宽度不同且颜色不同的圆形边框。
  22. * 设置颜色在xml布局文件中由自定义属性配置参数指定
  23. */
  24. public class RoundImageView extends ImageView {
  25. private int mBorderThickness = ;
  26. private Context mContext;
  27. private int defaultColor = 0xFFFFFFFF;
  28. // 如果只有其中一个有值,则只画一个圆形边框
  29. private int mBorderOutsideColor = ;
  30. private int mBorderInsideColor = ;
  31. // 控件默认长、宽
  32. private int defaultWidth = ;
  33. private int defaultHeight = ;
  34.  
  35. public RoundImageView(Context context) {
  36. super(context);
  37. mContext = context;
  38. }
  39.  
  40. public RoundImageView(Context context, AttributeSet attrs) {
  41. super(context, attrs);
  42. mContext = context;
  43. setCustomAttributes(attrs);
  44. }
  45.  
  46. public RoundImageView(Context context, AttributeSet attrs, int defStyle) {
  47. super(context, attrs, defStyle);
  48. mContext = context;
  49. setCustomAttributes(attrs);
  50. }
  51.  
  52. private void setCustomAttributes(AttributeSet attrs) {
  53. TypedArray a = mContext.obtainStyledAttributes(attrs,R.styleable.roundedimageview);
  54. mBorderThickness = a.getDimensionPixelSize(R.styleable.roundedimageview_border_thickness, );
  55. mBorderOutsideColor = a.getColor(R.styleable.roundedimageview_border_outside_color,defaultColor);
  56. mBorderInsideColor = a.getColor(R.styleable.roundedimageview_border_inside_color, defaultColor);
  57. }
  58.  
  59. @Override
  60. protected void onDraw(Canvas canvas) {
  61. Drawable drawable = getDrawable() ;
  62. if (drawable == null) {
  63. return;
  64. }
  65. if (getWidth() == || getHeight() == ) {
  66. return;
  67. }
  68. this.measure(, );
  69. if (drawable.getClass() == NinePatchDrawable.class)
  70. return;
  71. Bitmap b = ((BitmapDrawable) drawable).getBitmap();
  72. Bitmap bitmap = b.copy(Bitmap.Config.ARGB_8888, true);
  73. if (defaultWidth == ) {
  74. defaultWidth = getWidth();
  75. }
  76. if (defaultHeight == ) {
  77. defaultHeight = getHeight();
  78. }
  79. int radius = ;
  80. if (mBorderInsideColor != defaultColor && mBorderOutsideColor != defaultColor) {// 定义画两个边框,分别为外圆边框和内圆边框
  81. radius = (defaultWidth < defaultHeight ? defaultWidth : defaultHeight) / - * mBorderThickness;
  82. // 画内圆
  83. drawCircleBorder(canvas, radius + mBorderThickness / ,mBorderInsideColor);
  84. // 画外圆
  85. drawCircleBorder(canvas, radius + mBorderThickness + mBorderThickness / , mBorderOutsideColor);
  86. } else if (mBorderInsideColor != defaultColor && mBorderOutsideColor == defaultColor) {// 定义画一个边框
  87. radius = (defaultWidth < defaultHeight ? defaultWidth : defaultHeight) / - mBorderThickness;
  88. drawCircleBorder(canvas, radius + mBorderThickness / , mBorderInsideColor);
  89. } else if (mBorderInsideColor == defaultColor && mBorderOutsideColor != defaultColor) {// 定义画一个边框
  90. radius = (defaultWidth < defaultHeight ? defaultWidth : defaultHeight) / - mBorderThickness;
  91. drawCircleBorder(canvas, radius + mBorderThickness / , mBorderOutsideColor);
  92. } else {// 没有边框
  93. radius = (defaultWidth < defaultHeight ? defaultWidth : defaultHeight) / ;
  94. }
  95. Bitmap roundBitmap = getCroppedRoundBitmap(bitmap, radius);
  96. canvas.drawBitmap(roundBitmap, defaultWidth / - radius, defaultHeight / - radius, null);
  97. }
  98.  
  99. /**
  100. * 获取裁剪后的圆形图片
  101. * @param radius半径
  102. */
  103. public Bitmap getCroppedRoundBitmap(Bitmap bmp, int radius) {
  104. Bitmap scaledSrcBmp;
  105. int diameter = radius * ;
  106. // 为了防止宽高不相等,造成圆形图片变形,因此截取长方形中处于中间位置最大的正方形图片
  107. int bmpWidth = bmp.getWidth();
  108. int bmpHeight = bmp.getHeight();
  109. int squareWidth = , squareHeight = ;
  110. int x = , y = ;
  111. Bitmap squareBitmap;
  112. if (bmpHeight > bmpWidth) {// 高大于宽
  113. squareWidth = squareHeight = bmpWidth;
  114. x = ;
  115. y = (bmpHeight - bmpWidth) / ;
  116. // 截取正方形图片
  117. squareBitmap = Bitmap.createBitmap(bmp, x, y, squareWidth, squareHeight);
  118. } else if (bmpHeight < bmpWidth) {// 宽大于高
  119. squareWidth = squareHeight = bmpHeight;
  120. x = (bmpWidth - bmpHeight) / ;
  121. y = ;
  122. squareBitmap = Bitmap.createBitmap(bmp, x, y, squareWidth,squareHeight);
  123. } else {
  124. squareBitmap = bmp;
  125. }
  126. if (squareBitmap.getWidth() != diameter || squareBitmap.getHeight() != diameter) {
  127. scaledSrcBmp = Bitmap.createScaledBitmap(squareBitmap, diameter,diameter, true);
  128. } else {
  129. scaledSrcBmp = squareBitmap;
  130. }
  131. Bitmap output = Bitmap.createBitmap(scaledSrcBmp.getWidth(),
  132. scaledSrcBmp.getHeight(),
  133. Config.ARGB_8888);
  134. Canvas canvas = new Canvas(output);
  135.  
  136. Paint paint = new Paint();
  137. Rect rect = new Rect(, , scaledSrcBmp.getWidth(),scaledSrcBmp.getHeight());
  138.  
  139. paint.setAntiAlias(true);
  140. paint.setFilterBitmap(true);
  141. paint.setDither(true);
  142. canvas.drawARGB(, , , );
  143. canvas.drawCircle(scaledSrcBmp.getWidth() / ,
  144. scaledSrcBmp.getHeight() / ,
  145. scaledSrcBmp.getWidth() / ,
  146. paint);
  147. paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN));
  148. canvas.drawBitmap(scaledSrcBmp, rect, rect, paint);
  149. bmp = null;
  150. squareBitmap = null;
  151. scaledSrcBmp = null;
  152. return output;
  153. }
  154.  
  155. /**
  156. * 边缘画圆
  157. */
  158. private void drawCircleBorder(Canvas canvas, int radius, int color) {
  159. Paint paint = new Paint();
  160. /* 去锯齿 */
  161. paint.setAntiAlias(true);
  162. paint.setFilterBitmap(true);
  163. paint.setDither(true);
  164. paint.setColor(color);
  165. /* 设置paint的 style 为STROKE:空心 */
  166. paint.setStyle(Paint.Style.STROKE);
  167. /* 设置paint的外框宽度 */
  168. paint.setStrokeWidth(mBorderThickness);
  169. canvas.drawCircle(defaultWidth / , defaultHeight / , radius, paint);
  170. }
  171. }

1、定义自己的属性配置文件:attr.xml

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <resources>
  3. <declare-styleable name="roundedimageview">
  4. <attr name="border_thickness" format="dimension" />
  5. <attr name="border_inside_color" format="color" />
  6. <attr name="border_outside_color" format="color"></attr>
  7. </declare-styleable>
  8. </resources>

2、在xml配置中使用控件:activity_main.xml

  1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  2. xmlns:tools="http://schemas.android.com/tools"
  3. xmlns:imagecontrol="http://schemas.android.com/apk/res-auto"
  4. android:layout_width="fill_parent"
  5. android:layout_height="fill_parent"
  6. android:orientation="horizontal"
  7. >
  8.  
  9. <!-- 没有指定圆形ImageView属性时,默认没有外边圆颜色 -->
  10. <!-- 需要将图片资源自定为src ,或在程序中setImageResource(res) 不能设置background为图片,这样不能达到圆形效果-->
  11. <com.dxd.roundimageview.RoundImageView
  12. android:layout_width="100dp"
  13. android:layout_height="100dp"
  14. android:src="@drawable/img"
  15. />
  16. <!-- border_outside_color 外部圆圈的颜色 -->
  17. <!-- border_inside_color 内部部圆圈的颜色 -->
  18. <!-- border_thickness 外圆和内圆的宽度 -->
  19. <com.dxd.roundimageview.RoundImageView
  20. android:layout_width="100dp"
  21. android:layout_height="100dp"
  22. android:src="@drawable/img"
  23. imagecontrol:border_inside_color="#bc0978"
  24. imagecontrol:border_outside_color="#ba3456"
  25. imagecontrol:border_thickness="1dp"
  26. />
  27. </LinearLayout>

3、主Activity中没有相关代码,直接加载布局文件即可。

来自:http://blog.csdn.net/android_dong/article/details/41989499

Android圆形图片自定义控件的更多相关文章

  1. Android圆形图片--自己定义控件

    Android圆形图片控件效果图例如以下: 代码例如以下: RoundImageView.java package com.dxd.roundimageview; import android.con ...

  2. Android圆形图片--ImageView

    [ RoundImageView.java ] package com.dxd.roundimageview; import android.content.Context; import andro ...

  3. Android圆形图片不求人,自定义View实现(BitmapShader使用)

    在很多APP当中,圆形的图片是必不可少的元素,美观大方.本文将带领读者去实现一个圆形图片自定View,力求只用一个Java类来完成这件事情. 一.先上效果图 二.实现思路 在定义View 的onMea ...

  4. 关于Android圆形图片的一种优化方案(可以显示网络图片)

    在Android App中,我们经常看到圆形头像图片,然后网上也有很多开源的控件.刚好这个项目用到了,也去找了一些开源的,发现并不完美,所以只好自己优化了,废话不多说,先上效果图: 下面是源码:本人能 ...

  5. Android 圆形图片加白边加阴影

    /** * 将图片准转为圆形 * * @param bitmap * @return */ public static Bitmap getRoundedCornerBitmap(String pat ...

  6. Android 绘制圆形图片

    经常在项目中,会遇到使用圆形头像. 然而图片往往不是圆形的,我们须要对图片进行处理.以达到圆形图片的效果.这里.我总结了一下经常使用的android圆形图片的绘制的方法. 主要有以下几种方式:1.画布 ...

  7. Android实现圆形图片

     情景再现: 写Android程序也有一段时间了,今天突然被问怎么实现一个圆形图片,很多app图像是圆形的.但是用户上传的图像可不是圆的,所以问题就来了,需要我们代码实现圆形图片.但是大脑飞转想到第三 ...

  8. Android长方形图片生成正圆形,以及矩形图片生成圆角

    一般要做正圆形图片,只能是正方形的基础上才能实现,否则就变成椭圆了,下面说说如何使长方形的图片生成正圆形图片 废话不多说,没图没真相,先上图吧: 原图:  变成正圆后:  下面上代码: public ...

  9. Android自定义圆形图片工具类(CTRL+C加CTRL+V直接使用)

    先贴一下工具类的代码!可直接复制粘贴 public class RoundImageView extends ImageView { private Paint mPaint; //画笔 privat ...

随机推荐

  1. 记载abp中Dbcontext的疑问

    q:abp中httpcontext如何在一次请求中保证获取的是相同的实例. 大牛的原话: LifestylePerWebRequest does not works good with async. ...

  2. 使用uWSGI+nginx部署Django项目

    最近使用django写了一些项目,不过部署到服务器上碰到一些问题,还有静态文件什么的一堆问题,这里总结一下碰到的问题和解决方案,总体思路是按照官方文档走的. 原文地址:http://uwsgi-doc ...

  3. centos 6.4 FTP安装和配置

    链接地址:http://blog.csdn.net/wind520/article/details/38019647 1: 安装 检查是否安装 [root@localhost ~]# rpm -qa ...

  4. 「OC」 封装

    一.面向对象和封装 面向对象的三大特性:封装.继承和多态 在OC语言中,使用@interface和@implementation来处理类.   @interface就好像暴露在外面的时钟表面,像外界提 ...

  5. ASP.NET 导入excel 数据

    1,需要给上传文件的目录给予权限 2. <asp:FileUpload ID="FileUpload1" runat="server" /> < ...

  6. QTcpSocket通信编程时阻塞与非阻塞的问题

    目标,qt程序作为客户端,windows下winsock作为服务器端,实现两端通信. 开始时写了一个小函数测试: [cpp] view plaincopy QTcpSocket tmpSock;  t ...

  7. 多少遍ner让他加56看6

    http://www.huihui.cn/share/8112372 http://www.huihui.cn/share/8112363 http://www.huihui.cn/share/811 ...

  8. 一个简单的win32窗口

    #include <windows.h>#include <stdio.h> LRESULT CALLBACK WinSunProc(  HWND hwnd,      // ...

  9. POJ 3691 &amp; HDU 2457 DNA repair (AC自己主动机,DP)

    http://poj.org/problem?id=3691 http://acm.hdu.edu.cn/showproblem.php?pid=2457 DNA repair Time Limit: ...

  10. Xcode7网络限制

    在info.plist添加字段 App Transport Security Settings Allow Arbitrary Loads yes