ImageView圆角

来源:互联网 发布:微软数据库工程师 编辑:程序博客网 时间:2024/06/05 08:57

ImageView圆角

activity_main.xml

[html] view plaincopy
  1. <ScrollView xmlns:android="http://schemas.android.com/apk/res/android"  
  2.     xmlns:CustomImageView="http://schemas.android.com/apk/res/com.example.customview05imageview"  
  3.     xmlns:tools="http://schemas.android.com/tools"  
  4.     android:layout_width="match_parent"  
  5.     android:layout_height="match_parent" >  
  6.   
  7.     <LinearLayout  
  8.         android:layout_width="match_parent"  
  9.         android:layout_height="wrap_content"  
  10.         android:orientation="vertical" >  
  11.   
  12.         <com.example.customview05imageview.RoundImageView  
  13.             android:layout_width="wrap_content"  
  14.             android:layout_margin="5dp"  
  15.             android:layout_height="wrap_content"  
  16.             android:src="@drawable/icon" />  
  17.           
  18.         <ImageView  
  19.           android:id="@+id/imageview"  
  20.             android:layout_margin="5dp"  
  21.             android:layout_width="wrap_content"  
  22.             android:layout_height="wrap_content"  
  23.             android:src="@drawable/icon" />  
  24.   
  25.         <com.example.customview05imageview.view.CustomImageView  
  26.             android:layout_width="wrap_content"  
  27.             android:layout_height="wrap_content"  
  28.             android:layout_margin="10dp"  
  29.             CustomImageView:src="@drawable/icon"  
  30.             CustomImageView:type="circle" />  
  31.   
  32.         <com.example.customview05imageview.view.CustomImageView  
  33.             android:layout_width="wrap_content"  
  34.             android:layout_height="wrap_content"  
  35.             android:layout_margin="10dp"  
  36.             CustomImageView:borderRadius="10dp"  
  37.             CustomImageView:src="@drawable/icon"  
  38.             CustomImageView:type="round" />  
  39.   
  40.         <com.example.customview05imageview.view.CustomImageView  
  41.             android:layout_width="wrap_content"  
  42.             android:layout_height="wrap_content"  
  43.             android:layout_margin="10dp"  
  44.             CustomImageView:borderRadius="20dp"  
  45.             CustomImageView:src="@drawable/icon"  
  46.             CustomImageView:type="round" />  
  47.     </LinearLayout>  
  48.   
  49. </ScrollView>  


MainActivity

[java] view plaincopy
  1. package com.example.customview05imageview;  
  2.   
  3. import android.app.Activity;  
  4. import android.graphics.Bitmap;  
  5. import android.graphics.Bitmap.Config;  
  6. import android.graphics.Canvas;  
  7. import android.graphics.Paint;  
  8. import android.graphics.PorterDuff.Mode;  
  9. import android.graphics.PorterDuffXfermode;  
  10. import android.graphics.Rect;  
  11. import android.graphics.RectF;  
  12. import android.graphics.drawable.BitmapDrawable;  
  13. import android.graphics.drawable.Drawable;  
  14. import android.os.Bundle;  
  15. import android.widget.ImageView;  
  16.   
  17. public class MainActivity extends Activity  
  18. {  
  19.   
  20.     private ImageView imageview;  
  21.     @Override  
  22.     protected void onCreate(Bundle savedInstanceState)  
  23.     {  
  24.         super.onCreate(savedInstanceState);  
  25.         setContentView(R.layout.activity_main);  
  26.         imageview = (ImageView) findViewById(R.id.imageview);  
  27.           
  28.         Drawable drawable = getResources().getDrawable(R.drawable.icon);    
  29.         BitmapDrawable bitmapDrawable = (BitmapDrawable) drawable;    
  30.         Bitmap bitmap = bitmapDrawable.getBitmap();    
  31.         Bitmap roundCorner = toRoundCorner(bitmap, 30);  
  32.         imageview.setImageBitmap(roundCorner);  
  33.     }  
  34.     public static Bitmap toRoundCorner(Bitmap bitmap, int pixels) {    
  35.         //创建bitmap对象  
  36.         Bitmap output = Bitmap.createBitmap(bitmap.getWidth(),    
  37.                 bitmap.getHeight(), Config.ARGB_8888);    
  38.         //创建画笔、画布  
  39.         Canvas canvas = new Canvas(output);    
  40.         final Paint paint = new Paint();    
  41.         final int color = 0xff424242;    
  42.         //创建矩形-位置  
  43.         final Rect rect = new Rect(00, bitmap.getWidth(), bitmap.getHeight());    
  44.         final RectF rectF = new RectF(rect);    
  45.         //圆角  
  46.         final float roundPx = pixels;    
  47.         paint.setAntiAlias(true);   
  48.         //透明  
  49.         canvas.drawARGB(0000);    
  50.         paint.setColor(color);    
  51.           
  52.         canvas.drawRoundRect(rectF, roundPx, roundPx, paint);    
  53.         paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN));    
  54.         canvas.drawBitmap(bitmap, rect, rect, paint);    
  55.         return output;    
  56.     }    
  57.   
  58. }  
