web-dev-qa-db-ja.com

23未満のAPIで正しくレンダリングされていないレイヤーリストで描画可能な形状

昨日、Android Studioバージョン2.1.3に切り替えました。今日、プロジェクトの1つを再度開いて、ImageViewで使用するレイヤーリストドローアブルをいくつか追加しようとしました。たとえば、これは次のとおりです。

<layer-list xmlns:Android="http://schemas.Android.com/apk/res/Android">
    <item Android:width="80px" Android:height="80px"
        Android:top="0px" Android:left="0px" 
        Android:right="0px" Android:bottom="0px">
        <shape Android:shape="rectangle">
            <solid Android:color="@color/deep_orange"/>
        </shape>
    </item>
    <item Android:width="60px" Android:height="60px"
        Android:top="10px" Android:left="10px" 
        Android:right="10px" Android:bottom="10px">
        <shape Android:shape="oval">
            <solid Android:color="@color/light_yellow"/>
        </shape>
    </item>
</layer-list>

yellow circle above orange square

これは、Android Studioバージョンをアップグレードする前に取得したものであり、「IDEでレイアウトをレンダリングするときに使用するAndroidバージョン」として23を選択した場合にプレビューで取得するものです。 。

ただし、23未満のバージョンを選択すると、正方形だけが表示されます。

orange square, no circle

残念ながら、エミュレーター(Lollipop 22)またはデバイス(Jellybean 18)でアプリを実行すると、正方形しか表示されません。

これが役立つ場合に備えて:

  • compileSdkVersion 23
  • buildToolsVersion "23.0.3"
  • minSdkVersion 11
  • targetSdkVersion 23
  • buildTypeデバッグには何もありません
  • 依存関係:コンパイル 'com.Android.support:appcompat-v7:23.0.1'
  • ActivityAppCompatActivityを拡張します

この問題は、どういうわけか、上位層にtopleftright、およびbottomを使用することに関連していると思います。正方形の上に円を配置するだけで、プレビューと「本物」がすべてのAPIレベルで期待どおりに機能するためです。

[〜#〜] edit [〜#〜]また、同じコード/ xmlと次の(自動的に作成された)build.gradleを使用して新しいプロジェクトを開始しました:

  • compileSdkVersion 24
  • buildToolsVersion "24.0.2"
  • minSdkVersion 15
  • targetSdkVersion 24
  • buildTypeデバッグには何もありません
  • 依存関係:コンパイル 'com.Android.support:appcompat-v7:24.2.0'
  • ActivityAppCompatActivityを拡張します

ここでも同じ動作です。topleftright、およびbottomを値!= 0で使用すると、APIレベル<= 22の上位層はレンダリングされません。


だから私の質問は:Android Studio 2.1.3を使用して、すべてのAPIレベルの「インセット付き」のシェイプドローアブルを作成するにはどうすればよいですか?

11
Bö macht Blau

まず、問題の分析を手伝ってくれた @ pskink に感謝します:)

質問のxmlは、APIレベル23以降で機能しました。

「item」タグ内で幅と高さを設定することができます

のように @ Android開発者 状態 this SO post

widthタグを使用してheightShapeDrawable属性とsize属性を設定する必要があるため、下位バージョンでは機能しませんでした。

Androidは、挿入図(上、左、右、下)を考慮しながら、ドローアブル(->アスペクト比!)をスケーリングする方法を理解するためのサイズが必要だと思います。

また、(特定のAPIレベルの)xmlの形式が正しくない場合もあるように、Androidはサイレントに失敗し、単に形状を描画しませんでした。

したがって、解決策は次のとおりです。

<layer-list xmlns:Android="http://schemas.Android.com/apk/res/Android">
    <item Android:width="80px" Android:height="80px"
        Android:top="0px" Android:left="0px" 
        Android:right="0px" Android:bottom="0px">
        <shape Android:shape="rectangle">
            <solid Android:color="@color/deep_orange"/>
        </shape>
    </item>
    <item Android:width="60px" Android:height="60px"
        Android:top="10px" Android:left="10px" 
        Android:right="10px" Android:bottom="10px">
        <shape Android:shape="oval">
            <solid Android:color="@color/light_yellow"/>
            <size Android:height="60px" Android:width="60px"/>
        </shape>
    </item>
</layer-list>
12
Bö macht Blau