ビューの背景画像ビットマップを作成しましたが、ビューは背景画像のサイズに拡大されています。..
これは正常ですか?
<?xml version="1.0" encoding="utf-8"?> <bitmap xmlns:Android="http://schemas.Android.com/apk/res/Android" Android:src="@drawable/green" Android:tileMode="repeat"/>
これが私のビューにどのように適用されるかです
v.setBackgroundResource(R.drawable.backgroundgreen);
例えば...
画像を背景として設定した後、画像の高さが500ピクセルで、ビューの高さが200ピクセルの場合(wrap_contentを高さとして設定)、ビューの高さは500ピクセルになります...
私によると、あなたが直面している問題は問題ではなく、レイアウトの設計にAndroidを使用する方法です。
これは、3つのデフォルトの定数値で高さと幅を設定できることを意味します。
FILL_PARENTView
によって要求された高さまたは幅の特別な値。 FILL_PARENT
は、ビューがその親と同じ大きさを望んでいることを意味し、もしあれば親のパディングを差し引いています。この値はAPIレベル8から非推奨になり、MATCH_PARENT
に置き換えられました。
MATCH_PARENTView
によって要求された高さまたは幅の特別な値。 MATCH_PARENT
は、ビューがその親と同じ大きさを望んでいることを意味し、もしあれば親のパディングを差し引いています。 APIレベル8で導入されました。
WRAP_CONTENTView
によって要求された高さまたは幅の特別な値。 WRAP_CONTENT
は、View
が、独自のパディングを考慮して、独自の内部コンテンツに適合するだけの大きさになりたいことを意味します。
これで、View
の高さ/幅をWRAP_CONTENT
に設定すると、ビューのコンテンツに表示するのに十分なサイズをビューに許可することになります。背景画像はView
のコンテンツでもあるため、画像と同じサイズのビューが表示されます。それは問題ではありません、それはそれが示されている方法です。
わかりました。しかし、あなたの状況では、あなたには問題があります。それは、あなたが見せたり見たりする背景があるからです。いくつかの方法を提案できます。
最初の非常に明白なこと:正しいサイズの画像を作成し、異なる drawable folder に保存します。
constants ではなく、 [〜#〜] dp [〜#〜] でビューのサイズを指定します。必要に応じて、サイズごとに異なるレイアウトXMLファイルを作成し、 レイアウトフォルダー に保存します。
設計レイアウトに非常に有用なものを使用できます layout weight 。
この同じ問題に直面しました。
背景画像のサイズがビューのサイズよりも大きい場合、ビューのサイズは画像のサイズに合わせて変更されます。
ソリューション
ImageViewのsrc
を背景画像に設定します
<RelativeLayout
.
.
. >
<ImageView
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:layout_alignLeft="@+id/yourViewId"
Android:layout_alignRight="@+id/yourViewId"
Android:layout_alignTop="@+id/yourViewId"
Android:layout_alignBottom="@+id/yourViewId"
Android:adjustViewBounds="true"
//this will allow the image to resize with same proportions
Android:src="@drawable/yourDrawable" />
<YourView
Android:id="@+id/yourViewId"
.
..
... />
</RelativeLayout>
もちろん、これはすべてコードで実行できます。
ラッパーレイアウトを作成し、そこに背景画像を配置することをお勧めします。私はそれをそのように使用しており、非常にうまく適合しています。以下の例を参照してください
<ScrollView
xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:id="@+id/settingstab_scroll"
Android:layout_width="fill_parent"
Android:layout_height="fill_parent"
Android:scrollbars="vertical"
Android:background="@drawable/wareninja_wallpaper_img"
>
<!-- your layouts and components goes here -->
</ScrollView>
その理由は非常に簡単です。 View :: getSuggestedMinimumWidth/Heightメソッドを参照する必要があります。
protected int getSuggestedMinimumWidth() {
return (mBackground == null) ? mMinWidth : max(mMinWidth, mBackground.getMinimumWidth());
}
protected int getSuggestedMinimumHeight() {
return (mBackground == null) ? mMinHeight : max(mMinHeight, mBackground.getMinimumHeight());
}
それを見ると、なぜ背景がビューを大きくするのか、特にBitmapDrawableをそれに割り当てる理由がわかるかもしれません。
簡単な解決策は、そのDrawable(たとえばBitmapDrawable)をラップしてから、getMinimumHeight()およびgetMinimumWidth()に対して0を返し、getIntrinsicHeight()およびgetIntrinsicWidth()をオーバーライドして-1を返すことです。
support-v7には、必要に応じて呼び出しを別のドロウアブルに委任するDrawableWrapperがあります。その1つを拡張し、上記のメソッドをオーバーライドできます。
また、support-v7を使用しない場合(すごい!)、そのクラスをプロジェクトにコピーしても問題ありません。
それは私のために働いています。
< ?xml version="1.0" encoding="utf-8"?>
< LinearLayout
xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:orientation="vertical"
Android:layout_width="fill_parent"
Android:layout_height="fill_parent" Android:id="@+id/LinearLayoutTest">
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.prueba);
((LinearLayout)findViewById(R.id.LinearLayoutTest)).setBackgroundResource(R.drawable.greenrepeat);
}
あなたのコードでは、vは何ですか? fill_parentへのパラメーターがありますか?
私の場合、完璧に機能する1つの良い解決策は、View
を拡張し、onMeasure()
をオーバーライドすることです。
実行する手順は次のとおりです。
View
を拡張します。ここでは、たとえばButton
を使用します。onMeasure()
をオーバーライドし、コードを下部に挿入します。これにより、最初の測定が完了した後にバックグラウンドリソースが設定されます。 2番目の測定イベントでは、既に測定されたパラメーターを使用します。Button
を拡張するカスタムビューのサンプルコード(ボタンを拡張するビューに変更します)
_public class MyButton extends Button {
boolean backGroundSet = false;
public MyButton(Context context) {
super(context);
}
public MyButton(Context context, AttributeSet attrs) {
super(context, attrs);
}
public MyButton(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
if(backGroundSet) {
setMeasuredDimension(getMeasuredWidth(), getMeasuredHeight());
return;
}
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
backGroundSet = true;
setBackgroundResource(R.drawable.button_back_selector);
}
}
_
ここで変更する必要があるのは、拡張するビューのタイプと、onMeasure()
メソッドでビューに使用するバックグラウンドリソースだけです。
その後、レイアウトxmlでこのビューを使用するか、プログラムで追加します。
Android:tileMode="repeat"
を使用しないでください。あなたの緑のドローアブルはあなたのビューよりも大きいですか、小さいですか?さらに詳細を追加できますか?