CustomImageView

[java] view plaincopy
  1. package com.example.customview05imageview.view;  
  2.   
  3. import android.content.Context;  
  4. import android.content.res.TypedArray;  
  5. import android.graphics.Bitmap;  
  6. import android.graphics.Bitmap.Config;  
  7. import android.graphics.BitmapFactory;  
  8. import android.graphics.Canvas;  
  9. import android.graphics.Paint;  
  10. import android.graphics.PorterDuff;  
  11. import android.graphics.PorterDuffXfermode;  
  12. import android.graphics.RectF;  
  13. import android.util.AttributeSet;  
  14. import android.util.TypedValue;  
  15. import android.view.View;  
  16.   
  17. import com.example.customview05imageview.R;  
  18.   
  19. public class CustomImageView extends View {  
  20.   
  21.     private int type;  
  22.     private static final int TYPE_CIRCLE = 0;  
  23.     private static final int TYPE_ROUND = 1;  
  24.   
  25.     private Bitmap mSrc;  
  26.     private int mRadius;  
  27.     private int mWidth;  
  28.     private int mHeight;  
  29.   
  30.     /** 
  31.      * 初始化一些自定义的参数 
  32.      */  
  33.     public CustomImageView(Context context, AttributeSet attrs) {  
  34.         this(context, attrs, 0);  
  35.     }  
  36.   
  37.     public CustomImageView(Context context) {  
  38.         this(context, null);  
  39.     }  
  40.   
  41.     public CustomImageView(Context context, AttributeSet attrs, int defStyle) {  
  42.         super(context, attrs, defStyle);  
  43.   
  44.         TypedArray a = context.obtainStyledAttributes(attrs,  
  45.                 R.styleable.CustomImageView, defStyle, 0);  
  46.   
  47.         int n = a.getIndexCount();  
  48.         // 遍历属性  
  49.         for (int i = 0; i < n; i++) {  
  50.             int attr = a.getIndex(i);  
  51.             switch (attr) {  
  52.             case R.styleable.CustomImageView_src:  
  53.                 mSrc = BitmapFactory.decodeResource(getResources(),  
  54.                         a.getResourceId(attr, 0));  
  55.                 break;  
  56.             case R.styleable.CustomImageView_type:  
  57.                 // 默认为Circle--0  
  58.                 type = a.getInt(attr, 0);  
  59.                 break;  
  60.             case R.styleable.CustomImageView_borderRadius:  
  61.                 // 转变为标准尺寸的一个函数-- 默认为10DIP  
  62.                 mRadius = a.getDimensionPixelSize(attr, (int) TypedValue  
  63.                         .applyDimension(TypedValue.COMPLEX_UNIT_DIP, 10f,  
  64.                                 getResources().getDisplayMetrics()));  
  65.                 break;  
  66.             }  
  67.         }  
  68.         a.recycle();  
  69.     }  
  70.   
  71.     /** 
  72.      * 计算控件的高度和宽度 
  73.      */  
  74.     @Override  
  75.     protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {  
  76.         /** 
  77.          * 参数:它们指明控件可获得的空间以及关于这个空间描述的元数据 设置宽度 
  78.          */  
  79.         int specMode = MeasureSpec.getMode(widthMeasureSpec);  
  80.         int specSize = MeasureSpec.getSize(widthMeasureSpec);  
  81.   
  82.         /** 
  83.          * MeasureSpec.EXACTLY是精确尺寸,当我们将控件的layout_width或layout_height指定为具体数值时如andorid:layout_width="50dip" 
  84.          * 或者为FILL_PARENT是,都是控件大小已经确定的情况,都是精确尺寸。 
  85.          */  
  86.         if (specMode == MeasureSpec.EXACTLY)// match_parent  
  87.         {  
  88.             mWidth = specSize;  
  89.         } else {  
  90.             // 由图片决定的宽  
  91.             int desireByImg = getPaddingLeft() + getPaddingRight()  
  92.                     + mSrc.getWidth();  
  93.             if (specMode == MeasureSpec.AT_MOST)// wrap_content  
  94.             {  
  95.                 /** 
  96.                  * 此时控件尺寸只要不超过父控件允许的最大尺寸即可 
  97.                  */  
  98.                 mWidth = Math.min(desireByImg, specSize);  
  99.             } else  
  100.   
  101.                 mWidth = desireByImg;  
  102.         }  
  103.   
  104.         /*** 
  105.          * 设置高度 
  106.          */  
  107.   
  108.         specMode = MeasureSpec.getMode(heightMeasureSpec);  
  109.         specSize = MeasureSpec.getSize(heightMeasureSpec);  
  110.         if (specMode == MeasureSpec.EXACTLY)// match_parent , accurate  
  111.         {  
  112.             mHeight = specSize;  
  113.         } else {  
  114.             int desire = getPaddingTop() + getPaddingBottom()  
  115.                     + mSrc.getHeight();  
  116.   
  117.             if (specMode == MeasureSpec.AT_MOST)// wrap_content  
  118.             {  
  119.                 mHeight = Math.min(desire, specSize);  
  120.             } else  
  121.                 mHeight = desire;  
  122.         }  
  123.   
  124.         setMeasuredDimension(mWidth, mHeight);  
  125.   
  126.     }  
  127.   
  128.     /** 
  129.      * 绘制 
  130.      */  
  131.     @Override  
  132.     protected void onDraw(Canvas canvas) {  
  133.         switch (type) {  
  134.         case TYPE_CIRCLE:  
  135.             int min = Math.min(mWidth, mHeight);  
  136.             // Bitmap 创建 一个新的,缩放后的 Bitmap  
  137.             mSrc = Bitmap.createScaledBitmap(mSrc, min, min, false);  
  138.             //在某个位置画圆  
  139.             canvas.drawBitmap(createCircleImage(mSrc, min), 00null);  
  140.             break;  
  141.         case TYPE_ROUND:  
  142.             canvas.drawBitmap(createRoundConerImage(mSrc), 00null);  
  143.             break;  
  144.   
  145.         }  
  146.   
  147.     }  
  148.   
  149.     /** 
  150.      * 根据原图和变长绘制圆形图片 
  151.      */  
  152.     private Bitmap createCircleImage(Bitmap source, int min) {  
  153.         final Paint paint = new Paint();  
  154.         paint.setAntiAlias(true);  
  155.         //该函数创建一个带有特定宽度、高度和颜色格式的位图  
  156.         Bitmap target = Bitmap.createBitmap(min, min, Config.ARGB_8888);  
  157.         //产生一个同样大小的画布  
  158.         Canvas canvas = new Canvas(target);  
  159.         //首先绘制圆形-原心xy坐标以及半径  
  160.         canvas.drawCircle(min / 2, min / 2, min / 2, paint);  
  161.         //取两层绘制交集。显示上层  
  162.         paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));  
  163.         //绘制图片  
  164.         canvas.drawBitmap(source, 00, paint);  
  165.         return target;  
  166.     }  
  167.   
  168.     /** 
  169.      * 根据原图添加圆角 
  170.      */  
  171.     private Bitmap createRoundConerImage(Bitmap source) {  
  172.         final Paint paint = new Paint();  
  173.         paint.setAntiAlias(true);  
  174.         Bitmap target = Bitmap.createBitmap(mWidth, mHeight, Config.ARGB_8888);  
  175.         Canvas canvas = new Canvas(target);  
  176.         RectF rect = new RectF(00, source.getWidth(), source.getHeight());  
  177.         canvas.drawRoundRect(rect, mRadius, mRadius, paint);  
  178.         paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));  
  179.         canvas.drawBitmap(source, 00, paint);  
  180.         return target;  
  181.     }  
  182. }  
