Android圆形图片自定义控件


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

代码如下:

RoundImageView.java

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



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

更多相关文章

  1. radio button 旁边放图片以及强制程序本地化以及string含有参数
  2. [Android(安卓)XML] --- android:scaleType
  3. android EditText内嵌图片
  4. 关于android里面的几种Selector状态
  5. 关于android里面的几种Selector状态
  6. 当GridView中的一项被点中的时候显示的背景图片:android:listSele
  7. Android(安卓)shap selector animation 与 Toast退出问题
  8. android 实现2张图片层叠效果
  9. Android设置图片在TextView上、下、左、右

随机推荐

  1. Android系统开发
  2. Android对话框AlertDialog.Builder使用方
  3. Android(安卓)使用OKHttp获取字符串和下
  4. [Network]Android(安卓)N 新wifi connect
  5. Android临时和永久关闭selinux
  6. android PowerManager goToSleep 等用法
  7. Android(安卓)Force Close 出现的异常原
  8. Android(安卓)GreenDao使用(二)增删改查
  9. android实现音乐播放器进度条效果
  10. Android(安卓)Jetpack架构组件Navigation