Изображение SVG не отображается в android 3.0+ с тем же кодом
У меня есть тестовое приложение, в котором у меня есть ListView с элементом, который содержит на нем два изображения.
![nexus 7 vs. desire 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.
Ответы
Ответ 1
Проблема заключается в аппаратном ускорении. Решение состоит в том, чтобы использовать 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);
}
Ответ 2
Проблема с вашим решением заключается в том, что вы теряете всю информацию чертежа при преобразовании его в 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);
}
}