10

2つの画像を含むアイテムを含むListViewを取得したテストアプリがあります。

ネクサス7対欲望hd

ご覧のとおり、API 17デバイスでは再生ボタン(SVG画像)が表示されませんが、API10デバイスでは表示されます。どうすれば修正できますか?

私のレイアウトファイル:

<?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からのものです。

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. あなたの場合は当てはまりませんが、 と をサポートする必要がある場合はZoomingPanningをスケーリングおよびサイズ変更し、Bitmapピクセル化されたグラフィックを取得します。Pictureさらに、 aを aBitmapに描画し、それを含む によって描画されるのははるかに非効率的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);
    }
}
于 2012-12-27T12:11:07.747 に答える