Android圆形图片自定义控件


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

Android圆型头像实现_第1张图片

 

代码如下:

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"                              < 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 >
3、主Activity中没有相关代码,直接加载布局文件即可。



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

更多相关文章

  1. android 图片处理
  2. Android 圆形背景shape定义
  3. android 安卓 开发 图片库获得图片的绝对路径
  4. TableRow 背景问题以及修改对话框标题高度或者图片
  5. Android 把从网络获取的图片缓存到内存中
  6. Android 的网络编程(17)-android显示网络图片
  7. androidSDK下的图片资源
  8. 自定义RadioButton 文字在下,图片在上
  9. android去除ImageButton白色边框

随机推荐

  1. Android APK权限大全
  2. android 让Activity单例运行
  3. Android 日期控件的简单实现
  4. Android NDK Overview ---- Android 4.4
  5. Android 给TextView 添加图片(左右等)
  6. android通过http上传图片
  7. Android HandlerThread使用
  8. Android,visibility属性
  9. Android 自定义字体
  10. Android之MediaScanner流程