Android中经常会遇到对图片进行二次处理,例如加圆角,或者显示圆形图片

实现的效果图:

方法一:

通过第三方框架Glide实现图片显示有圆角,有三种写法如下:

1.1,第一种实现:

RequestOptions options = new RequestOptions().error(R.drawable.img_load_failure).bitmapTransform(new RoundedCorners(30));//图片圆角为30Glide.with(this).load(URL) //图片地址                .apply(options)                .into(ImagView);

1.2,第二种实现:

RequestOptions requestOptions = new RequestOptions();requestOptions.placeholder(R.drawable.ic_launcher_background);requestOptions.circleCropTransform();requestOptions.transforms( new RoundedCorners(30));Glide.with(this).load(URL) //图片地址                .apply(options)                .into(ImagView);

1.3,第三种实现:

RequestOptions options = new RequestOptions().centerCrop() .transform(new RoundTransform(this,30)); Glide.with(this).load(URL) //图片地址                .apply(options)                .into(ImagView);
public class RoundTransform extends BitmapTransformation {     private static float radius = 0f;     public RoundTransform(Context context) {         this(context, 4);     }        public RoundTransform(Context context, int dp) {         super(context);         this.radius = Resources.getSystem().getDisplayMetrics().density * dp;     }        @Override     protected Bitmap transform(BitmapPool pool, Bitmap toTransform, int outWidth, int outHeight) {         Bitmap bitmap = TransformationUtils.centerCrop(pool, toTransform, outWidth, outHeight);         return roundCrop(pool, bitmap);     }        private static Bitmap roundCrop(BitmapPool pool, Bitmap source) {         if (source == null) return null;         Bitmap result = pool.get(source.getWidth(), source.getHeight(), Bitmap.Config.ARGB_8888);         if (result == null) {             result = Bitmap.createBitmap(source.getWidth(), source.getHeight(), Bitmap.Config.ARGB_8888);         }            Canvas canvas = new Canvas(result);         Paint paint = new Paint();         paint.setShader(new BitmapShader(source, BitmapShader.TileMode.CLAMP, BitmapShader.TileMode.CLAMP));         paint.setAntiAlias(true);         RectF rectF = new RectF(0f, 0f, source.getWidth(), source.getHeight());         canvas.drawRoundRect(rectF, radius, radius, paint);         return result;     }        public String getId() {         return getClass().getName() + Math.round(radius);     }        @Override     public void updateDiskCacheKey(MessageDigest messageDigest) {        }}

方法二:

自定义ImageView:

