Android圆型头像实现
16lz
2021-01-23
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 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 > |
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" > < com.dxd.roundimageview.RoundImageView android:layout_width = "100dp" android:layout_height = "100dp" android:src = "@drawable/img" /> < 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 > |
来自:http://blog.csdn.net/android_dong/article/details/41989499
更多相关文章
- android 图片处理
- Android 圆形背景shape定义
- android 安卓 开发 图片库获得图片的绝对路径
- TableRow 背景问题以及修改对话框标题高度或者图片
- Android 把从网络获取的图片缓存到内存中
- Android 的网络编程(17)-android显示网络图片
- androidSDK下的图片资源
- 自定义RadioButton 文字在下,图片在上
- android去除ImageButton白色边框