SVG изображение не видно в Android 3.0+ с тем же кодом

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

Nexus 7 против желания HD

Как вы можете видеть, в устройстве API 17 не отображается кнопка воспроизведения (изображение SVG), в то время как устройство API 10 делает это. Как я могу это исправить?

Мой файл макета:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <ImageView
        android:id="@+id/background"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_centerVertical="true"
        android:scaleType="centerCrop" />

    <ImageView
        android:id="@+id/forceground"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_centerVertical="true" />

</RelativeLayout>

Вот мой основной код, где я устанавливаю изображения:

View preview = inflater.inflate(R.layout.list_video_preview, parent, false);
ImageView background = (ImageView)preview.findViewById(R.id.background);
ImageView forceground = (ImageView)preview.findViewById(R.id.forceground);
PictureDrawable play = SVGParser.getSVGFromResource(parent.getResources(), R.raw.play_blue).createPictureDrawable();
forceground.setImageDrawable(play);

SVG-пазер из svg-android.

2 ответа

Решение

Проблема в аппаратном ускорении. Решение состоит в том, чтобы использовать растровые изображения вместо рисованных. Для исправления, что я добавил эту функцию в SVG.java который возвращает BitmapDrawable:

public BitmapDrawable createBitmapDrawable(Context context) {
    Bitmap bitmap = Bitmap.createBitmap(picture.getWidth(), picture.getHeight(), Config.ARGB_8888);
    Canvas canvas = new Canvas(bitmap);
    PictureDrawable drawable = new PictureDrawable(picture);
    drawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight());
    drawable.draw(canvas);
    return new BitmapDrawable(context.getResources(), bitmap);
}

Проблема с вашим решением состоит в том, что вы теряете всю информацию о чертеже при преобразовании ее в Bitmap, В вашем случае это не относится, но если вам нужно было поддержать Zooming а также Panning, вы бы масштабировать и изменять размер Bitmap и получит пиксельную графику. Кроме того, гораздо более неэффективно рисовать Picture в Bitmap который затем будет нарисован View это содержит это.

У меня была та же проблема, с которой вы столкнулись, и я решил ее, отключив аппаратное ускорение только в том случае, если Picture:

view.setLayerType(View.LAYER_TYPE_SOFTWARE, null);

Однако setLayerType поддерживается только начиная с API 11. Поэтому используйте этот метод:

public static void setHardwareAccelerated(View view, boolean enabled){
    if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB){
        if(enabled)
            view.setLayerType(View.LAYER_TYPE_HARDWARE, null);
        else view.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
    }
}
Другие вопросы по тегам