늘어나지 않는 android : background를 구현하는 방법은 무엇입니까?


100

나는 "케이크를 먹고 그것도 가지고있는"방법을 설명하는 이 훌륭한 스레드 를 발견했다 . 즉, Button대신에 이미지를 사용한다 ImageButton(허용하지 않는 것 SetText(), 크기 조정 등).

이는 View 속성을 사용하여 수행됩니다.

android:background="@drawable/bgimage"

이것의 유일한 문제는 버튼 크기에 맞게 이미지를 늘린다는 것입니다.

고정 된 버튼 크기 (픽셀 단위!)를 하드 코딩 하지 않고 Android 에 배경 이미지를 전혀 늘리지 않고 자르거나 패딩하도록 지시하는 방법 이 있습니까?

답변:


29

확장하지 않으려면 ImageView를 사용해야합니다 . 배경 이미지는 항상 뷰에 맞게 늘어납니다. 이미지 측면을 개체에 강제로 적용하려면 Drawable로 설정해야합니다.

그렇지 않고 버튼 아이디어를 고수한다면 이미지가 늘어나는 것을 방지하기 위해 버튼의 크기 조절을 강제해야합니다.

암호:

onCreate(Bundle bundle) {
  // Set content layout, etc up here

  // Now adjust button sizes
  Button b = (Button) findViewById(R.id.somebutton);
  int someDimension = 50; //50pixels
  b.setWidth(someDimension);
  b.setHeight(someDimension);
}

1
감사합니다 + 1. ImageView흥미로워 보입니다. 나는에없는 속성을 가지고주의 Button: android:cropToPadding. 대신 ImageView를 사용해도 괜찮 setOnClickListener()습니다. 에서 Button로 전환하면 무엇을 잃게 ImageView됩니까?
ef2011

1
BTW, 제안한 두 번째 솔루션은 여전히 ​​이미지를 늘립니다.
ef2011

고정 된 버튼 크기 (픽셀 단위!)를 사용하게되었지만 첫 번째 제안이 작동하는 대체 솔루션처럼 보이기 때문에 귀하의 답변을 수락합니다.
ef2011

1
@ ef2011 ImageView의 경우 배경 이미지로 설정하지 말고 a로 설정 setDrawableResource한 다음 setAdjustViewBoundstrue로 설정해야합니다
Dr.J

9
절름발이 솔루션에 대한 찬성 투표. 올바른 솔루션 : stackoverflow.com/a/9362168/145046
Aleks N.

260

xml 비트 맵을 작성하여보기의 배경으로 사용할 수 있습니다. 스트레칭을 방지하기 위해 android:gravity속성 을 지정할 수 있습니다 .

예를 들면 :

<?xml version="1.0" encoding="utf-8"?>
<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
    android:src="@drawable/dvdr"
    android:tileMode="disabled" android:gravity="top" >
</bitmap>

이미지 렌더링을 사용자 정의하는 데 사용할 수있는 많은 옵션이 있습니다.

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


3
ImageViews를 사용하는 것은 항상 가능한 옵션이 아닌 해결 방법입니다. 이것이 적절한 해결책이라고 생각합니다. :)
JakeP

3
런타임에 배경을 설정하고 있습니다. 런타임에 비트 맵을 만드는 솔루션이 있습니까?
Vivek Kumar Srivastava

1
저에게는 이것이 최선의 해결책 이었지만 "중력"속성을 제거하여 기본값 "채우기"와 일치시킵니다. 이렇게하면 화면에 맞게 이미지 크기를 조정할 수 있습니다. 자세한 정보는 @Santosh 링크를 참조하십시오. 감사!
Hugo

12
이 접근 방식에는 한 가지 문제 만 있습니다. 드로어 블 소스가 이미 컨테이너보다 큰 경우 컨테이너에 맞게 이미지 크기를 조정하고 가로 세로 비율을 유지하는 대신 이미지를 클리핑합니다 (중력 기준).
Shashwat Black 2014

1
지금 약간 날짜가 나타납니다. 이것은 비트 맵에서만 작동하며 벡터 드로어 블에서는 작동하지 않습니다.
The_Sympathizer 19

25

ImageButton대신 사용 Button하면 문제가 해결됩니다.

<ImageButton android:layout_width="30dp"
             android:layout_height="30dp"
             android:src="@drawable/bgimage" />

그리고 당신은 설정할 수 있습니다

android:background="@null"

원하는 경우 버튼 배경을 제거합니다.

빠른 수정 !! :-)


1
그런 다음 나를 위해 일한 setImageResource () 메서드로 이미지를 설정하십시오.
arlomedia jul.

내가 버튼 모두 이미지와 배경 색상을 원 ...이 마법처럼 일
Abhishek 차우에게

더 정확하게 작동합니다 (예 : "layout_centerVertical").
Maxim Firsoff

11

