Изображение 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-paser – это svg-android .

Solutions Collecting From Web of "Изображение SVG не отображается в android 3.0+ с тем же кодом"

Проблема заключается в аппаратном ускорении. Решение состоит в том, чтобы использовать bitmaps instad of drawables. Для исправления я добавил эту функцию в 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); } }