Android HTML.ImageGetter Изображения изменены

У меня есть TextView, который загружает HTML-контент (который также имеет теги img). Моя проблема в том, что некоторые изображения слишком большие, поэтому приложение вылетает. Есть ли способ сделать все изображения одного размера?

Пример моего кода:

            String EntireStire = "<b>" + mItem.title + " </b> <br> <img src='"
                + mItem.photo + "' > " + " <br><small>" + mItem.description
                + " <br> " + mItem.content + "</small>";

        noteView.setText(Html.fromHtml(EntireStire, new MyImageGetter(),
                null));
        noteView.setMovementMethod(LinkMovementMethod.getInstance());
    }

    return rootView;
}

private class MyImageGetter implements Html.ImageGetter {

    @Override
    public Drawable getDrawable(String arg0) {
        Bitmap bitmap;
        try {
            bitmap = BitmapFactory.decodeStream(
                    (InputStream) new URL(arg0).getContent(), null, null);
            @SuppressWarnings("deprecation")
            Drawable drawable = new BitmapDrawable(bitmap);
            drawable.setBounds(0, 0, drawable.getIntrinsicWidth(),
                    drawable.getIntrinsicHeight());
            return drawable;
        } catch (Exception e) {
            Drawable d = getResources().getDrawable(R.drawable.ic_launcher);
            d.setBounds(0, 0, d.getIntrinsicWidth(), d.getIntrinsicHeight());
            return d;
        }
    }
}

person Cosmin Rusu    schedule 13.08.2013    source источник
comment
Вы можете изменить размер растрового изображения следующим образом: stackoverflow.com/a/4837803/2045570   -  person nedaRM    schedule 14.08.2013
comment
Вы можете использовать некоторую ограниченную ширину или высоту, чтобы все отображаемые изображения были одинакового размера. Проверьте мой ответ ниже для деталей.   -  person Khobaib    schedule 04.01.2014


Ответы (3)


Вместо этого используйте этот код, он изменяет размер вашего изображения.

private class MyImageGetter implements Html.ImageGetter {
    private final Context context;

    public MyImageGetter (Context context){
        this.context = context;
    }

    @Override
    public Drawable getDrawable(String source) {
        int path = context.getResources().getIdentifier(source, "drawable",
                BuildConfig.APPLICATION_ID);
            Drawable drawable = context.getResources().getDrawable(path);
            Display display = getWindowManager().getDefaultDisplay();
            Point size = new Point();
            display.getSize(size);
            int widthD = size.x;
            int heightD = size.y;
            drawable.setBounds(0, 0, widthD, (widthD* drawable.getIntrinsicHeight()/ drawable.getIntrinsicWidth()));
            return drawable;

    }
}
person Elaman Tun    schedule 06.04.2017

Использование ограниченной ширины/высоты при установке границ гарантирует, что все изображения будут одинакового размера. Здесь я немного изменил ваш метод MyImageGetter.

private class MyImageGetter implements Html.ImageGetter {

@Override
public Drawable getDrawable(String arg0) {
    Bitmap bitmap;
    try {
        bitmap = BitmapFactory.decodeStream(
                (InputStream) new URL(arg0).getContent(), null, null);
        @SuppressWarnings("deprecation")
        Drawable drawable = new BitmapDrawable(bitmap);
        float multiplier = (float)SOME_CAPPED_WIDTH / (float)drawable.getIntrinsicWidth();
        int width = (int)(drawable.getIntrinsicWidth() * multiplier);
        int height = (int)(drawable.getIntrinsicHeight() * multiplier);
        drawable.setBounds(0, 0, width, height);
        return drawable;
    } catch (Exception e) {
        Drawable d = getResources().getDrawable(R.drawable.ic_launcher);
        d.setBounds(0, 0, d.getIntrinsicWidth(), d.getIntrinsicHeight());
        return d;
    }
}

}

Также для поддержки нескольких размеров экрана можно использовать класс DisplayMetrics.

person Khobaib    schedule 04.01.2014
comment
Не уверен, что он когда-либо отвечал вам, но просто хотел сказать, что это было очень полезно для меня, спасибо! - person Zac Sweers; 19.03.2014

Drawable d = getResources().getDrawable(R.drawable.ic_launcher);
        d.setBounds(0, 0, d.getIntrinsicWidth(), d.getIntrinsicHeight());

если вы хотите изменить размер высоты и ширины, вы можете изменить

Drawable d = getResources().getDrawable(R.drawable.ic_launcher);
        d.setBounds(0, 0, 100, 100);

или если вы хотите сжать его, сделайте следующее

Bitmap bitmap = ((BitmapDrawable)drawable).getBitmap();
ByteArrayOutputStream out = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, out);
drawable = new BitmapDrawable(_context.getResources(),bitmap);
person Hammad Hasan    schedule 07.06.2015