10

我有一个测试应用程序,其中有一个 ListView,其中包含两个图像。

Nexus 7 与欲望高清

正如您在 API 17 设备中看到的那样,API 10 设备不显示播放按钮(SVG 图像)。我该如何解决?

我的布局文件:

<?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

4

2 回答 2

17

问题是硬件加速。解决方案是使用位图而不是可绘制对象。为了解决这个问题,我将此函数添加到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);
}
于 2012-12-21T14:34:30.037 回答
15

您的解决方案的问题是,在将其转换为Bitmap. 在您的情况下,它不适用,但如果您需要支持Zoomingand Panning,您将缩放和调整 a 的大小Bitmap并获得像素化图形。Picture此外,将 a 绘制到 a中效率要低得多Bitmap,然后将由View包含它的 the 绘制。

我遇到了同样的问题,并通过仅在将绘制的视图上关闭硬件加速来解决它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);
    }
}
于 2012-12-27T12:11:07.747 回答