你的位置:首页 > 软件开发 > 操作系统 > Android自定义带边框的圆形view

Android自定义带边框的圆形view

发布时间:2015-05-11 12:00:23
由于项目需要,需要做一个圆形的带边框并且里边还有文字的view →_→↓↓↓↓这样↓↓↓↓如果在 ...

Android自定义带边框的圆形view

由于项目需要,需要做一个圆形的带边框并且里边还有文字的view →_→

↓↓↓↓这样↓↓↓↓

Android自定义带边框的圆形view

如果在布局文件中做的话是非常麻烦的,而且复用性也不高。所以想到用自定义一个view的来实现该功能,这样封装性和复用性就会相对提高,可方便在以后类似的项目中使用。可能也有同学有过这样的需求,所以在这分享出来供大家参考,不足之处还请多多指点。

看代码:

 1package com.stock.manage.friend.view;import android.content.Context; 2 import android.content.res.TypedArray;
 3 import android.graphics.Bitmap; 4 import android.graphics.Bitmap.Config; 5 import android.graphics.BitmapFactory; 6 import android.graphics.Canvas; 7 import android.graphics.Color; 8 import android.graphics.Paint; 9 import android.graphics.Paint.FontMetrics; 10 import android.graphics.PorterDuff; 11 import android.graphics.PorterDuffXfermode; 12 import android.util.AttributeSet; 13 import android.view.View; 14  15 /** 16  * 自定义View 实现圆 圆形等效果 17  * @author chengzijian 18  *  19 */ 20 public class CustomImageView extends View { 21  22   /** 23    * 图片 24   */ 25   private Bitmap mSrc; 26  27   /** 28    * 控件的宽度 29   */ 30   private int mWidth; 31   /** 32    * 控件的高度 33   */ 34   private int mHeight; 35   /** 36    *内颜色 37   */ 38   private int inColor; 39   /** 40    * 边框颜色 41   */ 42   private int outColor; 43   /** 44    *边框粗细 45   */ 46   private int outStrokeWidth; 47   /** 48    * 文字 49   */ 50   private String mText; 51   /** 52    * 文字颜色 53   */ 54   private int mTextColor; 55   /** 56    * 文字大小 57   */ 58   private float mTextSize; 59  60   public CustomImageView(Context context, AttributeSet attrs) { 61     this(context, attrs, 0); 62   } 63  64   public CustomImageView(Context context) { 65     this(context, null); 66   } 67  68   /** 69    * 初始化一些自定义的参数 70    *  71    * @param context 72    * @param attrs 73    * @param defStyle 74   */ 75   public CustomImageView(Context context, AttributeSet attrs, int defStyle) { 76     super(context, attrs, defStyle); 77  78     TypedArray array = context.obtainStyledAttributes(attrs, R.styleable.StockManage); 79     mSrc = BitmapFactory.decodeResource(getResources(), array.getResourceId(R.styleable.StockManage_icon, -1)); 80     if (mSrc == null) { 81       inColor = array.getColor(R.styleable.StockManage_inColor, Color.WHITE); 82     } 83     mTextColor = array.getColor(R.styleable.StockManage_textColor, Color.BLACK); 84     outColor = array.getColor(R.styleable.StockManage_outColor, -1); 85     outStrokeWidth = array.getDimensionPixelSize(R.styleable.StockManage_stroke, 0); 86     mWidth = array.getDimensionPixelSize(R.styleable.StockManage_width, 0); 87     mHeight = array.getDimensionPixelSize(R.styleable.StockManage_height, 0); 88     mText = array.getString(R.styleable.StockManage_text); 89     mTextSize = array.getDimension(R.styleable.StockManage_textSize,R.dimen.text_size_sub);// 如果设置为DP等单位,会做像素转换  90     //释放资源 91     array.recycle(); 92   } 93  94   /** 95    * 计算控件的高度和宽度 96   */ 97   @Override 98   protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 99     setMeasuredDimension(mWidth, mHeight);100   }101 102   /**103    * 绘制104   */105   @Override106   protected void onDraw(Canvas canvas) {107 108     int min = Math.min(mWidth, mHeight);109     /**110      * 长度如果不一致,按小的值进行压缩111     */112     if (mSrc != null) {113       mSrc = Bitmap.createScaledBitmap(mSrc, min, min, false);114       canvas.drawBitmap(createCircleImage(mSrc, min), 0, 0, null);115     } else {116       canvas.drawBitmap(createCircleImage(null, min), 0, 0, null);117     }118   }119 120   /**121    * 根据原图和边长绘制圆形图片122    * 123    * @param source124    *      color 这两个参数只能取一个125    * @param min126    * @return127   */128   private Bitmap createCircleImage(Bitmap source, int min) {129 130     final Paint paint = new Paint();131     paint.setAntiAlias(true);132     Bitmap target = Bitmap.createBitmap(min, min, Config.ARGB_8888);133     /**134      * 产生一个同样大小的画布135     */136     Canvas canvas = new Canvas(target);137     /**138      * 首先绘制圆形139     */140     canvas.drawCircle(min / 2, min / 2, min / 2, paint);141 142     /**143      * 使用SRC_IN,参考上面的说明144     */145     paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));146     /**147      * 绘制图片148     */149     if (source != null)// 画图片150       canvas.drawBitmap(source, 0, 0, paint);151     else { // 画圆152       paint.setColor(inColor);153       canvas.drawCircle(min / 2, min / 2, min / 2, paint);154     }155 156     if (outColor != 0) {157       // 让画出的图形是空心的158       paint.setStyle(Paint.Style.STROKE);159       // 设置画出的线的 粗细程度160       paint.setStrokeWidth(outStrokeWidth);161       paint.setColor(outColor);162       canvas.drawCircle(min / 2, min / 2, min / 2, paint);163     }164     if(mText != null){165       // 让画出的图形是实心的166       paint.setStyle(Paint.Style.FILL);167       paint.setStrokeWidth(1);168       if(mTextColor != 0 ){169         paint.setColor(mTextColor);170       }171       if(mTextSize != 0 ){172         paint.setTextSize(mTextSize);173       }174       paint.setTextAlign(Paint.Align.CENTER);175       FontMetrics fm = paint.getFontMetrics(); 176       //得到文字的高度177       float fFontHeight = (float)Math.ceil(fm.descent - fm.ascent); 178       179       canvas.drawText(mText, mWidth/2, mHeight/2+fFontHeight/4, paint);180     }181     return target;182   }183 184   //设置文字185   public void setText(String string) {186     mText = string;187     //重绘188     invalidate();189     requestLayout();190   }192 }

原标题:Android自定义带边框的圆形view

关键词:Android

*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们: admin#shaoqun.com (#换成@)。

可能感兴趣文章

我的浏览记录