在Android 3.0+中使用相同代码不可见的SVG图像

rek*_*ire 10 svg android android-imageview svg-android

我有一个测试应用程序,我有一个ListView与一个项目,其中包含两个图像.

nexus 7 vs.欲望高清

正如您在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>
Run Code Online (Sandbox Code Playgroud)

这是我设置图像的基本代码:

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);
Run Code Online (Sandbox Code Playgroud)

SVG paser来自svg-android.

rek*_*ire 17

问题是硬件加速.解决方案是使用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);
}
Run Code Online (Sandbox Code Playgroud)


ffl*_*dro 15

您的解决方案的问题在于,在将其转换为a时,您将丢失所有绘图信息Bitmap.在你的情况不适用,但如果你需要支持ZoomingPanning,你会被缩放和调整大小Bitmap,并会得到像素化图形.另外,将Picturea 绘制成a Bitmap然后由View包含它的绘制效率要低得多.

我遇到了同样的问题并通过仅在将绘制以下内容的视图上关闭硬件加速来解决它Picture:

view.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
Run Code Online (Sandbox Code Playgroud)

但是,自API 11以来仅支持setLayerType.因此请使用此方法:

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);
    }
}
Run Code Online (Sandbox Code Playgroud)