web-dev-qa-db-ja.com

Android背景をトリミング

幅がfill_parentに設定され、高さがwrap_contentに設定されたLinearLayoutがあります。ここでpngファイルから背景を与えたいのですが、従来の方法でそれを行うと、LinearLayoutのサイズが変更され、追加の部分をトリミングする代わりに背景全体が表示されます。

サイズを変更しないようにLinearLayoutの背景を設定するにはどうすればよいですか?

ありがとう

28
Sebastian Nowak

このようなことは、ImageViewを使用し、それに応じてscaleTypeパラメータを設定することでのみ達成できるようです。簡単な回避策は、FrameLayoutを使用し、ImageViewを背景が透明な別のレイアウトの下に配置することです。

コード:

<FrameLayout 
    xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent">

    <ImageView
        Android:id="@+id/imageView1"
        Android:layout_width="match_parent"
        Android:layout_height="match_parent"
        Android:scaleType="centerCrop"
        Android:src="@drawable/background" />

</FrameLayout>
31
Sebastian Nowak

背景ビットマップのデフォルトの動作は、コンテナーを完全に塗りつぶし、必要に応じてコンテナーの水平および垂直サイズを拡大することです。解決策は、描画可能なビットマップリソースを作成し、重力を変更することです。

次のリンクをチェックして、可能な重力値を探してください。これで、ビューはドローアブルリソースを参照するだけになり、問題はありません。

http://developer.Android.com/guide/topics/resources/drawable-resource.html#Bitmap

6

これを解決するには、LinearLayoutをサブクラス化し、onMeasure(int,int)コールバックをオーバーライドしてから、レイアウトXMLを更新して新しいレイアウトタイプを使用します。私はその正確なコードを投稿する自由はありませんが、私がしたことはsuper.onMeasure(int,int)実装を呼び出し、測定された高さが私の背景画像の正確な高さとして戻ったかどうかを確認することでした。その場合は、すべての子ビューの測定された高さを取得し、新しい高さの値を計算して、それをsetMeasuredDimension(int,int)に渡します。

1
Barend