美文网首页Android知识Android技术知识Android开发
Picasso加载失败处理成圆角图片失败

Picasso加载失败处理成圆角图片失败

作者: HannyYeung | 来源:发表于2017-04-13 16:18 被阅读284次
    原因

    我们都知道Picasso可以加载图片,然后自己也可以处理成圆角或者圆形,但是可以发现当我加载图片失败时,处理圆角都会无效:
    先看代码:
    依赖:

    compile'com.squareup.picasso:picasso:2.5.2'
    

    布局文件:

    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:record_view="http://schemas.android.com/apk/res-auto"
        android:id="@+id/main_content"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:fitsSystemWindows="true">
    
        <ImageView
            android:id="@+id/iv_one"
            android:layout_width="100dp"
            android:layout_height="100dp"
            android:layout_margin="20dp" />
    
        <ImageView
            android:id="@+id/iv_two"
            android:layout_width="100dp"
            android:layout_height="100dp"
            android:layout_margin="20dp"
            android:layout_toRightOf="@+id/iv_one" />
    
    </RelativeLayout>
    

    //圆角处理文件

        public RoundedCornersTransformation(int radius, int margin, CornerType cornerType) {
            mRadius = radius;
            mDiameter = radius * 2;
            mMargin = margin;
            mCornerType = cornerType;
        }
    
        @Override public Bitmap transform(Bitmap source) {
    
            int width = source.getWidth();
            int height = source.getHeight();
    
            Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
    
            Canvas canvas = new Canvas(bitmap);
            Paint paint = new Paint();
            paint.setAntiAlias(true);
            paint.setShader(new BitmapShader(source, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP));
            drawRoundRect(canvas, paint, width, height);
            source.recycle();
    
            return bitmap;
        }
    
    
        private void drawRoundRect(Canvas canvas, Paint paint, float width, float height) {
            float right = width - mMargin;
            float bottom = height - mMargin;
    
            switch (mCornerType) {
                case ALL:
                    canvas.drawRoundRect(new RectF(mMargin, mMargin, right, bottom), mRadius, mRadius, paint);
                    break;
                case TOP_LEFT:
                    drawTopLeftRoundRect(canvas, paint, right, bottom);
                    break;
                case TOP_RIGHT:
                    drawTopRightRoundRect(canvas, paint, right, bottom);
                    break;
                case BOTTOM_LEFT:
                    drawBottomLeftRoundRect(canvas, paint, right, bottom);
                    break;
                case BOTTOM_RIGHT:
                    drawBottomRightRoundRect(canvas, paint, right, bottom);
                    break;
                case TOP:
                    drawTopRoundRect(canvas, paint, right, bottom);
                    break;
                case BOTTOM:
                    drawBottomRoundRect(canvas, paint, right, bottom);
                    break;
                case LEFT:
                    drawLeftRoundRect(canvas, paint, right, bottom);
                    break;
                case RIGHT:
                    drawRightRoundRect(canvas, paint, right, bottom);
                    break;
                case OTHER_TOP_LEFT:
                    drawOtherTopLeftRoundRect(canvas, paint, right, bottom);
                    break;
                case OTHER_TOP_RIGHT:
                    drawOtherTopRightRoundRect(canvas, paint, right, bottom);
                    break;
                case OTHER_BOTTOM_LEFT:
                    drawOtherBottomLeftRoundRect(canvas, paint, right, bottom);
                    break;
                case OTHER_BOTTOM_RIGHT:
                    drawOtherBottomRightRoundRect(canvas, paint, right, bottom);
                    break;
                case DIAGONAL_FROM_TOP_LEFT:
                    drawDiagonalFromTopLeftRoundRect(canvas, paint, right, bottom);
                    break;
                case DIAGONAL_FROM_TOP_RIGHT:
                    drawDiagonalFromTopRightRoundRect(canvas, paint, right, bottom);
                    break;
                default:
                    canvas.drawRoundRect(new RectF(mMargin, mMargin, right, bottom), mRadius, mRadius, paint);
                    break;
            }
        }
    
        private void drawTopLeftRoundRect(Canvas canvas, Paint paint, float right, float bottom) {
            canvas.drawRoundRect(new RectF(mMargin, mMargin, mMargin + mDiameter, mMargin + mDiameter),
                    mRadius, mRadius, paint);
            canvas.drawRect(new RectF(mMargin, mMargin + mRadius, mMargin + mRadius, bottom), paint);
            canvas.drawRect(new RectF(mMargin + mRadius, mMargin, right, bottom), paint);
        }
    
        private void drawTopRightRoundRect(Canvas canvas, Paint paint, float right, float bottom) {
            canvas.drawRoundRect(new RectF(right - mDiameter, mMargin, right, mMargin + mDiameter), mRadius,
                    mRadius, paint);
            canvas.drawRect(new RectF(mMargin, mMargin, right - mRadius, bottom), paint);
            canvas.drawRect(new RectF(right - mRadius, mMargin + mRadius, right, bottom), paint);
        }
    
        private void drawBottomLeftRoundRect(Canvas canvas, Paint paint, float right, float bottom) {
            canvas.drawRoundRect(new RectF(mMargin, bottom - mDiameter, mMargin + mDiameter, bottom),
                    mRadius, mRadius, paint);
            canvas.drawRect(new RectF(mMargin, mMargin, mMargin + mDiameter, bottom - mRadius), paint);
            canvas.drawRect(new RectF(mMargin + mRadius, mMargin, right, bottom), paint);
        }
    
        private void drawBottomRightRoundRect(Canvas canvas, Paint paint, float right, float bottom) {
            canvas.drawRoundRect(new RectF(right - mDiameter, bottom - mDiameter, right, bottom), mRadius,
                    mRadius, paint);
            canvas.drawRect(new RectF(mMargin, mMargin, right - mRadius, bottom), paint);
            canvas.drawRect(new RectF(right - mRadius, mMargin, right, bottom - mRadius), paint);
        }
    
        private void drawTopRoundRect(Canvas canvas, Paint paint, float right, float bottom) {
            canvas.drawRoundRect(new RectF(mMargin, mMargin, right, mMargin + mDiameter), mRadius, mRadius,
                    paint);
            canvas.drawRect(new RectF(mMargin, mMargin + mRadius, right, bottom), paint);
        }
    
        private void drawBottomRoundRect(Canvas canvas, Paint paint, float right, float bottom) {
            canvas.drawRoundRect(new RectF(mMargin, bottom - mDiameter, right, bottom), mRadius, mRadius,
                    paint);
            canvas.drawRect(new RectF(mMargin, mMargin, right, bottom - mRadius), paint);
        }
    
        private void drawLeftRoundRect(Canvas canvas, Paint paint, float right, float bottom) {
            canvas.drawRoundRect(new RectF(mMargin, mMargin, mMargin + mDiameter, bottom), mRadius, mRadius,
                    paint);
            canvas.drawRect(new RectF(mMargin + mRadius, mMargin, right, bottom), paint);
        }
    
        private void drawRightRoundRect(Canvas canvas, Paint paint, float right, float bottom) {
            canvas.drawRoundRect(new RectF(right - mDiameter, mMargin, right, bottom), mRadius, mRadius,
                    paint);
            canvas.drawRect(new RectF(mMargin, mMargin, right - mRadius, bottom), paint);
        }
    
        private void drawOtherTopLeftRoundRect(Canvas canvas, Paint paint, float right, float bottom) {
            canvas.drawRoundRect(new RectF(mMargin, bottom - mDiameter, right, bottom), mRadius, mRadius,
                    paint);
            canvas.drawRoundRect(new RectF(right - mDiameter, mMargin, right, bottom), mRadius, mRadius,
                    paint);
            canvas.drawRect(new RectF(mMargin, mMargin, right - mRadius, bottom - mRadius), paint);
        }
    
        private void drawOtherTopRightRoundRect(Canvas canvas, Paint paint, float right, float bottom) {
            canvas.drawRoundRect(new RectF(mMargin, mMargin, mMargin + mDiameter, bottom), mRadius, mRadius,
                    paint);
            canvas.drawRoundRect(new RectF(mMargin, bottom - mDiameter, right, bottom), mRadius, mRadius,
                    paint);
            canvas.drawRect(new RectF(mMargin + mRadius, mMargin, right, bottom - mRadius), paint);
        }
    
        private void drawOtherBottomLeftRoundRect(Canvas canvas, Paint paint, float right, float bottom) {
            canvas.drawRoundRect(new RectF(mMargin, mMargin, right, mMargin + mDiameter), mRadius, mRadius,
                    paint);
            canvas.drawRoundRect(new RectF(right - mDiameter, mMargin, right, bottom), mRadius, mRadius,
                    paint);
            canvas.drawRect(new RectF(mMargin, mMargin + mRadius, right - mRadius, bottom), paint);
        }
    
        private void drawOtherBottomRightRoundRect(Canvas canvas, Paint paint, float right,
                                                   float bottom) {
            canvas.drawRoundRect(new RectF(mMargin, mMargin, right, mMargin + mDiameter), mRadius, mRadius,
                    paint);
            canvas.drawRoundRect(new RectF(mMargin, mMargin, mMargin + mDiameter, bottom), mRadius, mRadius,
                    paint);
            canvas.drawRect(new RectF(mMargin + mRadius, mMargin + mRadius, right, bottom), paint);
        }
    
        private void drawDiagonalFromTopLeftRoundRect(Canvas canvas, Paint paint, float right,
                                                      float bottom) {
            canvas.drawRoundRect(new RectF(mMargin, mMargin, mMargin + mDiameter, mMargin + mDiameter),
                    mRadius, mRadius, paint);
            canvas.drawRoundRect(new RectF(right - mDiameter, bottom - mDiameter, right, bottom), mRadius,
                    mRadius, paint);
            canvas.drawRect(new RectF(mMargin, mMargin + mRadius, right - mDiameter, bottom), paint);
            canvas.drawRect(new RectF(mMargin + mDiameter, mMargin, right, bottom - mRadius), paint);
        }
    
        private void drawDiagonalFromTopRightRoundRect(Canvas canvas, Paint paint, float right,
                                                       float bottom) {
            canvas.drawRoundRect(new RectF(right - mDiameter, mMargin, right, mMargin + mDiameter), mRadius,
                    mRadius, paint);
            canvas.drawRoundRect(new RectF(mMargin, bottom - mDiameter, mMargin + mDiameter, bottom),
                    mRadius, mRadius, paint);
            canvas.drawRect(new RectF(mMargin, mMargin, right - mRadius, bottom - mRadius), paint);
            canvas.drawRect(new RectF(mMargin + mRadius, mMargin + mRadius, right, bottom), paint);
        }
    
    
    
    
        /**
         * Returns a unique key for the transformation, used for caching purposes. If the transformation
         * has parameters (e.g. size, scale factor, etc) then these should be part of the key.
         */
        @Override
        public String key() {
            return "RoundedTransformation(radius=" + mRadius + ", margin=" + mMargin + ", diameter="
                    + mDiameter + ", cornerType=" + mCornerType.name() + ")";
        }
    
    }
    

    代码:

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            String url1 = "http://pic.pimg.tw/lan2899/1309156486-b03cf32a0af988f21e275f647f8efc03.jpg";//图片一
            String url2 = "https://i2.kknews.cc/large/153100054044b3960749";//图片二
            ivOne = (ImageView) findViewById(R.id.iv_one);
            ivTwo = (ImageView) findViewById(R.id.iv_two);
            Picasso.with(this).load(url1).placeholder(R.drawable.default_image).fit().centerCrop().transform(new RoundedCornersTransformation(20, 0)).into(ivOne);
            Picasso.with(this).load(url2).placeholder(R.drawable.default_image).fit().centerCrop().transform(new RoundedCornersTransformation(20, 0)).into(ivTwo);
        }
    

    下面是默认文件:


    default_image.jpg

    运行看看结果:

    result_1.png

    纠结问题

    下面我把图片一的地址改错,之后看看运行情况:

    result_02.png

    可以看到如果图片加载错误,就不会有裁剪的情况.
    所以我想除了一个很笨的办法:
    我对图片加载处理如下:

        Picasso.with(this).load(url1).placeholder(R.drawable.default_image).fit().centerCrop().transform(new RoundedCornersTransformation(20, 0)).into(ivOne, new Callback() {
                @Override
                public void onSuccess() {
    
                }
    
                @Override
                public void onError() {
                    Picasso.with(MainActivity.this).load(R.drawable.default_image).fit().centerCrop().transform(new RoundedCornersTransformation(20, 0)).into(ivOne);
                }
            });
            Picasso.with(this).load(url2).placeholder(R.drawable.default_image).fit().centerCrop().transform(new RoundedCornersTransformation(20, 0)).into(ivTwo, new Callback() {
                @Override
                public void onSuccess() {
    
                }
    
                @Override
                public void onError() {
                    Picasso.with(MainActivity.this).load(R.drawable.default_image).fit().centerCrop().transform(new RoundedCornersTransformation(20, 0)).into(ivTwo);
    
                }
            });
        }
    

    意思就是一个加载回调,失败了我就自己处理去加载本地图片,然后裁剪!,看看结果:

    result_3.png

    还是可以的.

    总结

    总是感觉这方法挺笨的,不知道谁有更好的办法不!有的话,联系我!

    相关文章

      网友评论

        本文标题:Picasso加载失败处理成圆角图片失败

        本文链接:https://www.haomeiwen.com/subject/zsdbattx.html