1. ホーム
  2. android

[解決済み] ベクターの描画が期待通りに拡大縮小されないのはなぜですか?

2022-10-30 02:35:58

質問

Androidアプリでベクターデータを使用しようとしています。 以下から http://developer.android.com/training/material/drawables.html (強調) を参照してください。

<ブロッククオート

Android 5.0 (API Level 21) 以降では、ベクター形式のdrawableを定義することができます。 を定義することができます。

このdrawableを使って

<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:height="24dp"
android:width="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path android:fillColor="@color/colorPrimary" android:pathData="M14,20A2,2 0 0,1 12,22A2,2 0 0,1 10,20H14M12,2A1,1 0 0,1 13,3V4.08C15.84,4.56 18,7.03 18,10V16L21,19H3L6,16V10C6,7.03 8.16,4.56 11,4.08V3A1,1 0 0,1 12,2Z" />

と、このImageView。

<ImageView
    android:layout_width="400dp"
    android:layout_height="400dp"
    android:src="@drawable/icon_bell"/>

は、アイコンを 400dp で表示しようとすると、このぼやけた画像を生成します (ロリポップを実行している 2015 年頃の大型高解像度モバイル デバイス上)。

vector drawable の定義で width と height を 200dp に変更すると、400dp のレンダリングサイズでの状況は大幅に改善されます。 しかし、これを TextView 要素 (つまり、テキストの左側のアイコン) の drawable として設定すると、巨大なアイコンが作成されるようになりました。

私の質問です。

1) なぜベクター描画可能なものに幅と高さの指定があるのでしょうか? これらの全体のポイントは、ロスレスで拡大縮小することであり、その定義において幅と高さは無意味だと思ったのですが?

2) TextView上で24dpのdrawableとして機能する単一のベクターdrawableを使用することは可能でしょうか? 例: 異なるサイズの複数のベクトル描画可能ファイルの作成を避け、代わりに私のレンダリング要件に合わせてスケールアップするものを使用するにはどうすればよいですか?

3) どうすれば効果的に width/height 属性を使用できますか、また viewportWidth/height との違いは何ですか?

追加の詳細です。

  • デバイスは API 22 を実行しています。
  • Android Studio v1.5.1 と Gradle version 1.5.0 を使用しています。
  • マニフェストは、コンパイルとターゲットレベル23、最小レベル15です。 min levelを21に移動することも試しましたが、違いはありませんでした。
  • APK をデコンパイルすると (min level を 21 に設定した場合)、drawable フォルダに 1 つの XML リソースが表示されます。 ラスタライズされた画像は生成されません。

どのように解決するのですか?

この問題についての新しい情報はこちらです。

https://code.google.com/p/android/issues/detail?id=202019

を使っているように見えますが android:scaleType="fitXY" を使うと、ロリポップでも正しく拡大縮小されるようです。

Googleのエンジニアより。

画像をシャープに見せるために、scaleType='fitXY' が回避策になるかどうか教えてください。 画像がシャープに見えるようにするためです。

マシュマロ対ロリポップは、マシュマロに追加された特別なスケーリング処理に起因しています。 マシュマロに追加された特別なスケーリング処理によるものです。

また、コメントについて: "正しい動作です。ベクター描画可能な は、品質を損なうことなく拡大縮小する必要があります。したがって、アプリケーションで同じアセットを 3 つのサイズで使用する場合 を 3 種類のサイズで使用したい場合、ハードコードされた異なるサイズの vector_drawable.xml を 3 回、異なるハードコードされたサイズで複製する必要はありません。

私はこれがそうであるべきだと完全に同意しますが、現実には、Android プラットフォームにはパフォーマンス上の問題があります。 Android プラットフォームにはパフォーマンス上の懸念があるため、まだ理想的な世界には到達していません。 理想的な世界にはまだ到達していません。 そのため、パフォーマンスを向上させるために、3 つの異なる vector_drawable.xml を使用することをお勧めします。 3つのサイズを同時に画面に描画したい場合は、3種類のvector_drawable.xmlを使用することをお勧めします。

技術的な詳細は、基本的にフックの下でビットマップを使用しています。 を使用して、複雑なパスのレンダリングをキャッシュし、最高の再描画パフォーマンスを得ることができます。 再描画のパフォーマンスは、ビットマップのドローアブルを再描画するのと同等です。