ImageView iv = findViewById(R.id.iv); Bitmap bitmap =BitmapFactory.decodeResource(getResources(), R.drawable.fengjing);        Bitmap outBitmap =getRoundBitmapByShader(bitmap, 500,300,20, 3);        iv.setImageBitmap(outBitmap);
public class RoundRectImageView extends ImageView{    private Paint paint;    public RoundRectImageView(Context context) {        this(context,null);    }    public RoundRectImageView(Context context, AttributeSet attrs) {        this(context, attrs,0);    }    public RoundRectImageView(Context context, AttributeSet attrs, int defStyle) {        super(context, attrs, defStyle);        paint  = new Paint();    }    /**     * 绘制圆角矩形图片     * @author caizhiming     */    @Override    protected void onDraw(Canvas canvas) {        Drawable drawable = getDrawable();        if (null != drawable) {            Bitmap bitmap = getBitmapFromDrawable(drawable);//            Bitmap bitmap = ((BitmapDrawable) drawable).getBitmap();            Bitmap b = getRoundBitmapByShader(bitmap,getWidth(),getHeight(), 50,0);            final Rect rectSrc = new Rect(0, 0, b.getWidth(), b.getHeight());            final Rect rectDest = new Rect(0,0,getWidth(),getHeight());            paint.reset();            canvas.drawBitmap(b, rectSrc, rectDest, paint);        } else {            super.onDraw(canvas);        }    }    /**     * 把资源图片转换成Bitmap     * @param drawable     * 资源图片     * @return 位图     */    public static Bitmap getBitmapFromDrawable(Drawable drawable) {        int width = drawable.getIntrinsicWidth();        int height = drawable.getIntrinsicHeight();        Bitmap bitmap = Bitmap.createBitmap(width, height, drawable                .getOpacity() != PixelFormat.OPAQUE ? Bitmap.Config.ARGB_8888                : Bitmap.Config.RGB_565);        Canvas canvas = new Canvas(bitmap);        //drawable.setBounds(-4, -4, width + 4, height + 4);        drawable.draw(canvas);        return bitmap;    }    public static Bitmap getRoundBitmapByShader(Bitmap bitmap, int outWidth, int outHeight, int radius, int boarder) {        if (bitmap == null) {            return null;        }        int width = bitmap.getWidth();        int height = bitmap.getHeight();        float widthScale = outWidth * 1f / width;        float heightScale = outHeight * 1f / height;        Matrix matrix = new Matrix();        matrix.setScale(widthScale, heightScale);        //创建输出的bitmap        Bitmap desBitmap = Bitmap.createBitmap(outWidth, outHeight, Bitmap.Config.ARGB_8888);        //创建canvas并传入desBitmap,这样绘制的内容都会在desBitmap上        Canvas canvas = new Canvas(desBitmap);        Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);        //创建着色器        BitmapShader bitmapShader = new BitmapShader(bitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);        //给着色器配置matrix        bitmapShader.setLocalMatrix(matrix);        paint.setShader(bitmapShader);        //创建矩形区域并且预留出border        RectF rect = new RectF(boarder, boarder, outWidth - boarder, outHeight - boarder);        //把传入的bitmap绘制到圆角矩形区域内        canvas.drawRoundRect(rect, radius, radius, paint);        if (boarder > 0) {            //绘制boarder            Paint boarderPaint = new Paint(Paint.ANTI_ALIAS_FLAG);            boarderPaint.setColor(Color.GREEN);            boarderPaint.setStyle(Paint.Style.STROKE);            boarderPaint.setStrokeWidth(boarder);            canvas.drawRoundRect(rect, radius, radius, boarderPaint);        }        return desBitmap;    }}

方法三:

对图片进行处理,此方法还可以加边框

/** * 通过BitmapShader实现圆形边框 * @param bitmap  * @param outWidth 输出的图片宽度 * @param outHeight 输出的图片高度 * @param radius 圆角大小 * @param boarder 边框宽度 */public static Bitmap getRoundBitmapByShader(Bitmap bitmap, int outWidth, int outHeight, int radius, int boarder) {    if (bitmap == null) {        return null;    }    int height = bitmap.getHeight();    int width = bitmap.getWidth();        float widthScale = outWidth * 1f / width;    float heightScale = outHeight * 1f / height;    Matrix matrix = new Matrix();    matrix.setScale(widthScale, heightScale);    //创建输出的bitmap    Bitmap desBitmap = Bitmap.createBitmap(outWidth, outHeight, Bitmap.Config.ARGB_8888);    //创建canvas并传入desBitmap,这样绘制的内容都会在desBitmap上    Canvas canvas = new Canvas(desBitmap);    Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);    //创建着色器    BitmapShader bitmapShader = new BitmapShader(bitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);    //给着色器配置matrix    bitmapShader.setLocalMatrix(matrix);    paint.setShader(bitmapShader);    //创建矩形区域并且预留出border    RectF rect = new RectF(boarder, boarder, outWidth - boarder, outHeight - boarder);    //把传入的bitmap绘制到圆角矩形区域内    canvas.drawRoundRect(rect, radius, radius, paint);    if (boarder > 0) {        //绘制boarder        Paint boarderPaint = new Paint(Paint.ANTI_ALIAS_FLAG);        boarderPaint.setColor(Color.GREEN);        boarderPaint.setStyle(Paint.Style.STROKE);        boarderPaint.setStrokeWidth(boarder);        canvas.drawRoundRect(rect, radius, radius, boarderPaint);    }    return desBitmap;}

实现圆形和边框:

/** * 通过BitmapShader实现圆形边框 * @param bitmap  * @param outWidth 输出的图片宽度 * @param outHeight 输出的图片高度 * @param boarder 边框大小 */public static Bitmap getCircleBitmapByShader(Bitmap bitmap, int outWidth, int outHeight, int boarder) {int radius;int width = bitmap.getWidth();int height = bitmap.getHeight();float widthScale = outWidth * 1f / width;float heightScale = outHeight * 1f / height;Bitmap desBitmap = Bitmap.createBitmap(outWidth, outHeight, Bitmap.Config.ARGB_8888);if (outHeight > outWidth) {    radius = outWidth / 2;} else {    radius = outHeight / 2;}//创建canvasCanvas canvas = new Canvas(desBitmap);Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);BitmapShader bitmapShader = new BitmapShader(bitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);Matrix matrix = new Matrix();matrix.setScale(widthScale, heightScale);bitmapShader.setLocalMatrix(matrix);paint.setShader(bitmapShader);canvas.drawCircle(outWidth / 2, outHeight / 2, radius - boarder, paint);if (boarder > 0) {    //绘制boarder    Paint boarderPaint = new Paint(Paint.ANTI_ALIAS_FLAG);    boarderPaint.setColor(Color.GREEN);    boarderPaint.setStyle(Paint.Style.STROKE);    boarderPaint.setStrokeWidth(boarder);    canvas.drawCircle(outWidth / 2, outHeight / 2, radius - boarder, boarderPaint);}return desBitmap;}

更多相关文章

  1. 短视频app开源源码android 给图片加文字、图片水印
  2. Android(安卓)Animation (动画设计)
  3. Android中向服务器上传图片
  4. android的文件读写
  5. Android:如何显示网络图片
  6. android NDK/JNI-实例开发流程
  7. android 下改变默认的checkbox的 选中 和被选中 图片
  8. Android(安卓)Widget 中ListView加载网络图片
  9. android之动画(一)通过AnimationDrawable控制逐帧动画

随机推荐

  1. Android(安卓)AutoCompleteTextView示例
  2. android Comparator做排序
  3. Android(安卓)应用安装位置
  4. android时间控件DigitalClock的使用
  5. Android(安卓)应用兼容性
  6. android下拉刷新
  7. android 数据库同步
  8. Android(安卓)Icon drawable-hdpi drawab
  9. Android(安卓)写xml
  10. Android(安卓)4+ WIFI 直连