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"                              < 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欢迎界面引导页
  3. Android实现拍照功能实例
  4. Android(安卓)圆形背景shape定义
  5. Android(安卓)一些小技巧
  6. TableRow 背景问题以及修改对话框标题高度或者图片
  7. android 安卓 开发 图片库获得图片的绝对路径
  8. Android(安卓)把从网络获取的图片缓存到内存中
  9. android:scaleType的使用

随机推荐

  1. Android(安卓)EventBus的使用
  2. Android(安卓)SQLite Shell
  3. Android(安卓)AppWidget系统框架
  4. android tips:从资源文件中读取文件流显
  5. Android知识梳理:消息机制之Looper
  6. android相机调试
  7. Gradle-jar-aar
  8. android中ColorStateList及StateListDraw
  9. Android进阶之代码应用技巧
  10. Android(安卓)GPS架构分析