RoundImageView

[java] view plaincopy
  1. package com.example.customview05imageview;  
  2.    
  3. import android.content.Context;  
  4. import android.graphics.Canvas;  
  5. import android.graphics.Color;  
  6. import android.graphics.Paint;  
  7. import android.graphics.PorterDuff;  
  8. import android.graphics.PorterDuffXfermode;  
  9. import android.graphics.RectF;  
  10. import android.util.AttributeSet;  
  11. import android.widget.ImageView;  
  12.    
  13. public class RoundImageView extends ImageView {  
  14.    
  15.     public RoundImageView(Context context, AttributeSet attrs) {  
  16.         super(context, attrs);  
  17.         init();  
  18.     }  
  19.    
  20.     public RoundImageView(Context context) {  
  21.         super(context);  
  22.         init();  
  23.     }  
  24.       
  25.     private void init() {  
  26.         maskPaint.setAntiAlias(true);  
  27.         maskPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));  
  28.         //  
  29.         zonePaint.setAntiAlias(true);  
  30.         zonePaint.setColor(Color.RED);  
  31.         //  
  32.         float density = getResources().getDisplayMetrics().density;  
  33.         rect_adius = rect_adius * density;  
  34.     }  
  35.       
  36.     @Override  
  37.     protected void onLayout(boolean changed, int left, int top, int right,  
  38.             int bottom) {  
  39.         super.onLayout(changed, left, top, right, bottom);  
  40.         int w = getWidth();  
  41.         int h = getHeight();  
  42.         roundRect.set(00, w, h);  
  43.     }  
  44.     private final RectF roundRect = new RectF();  
  45.       
  46.     private float rect_adius = 20;  
  47.     private final Paint maskPaint = new Paint();  
  48.     private final Paint zonePaint = new Paint();  
  49.    
  50.   
  51.    
  52.     @Override  
  53.     public void draw(Canvas canvas) {  
  54.         canvas.saveLayer(roundRect, zonePaint, Canvas.ALL_SAVE_FLAG);  
  55.         //产生一个红色的圆角矩形  
  56.         canvas.drawRoundRect(roundRect, rect_adius, rect_adius, zonePaint);  
  57.         //  
  58.         canvas.saveLayer(roundRect, maskPaint, Canvas.ALL_SAVE_FLAG);  
  59.         super.draw(canvas);  
  60.         canvas.restore();  
  61.     }  
  62.    
  63. }  



0 0
原创粉丝点击