新建OvalImageView类继承android.support.v7.widget.AppCompatImageView

import android.content.Context;import android.content.res.TypedArray;import android.graphics.Bitmap;import android.graphics.BitmapShader;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Matrix;import android.graphics.Paint;import android.graphics.Rect;import android.graphics.Shader;import android.graphics.drawable.BitmapDrawable;import android.graphics.drawable.ColorDrawable;import android.graphics.drawable.Drawable;import android.util.AttributeSet;import android.widget.ImageView; import com.fucaijin.sample.R; /** * 圆形的ImageView */ public class OvalImageView extends android.support.v7.widget.AppCompatImageView {    private Paint mPaintBitmap = new Paint(Paint.ANTI_ALIAS_FLAG);//抗锯齿    private Bitmap mRawBitmap;    private BitmapShader mShader;    private Matrix mMatrix = new Matrix();    private int strokeColor = 0xFFFFFFFF;//默认边框是白色    private float strokeWidth = 0;//单位是像素的边框宽度     public OvalImageView(Context context, AttributeSet attrs) {        super(context, attrs);    }     @Override    protected void onDraw(Canvas canvas) {//        获取资源图片并转为Bitmap        Bitmap rawBitmap = getBitmap(getDrawable());        if (rawBitmap != null) {//            取较短的那一个作为圆的半径,保证整张图能填满整个圆            int viewWidth = getWidth();            int viewHeight = getHeight();            int viewMinSize = Math.min(viewWidth, viewHeight);            float dstWidth = viewMinSize;            float dstHeight = viewMinSize;            if (mShader == null || !rawBitmap.equals(mRawBitmap)) {                mRawBitmap = rawBitmap;                mShader = new BitmapShader(mRawBitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);            }            if (mShader != null) {                mMatrix.setScale(dstWidth / rawBitmap.getWidth(), dstHeight / rawBitmap.getHeight());                mShader.setLocalMatrix(mMatrix);            }            mPaintBitmap.setShader(mShader);            float radius = viewMinSize / 2.0f;             // 如果边框宽度不为0,则画出边框            if(strokeWidth != 0){                Paint whitePaint = new Paint(Paint.ANTI_ALIAS_FLAG);                whitePaint.setColor(strokeColor);// 首先画一个圆,填充的是边框的颜色,大小就是此控件设置的大小                canvas.drawCircle(radius, radius, radius, whitePaint);// 在边框的圆的基础上再画一个圆,画的是图片,半径 = 此控件设置的大小 - 边框宽度,就露出了边框                canvas.drawCircle(radius, radius, radius - strokeWidth, mPaintBitmap);            }else {// 如果边框为0,直接画一个圆形图片即可                canvas.drawCircle(radius, radius, radius, mPaintBitmap);            }        } else {            super.onDraw(canvas);        }    }     private Bitmap getBitmap(Drawable drawable) {        if (drawable instanceof BitmapDrawable) {            return ((BitmapDrawable) drawable).getBitmap();        } else if (drawable instanceof ColorDrawable) {            Rect rect = drawable.getBounds();            int width = rect.right - rect.left;            int height = rect.bottom - rect.top;            int color = ((ColorDrawable) drawable).getColor();            Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);            Canvas canvas = new Canvas(bitmap);            canvas.drawARGB(Color.alpha(color), Color.red(color), Color.green(color), Color.blue(color));            return bitmap;        } else {            return null;        }    }    /**     * @param strokeWidth 要设置的边框宽度,单位是px     */        public void setStrokeWidth(int strokeWidth) {this.strokeWidth = strokeWidth}    /**     * @param strokeColor 要设置的边框颜色,必须是带透明度的16进制,例如:0xFF0000FF     */public void setStrokeColot(int strokeColor) {this.strokeColor = strokeColor}}

在xml文件中使用

<com.csti.datastructureteachingsystem.helper.OvalImageView        android:id="@+id/headphoto"        android:layout_width="100dp"        android:layout_height="100dp"        android:layout_marginTop="8dp"        android:scaleType="fitCenter"        app:layout_constraintEnd_toEndOf="parent"        app:layout_constraintHorizontal_bias="0.498"        app:layout_constraintStart_toStartOf="parent"        app:layout_constraintTop_toTopOf="parent"        app:srcCompat="@drawable/avatar"        tools:srcCompat="@drawable/avatar"/>

更多相关文章

  1. android GLSurfaceView 异常处理
  2. 简单的四种动画Demo
  3. 安卓如何关闭软键盘?
  4. webview导入H5小游戏
  5. Android应用开机自启
  6. Android(安卓)ArrayListAdapter泛型类
  7. Android(安卓)TextView 丰富多彩的字体样式代码
  8. 小红点
  9. Android(安卓)弹框没有背景色及背景边框设置

随机推荐

  1. 2021.1.30
  2. 学习Linux的第13天
  3. 学习打卡 1-30 半完成
  4. java实现多行html文本转换成单行文本,并用
  5. Google Fuchsia OS 可能的第一款手机曝光
  6. Redis安装与使用之Java连接Redis
  7. GIMP 2018 年回顧:2.10 版及其後
  8. Java客户端Jedis 对Redis的几种调用方式
  9. Linux下使用Rinetd来实现端口转发
  10. Debian 10 Buster release party 重庆站