Android实现圆角ImageView


code : https://github.com/HungryGoogle/LeeCustomView

效果图如下:

Android实现圆角ImageView_第1张图片

实现步骤:

1、新增RoundAngleImageView文件,实现自定义view。

      原理:1、重新绘制,采用Mode.DST_OUT去掉重叠部分的原理,先制作重贴部分,删除重叠部分即可

                 2、分别用原理1,在4个角制作出圆角部分,去掉4个角

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;/** * 实现圆角头像 */public class RoundAngleImageView extends ImageView {    private static final int defaultCornerSize = 20; // 单位dp    private Paint paint;    private Paint paint2;    /**     * 根据3点确定一个圆的原理,顶点,向横向边延伸roundWidth确定第2个点,向纵向边延伸确定第3个点。     * 然后去掉圆外面部分     */    private int roundWidth = defaultCornerSize;    private int roundHeight = defaultCornerSize;    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);        // 分别裁剪4个角        drawLeftUp(canvas2);        drawLeftDown(canvas2);        drawRightUp(canvas2);        drawRightDown(canvas2);        canvas.drawBitmap(bitmap, 0, 0, paint2);        bitmap.recycle();    }    private void drawLeftUp(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 drawLeftDown(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);    }}


2、在values目录下新增(如果已经存在不需要新增)attribute.xml


<?xml version="1.0" encoding="utf-8"?>                        


3、在布局文件中可以直接使用,如果包名不一致,请替换包名

                        

4、运行即可看到效果


https://github.com/HungryGoogle/LeeCustomView

更多相关文章

  1. Android Json 使用jsonschema2pojo生成.java文件文件
  2. android camera以时间来命名照片文件
  3. android编辑布局文件时非要降低api level或者更改主题才能显示布
  4. Android学习笔记-Android非布局activity中布局文件及控件加载方
  5. 给Android增加分享库.so文件
  6. Android的log保存到文件上查看
  7. Android应用程序中Manifest.java文件的介绍
  8. Android多文件断点续传(三)——实现文件断点续传

随机推荐

  1. 2013.4.8
  2. Android(安卓)SurfaceFlinger中的工作线
  3. 没事别更新 Android(安卓)SDK 和 ADT
  4. Android中cannot be resolved or is not
  5. [置顶] android fragment hidenChanged方
  6. Android类参考---Fragment(四)
  7. Android的Parcel机制
  8. 几个AR翻译APP
  9. Android(安卓)Service使用方法
  10. Android开发环境的搭建及个人心得