Android 開發:glide圓角,圓形,效率問題

karspb發表於2021-09-09

1.目前能百度到的glide圓角,圓形方案都是錯誤的

2.實際上glide在後續的新版本里提供了圓角圓形方案。

剛開始我在做專案的時候,採用了百度到的方案,結果發現百度到的程式碼效率極差,尤其是在做recycleView的時候,展示圖片慢成狗。

於是我重新研究了glide程式碼,以及官方文件。

注:以下示例

圓形:

public class GlideCircleTransform extends BitmapTransformation {    private static final String ID = "com.xiaohe.";    private static final byte[] ID_BYTES = ID.getBytes(CHARSET);    @Override

    protected Bitmap transform(@NonNull BitmapPool pool, @NonNull Bitmap toTransform, int outWidth, int outHeight) {        int size = Math.min(toTransform.getWidth(), toTransform.getHeight());        int x = (toTransform.getWidth() - size) / 2;        int y = (toTransform.getHeight() - size) / 2;

        Bitmap square = Bitmap.createBitmap(toTransform, x, y, size, size);

        Bitmap circle = pool.get(size, size, Bitmap.Config.ARGB_8888);

        Canvas canvas = new Canvas(circle);

        Paint paint = new Paint();

        paint.setShader(new BitmapShader(square, BitmapShader.TileMode.CLAMP, BitmapShader.TileMode.CLAMP));

        paint.setAntiAlias(true);        float r = size / 2f;

        canvas.drawCircle(r, r, r, paint);        return circle;

    }    @Override

    public boolean equals(Object obj) {        return obj instanceof GlideCircleTransform;

    }    @Override

    public int hashCode() {        return ID.hashCode();

    }    @Override

    public void updateDiskCacheKey(@NonNull MessageDigest messageDigest) {

        messageDigest.update(ID_BYTES);

    }

}

圓角:

public class GlideRoundTransform  extends BitmapTransformation {    private static final String ID = "com.xiaohe.";    private static final byte[] ID_BYTES = ID.getBytes(CHARSET);    private int radius;    public GlideRoundTransform(Context context, int radius) {        this.radius = UUi.dp2px(radius);

    }    @Override

    protected Bitmap transform(@NonNull BitmapPool pool, @NonNull Bitmap toTransform, int outWidth, int outHeight) {        int width = toTransform.getWidth();        int height = toTransform.getHeight();

        Bitmap bitmap = pool.get(width, height, Bitmap.Config.ARGB_8888);

        bitmap.setHasAlpha(true);

        Canvas canvas = new Canvas(bitmap);

        Paint paint = new Paint();

        paint.setAntiAlias(true);

        paint.setShader(new BitmapShader(toTransform, BitmapShader.TileMode.CLAMP, BitmapShader.TileMode.CLAMP));

        canvas.drawRoundRect(new RectF(0, 0, width, height), radius, radius, paint);        return bitmap;

    }    @Override

    public boolean equals(Object obj) {        if (obj instanceof GlideRoundTransform) {

            GlideRoundTransform other = (GlideRoundTransform) obj;            return radius == other.radius;

        }        return false;

    }    @Override

    public int hashCode() {        return Util.hashCode(ID.hashCode(), Util.hashCode(radius));

    }    @Override

    public void updateDiskCacheKey(@NonNull MessageDigest messageDigest) {

        messageDigest.update(ID_BYTES);        byte[] radiusData = ByteBuffer.allocate(4).putInt(radius).array();

        messageDigest.update(radiusData);

    }

}

------------------------------------------------我是分割線------------------------------------------------

解釋說明:

問:為嘛這個示例效率高?????

答:這個示例明顯重寫了三個方法,百度到的程式碼都是重寫了兩個方法,並不能讓glide執行正常!!!!

-----------------------------------------------再分割------------------------------------------------------------

其實新版本的glide提供了這兩個方法

圓角:RequestOptions.bitmapTransform(new RoundedCorners( 5))

圓形:RequestOptions.bitmapTransform(new CircleCrop())

又跳過了一個坑。。。。。。。。。。。。。。。。。。。。開心



作者:王二蛋和他的狗
連結:


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/2001/viewspace-2821858/,如需轉載,請註明出處,否則將追究法律責任。

相關文章