android 实现圆角imageView的两种方法

先上效果图:



实现方法一:

/**
 * 获取圆角位图的方法
 * 
 * @param bitmap
 *            需要转化成圆角的位图
 * @param pixels
 *            圆角的度数,数值越大,圆角越大
 * @return 处理后的圆角位图
 */
public static Bitmap toRoundCornerImage(Bitmap bitmap, int pixels) {
    Bitmap output = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), Config.ARGB_8888);
    Canvas canvas = new Canvas(output);
    final int color = 0xff424242;
    final Paint paint = new Paint();
    final Rect rect = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight());
    final RectF rectF = new RectF(rect);
    final float roundPx = pixels;
    // 抗锯齿
    paint.setAntiAlias(true);
    canvas.drawARGB(0, 0, 0, 0);
    paint.setColor(color);
    canvas.drawRoundRect(rectF, roundPx, roundPx, paint);
    paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN));
    canvas.drawBitmap(bitmap, rect, rect, paint);
    return output;
}

实现方法二:

package com.loopfire.meitaotao.view.roundImageView;  
  
import com.loopfire.meitaotao.R;  
  
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.Color;  
import android.graphics.Paint;  
import android.graphics.Path;  
import android.graphics.PorterDuff;  
import android.graphics.PorterDuffXfermode;  
import android.graphics.RectF;  
import android.util.AttributeSet;  
import android.widget.ImageView;  
  
/** 
 * 实现圆角image 
 *  
 * @author Administrator 
 *  
 */  
public class RoundAngleImageView extends ImageView {  
  
    private Paint paint;  
    /** 
     * 个人理解是 
     *  
     * 这两个都是画圆的半径 
     */  
    private int roundWidth = 20;  
    private int roundHeight = 20;  
    private Paint paint2;  
  
    public RoundAngleImageView(Context context, AttributeSet attrs, int defStyle) {  
        super(context, attrs, defStyle);  
        init(context, attrs);  
    }  
  
    public RoundAngleImageView(Context context, AttributeSet attrs) {  
        super(context, attrs);  
        init(context, attrs);  
    }  
  
    public RoundAngleImageView(Context context) {  
        super(context);  
        init(context, null);  
    }  
  
    private void init(Context context, AttributeSet attrs) {  
  
        if (attrs != null) {  
            TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.RoundAngleImageView);  
            roundWidth = a.getDimensionPixelSize(R.styleable.RoundAngleImageView_roundWidth, roundWidth);  
            roundHeight = a.getDimensionPixelSize(R.styleable.RoundAngleImageView_roundHeight, roundHeight);  
        } else {  
            float density = context.getResources().getDisplayMetrics().density;  
            roundWidth = (int) (roundWidth * density);  
            roundHeight = (int) (roundHeight * density);  
        }  
  
        paint = new Paint();  
        paint.setColor(Color.WHITE);  
        paint.setAntiAlias(true);  
        paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_OUT));  
  
        paint2 = new Paint();  
        paint2.setXfermode(null);  
    }  
  
    @Override  
    public void draw(Canvas canvas) {  
        Bitmap bitmap = Bitmap.createBitmap(getWidth(), getHeight(), Config.ARGB_8888);  
        Canvas canvas2 = new Canvas(bitmap);  
        super.draw(canvas2);  
        drawLiftUp(canvas2);  
        drawLiftDown(canvas2);  
        drawRightUp(canvas2);  
        drawRightDown(canvas2);  
        canvas.drawBitmap(bitmap, 0, 0, paint2);  
        bitmap.recycle();  
    }  
  
    private void drawLiftUp(Canvas canvas) {  
        Path path = new Path();  
        path.moveTo(0, roundHeight);  
        path.lineTo(0, 0);  
        path.lineTo(roundWidth, 0);  
        path.arcTo(new RectF(0, 0, roundWidth * 2, roundHeight * 2), -90, -90);  
        path.close();  
        canvas.drawPath(path, paint);  
    }  
  
    private void drawLiftDown(Canvas canvas) {  
        Path path = new Path();  
        path.moveTo(0, getHeight() - roundHeight);  
        path.lineTo(0, getHeight());  
        path.lineTo(roundWidth, getHeight());  
        path.arcTo(new RectF(0, getHeight() - roundHeight * 2, roundWidth * 2, getHeight()), 90, 90);  
        path.close();  
        canvas.drawPath(path, paint);  
    }  
  
    private void drawRightDown(Canvas canvas) {  
        Path path = new Path();  
        path.moveTo(getWidth() - roundWidth, getHeight());  
        path.lineTo(getWidth(), getHeight());  
        path.lineTo(getWidth(), getHeight() - roundHeight);  
        path.arcTo(new RectF(getWidth() - roundWidth * 2, getHeight() - roundHeight * 2, getWidth(), getHeight()), -0, 90);  
        path.close();  
        canvas.drawPath(path, paint);  
    }  
  
    private void drawRightUp(Canvas canvas) {  
        Path path = new Path();  
        path.moveTo(getWidth(), roundHeight);  
        path.lineTo(getWidth(), 0);  
        path.lineTo(getWidth() - roundWidth, 0);  
        path.arcTo(new RectF(getWidth() - roundWidth * 2, 0, getWidth(), 0 + roundHeight * 2), -90, 90);  
        path.close();  
        canvas.drawPath(path, paint);  
    }  
  
}  

然后在values下建个xml文件attribute.xml

<?xml version="1.0" encoding="utf-8"?>  
<resources>  
  
    <declare-styleable name="RoundAngleImageView">  
        <attr name="roundWidth" format="dimension" />  
        <attr name="roundHeight" format="dimension" />  
    </declare-styleable>  
  
</resources>  

最后:首先说明:两种方法都有一个相同点,重写了onDraw方法,方法里面都是采用重绘bitmap的方式实现圆角Image第二种方法网上有很多相似例子,不过发现它们都有一个错误,就是左下角不能实现圆角,我的第二个方法就是
对网上的错误方法修改而成!

原文:http://blog.csdn.net/u014763302/article/details/44018757

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 173,638评论 25 708
  • ¥开启¥ 【iAPP实现进入界面执行逐一显】 〖2017-08-25 15:22:14〗 《//首先开一个线程,因...
    小菜c阅读 6,568评论 0 17
  • 周末啦,开心。 把时间记错了,以为菲菲是8号结婚,其实是7号。红包没给,祝福没说,晕死了。等菲菲来广州时补给她。 ...
    行走的大海酱阅读 225评论 0 0
  • 主角阿米尔自幼和仆人的儿子哈桑感情深厚,尤其喜爱一起"追风筝"。在一次风筝大会,阿米尔和哈桑用绝招"疾升骤降",割...
    小熙看世界阅读 1,481评论 0 48