일반 레이아웃과 오버레이되는 RelativeLayout에서 ImageView를 사용하고 있습니다. 코드가 필요하지 않습니다. 화면의 전체 높이 (또는 사용하는 다른 레이아웃)에 맞게 이미지 크기를 조정 한 다음 너비에 맞게 그림을 왼쪽과 오른쪽으로 자릅니다. 제 경우에는 사용자가 화면을 돌리면 화면이 너무 작아 질 수 있습니다. 따라서 너무 작 으면 이미지 너비가 늘어나도록하는 match_parent를 사용합니다.

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

    <ImageView
        android:id="@+id/main_backgroundImage"
        android:layout_width="match_parent"
        //comment: Stretches picture in the width if too small. Use "wrap_content" does not stretch, but leaves space

        android:layout_height="match_parent"
        //in my case I always want the height filled

        android:layout_alignParentTop="true"
        android:scaleType="centerCrop"
        //will crop picture left and right, so it fits in height and keeps aspect ratio

        android:contentDescription="@string/image"
        android:src="@drawable/your_image" />

    <LinearLayout
        android:id="@+id/main_root"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical" >
    </LinearLayout>

</RelativeLayout>

존재해서는 안 문제에 대한이 실제로 훨씬 쉽게 솔루션
아 코스 Nikházy

6

저도 같은 문제가있었습니다. 원본 사진 대신 9 패치 이미지 (.9.png) 만 사용해야합니다.

서지


5

Android Studio의 SDK 도구에 포함 된 draw9patch ...를 사용하십시오 . 이미지의 확장 가능한 영역을 정의 할 수 있습니다. 중요한 부분은 제한되어 있으며 이미지가 모두 뒤 틀리지는 않습니다. dra9patch에 대한 좋은 데모가 여기 있습니다.

draw9patch를 사용하여 기존 splash.png를 new_splash.9.png로 변경하고 new_splash.9.png를 drawable-hdpi 프로젝트 폴더로 드래그하여 AndroidManifest 및 styles.xml이 아래와 같이 적절한 지 확인하십시오.

AndroidManifest.xml :

<application
...
        android:theme="@style/splashScreenStyle"
>

styles.xml :

<style name="splashScreenStyle" parent="Theme.AppCompat.Light.DarkActionBar">
    <item name="android:windowBackground">@drawable/new_splash</item>
</style>

3

크기가 크지는 않지만 이상한 크기의 배경 이미지가 있었기 때문에 늘어나고 성능이 떨어졌습니다. Context, View 및 장치 화면 크기와 일치하는 드로어 블 ID (int) 매개 변수를 사용하여 메서드를 만들었습니다. 예를 들어 Fragments onCreateView에서 이것을 사용하여 배경을 설정하십시오.

public void setBackground(Context context, View view, int drawableId){
    Bitmap bitmap = BitmapFactory.decodeResource(context.getResources(),drawableId);

    bitmap = Bitmap.createScaledBitmap(bitmap, Resources.getSystem().
             getDisplayMetrics().widthPixels,
             Resources.getSystem().getDisplayMetrics().heightPixels,
             true);

    BitmapDrawable bitmapDrawable = new BitmapDrawable(context.getResources(), 
                                    bitmap);

    view.setBackground(bitmapDrawable);
}

1

다음은 별도의 XML 구성없이 프로그래밍 방식으로 생성 된 버튼에 대한 Santosh의 답변 버전입니다.

Button button = new Button(getContext());
Bitmap backgroundBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.my_button);
BitmapDrawable backgroundDrawable = new BitmapDrawable(getResources(), backgroundBitmap);
backgroundDrawable.setGravity(Gravity.CENTER); // also LEFT, CENTER_VERTICAL, etc.
backgroundDrawable.setColorFilter(new PorterDuffColorFilter(Color.RED, PorterDuff.Mode.SRC_ATOP));
button.setBackground(backgroundDrawable);

ColorFilter 라인은 일반 배경 이미지가있는 버튼과 약간 다르게 작동하므로 포함했습니다.


1

당신은을 사용할 수 있습니다 FrameLayoutImageView첫 번째 자식, 두 번째 아이로 다음 일반 레이아웃과 같은 :

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

  <ImageView
        android:id="@+id/background_image_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:scaleType="centerCrop"
        android:src="@drawable/your_drawable"/>

  <LinearLayout
        android:id="@+id/your_actual_layout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical">

  </LinearLayout>

</FrameLayout>

0

핵심은 드로어 블을 배경이 아닌 버튼의 이미지로 설정하는 것입니다. 이렇게 :

rb.setButtonDrawable(R.drawable.whatever_drawable);

이것은 CompoundButton의 메서드이지만 Button의 메서드는 아닙니다.
arlomedia 2014-07-29

0

XML에서 일반 ImageView를 사용하여 클릭 가능하게 만들 수 있습니까 (android : clickable = "true")? 둥근 모서리와 같은 단추 모양의 이미지 만 src로 사용하면됩니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.