Pełnoekranowy obraz tła w działaniu


145

Widzę wiele aplikacji, które używają pełnoekranowego obrazu jako tła. To jest przykład:

Obraz tła na pełnym ekranie

Chcę to wykorzystać w projekcie, najlepszym sposobem, jaki do tej pory znalazłem, jest użycie obrazu o dużym rozmiarze, umieszczenie go w a ImageViewi użycie android: adjustViewBounds="true"do dostosowania marginesów

Problem polega na tym, że jeśli ekran o bardzo wysokiej rozdzielczości, obraz jest za mały.

Inną opcją myślałem jest skorzystanie z obrazu w sposób FrameLayout, z match_parentw widthi heightjako tło ... to rozciąga obraz, ale myślę, że wynik nie jest bardzo dobra.

Jak byś to zrobił?


3
Nie wierz, że to działa na tle, ale powinno działać na obrazach. android:scaleType="centerCrop"
EGHDK,

Odpowiedzi:


223

Możesz to zrobić na kilka sposobów.

Opcja 1:

Twórz różne doskonałe obrazy dla różnych dpi i umieszczaj je w odpowiednim folderze do rysowania. Następnie ustaw

android:background="@drawable/your_image"

Opcja 2:

Dodaj jeden duży obraz. Użyj FrameLayout. Jako pierwsze dziecko dodaj plik ImageView. Ustaw następujące elementy w swoim ImageView.

android:src="@drawable/your_image"
android:scaleType = "centerCrop"

2
gdzie przechowujesz „your_image”?
Atharva Johri

5
W folderach res-> drawable. Może być ich wiele - każda podstawka ma inną rozdzielczość (np. Niska / wysoka rozdzielczość). Jeśli nie masz określonych obrazów dla każdej rozdzielczości, każdy będzie działać.
krodmannix

5
Odpowiedź jest dobra. Ale zastanawiam się, czy ktoś znalazł typowe rozmiary telefonów dla każdej grupy dpi, co przydałoby się przy przygotowywaniu zdjęć. Edytowano: znaleziono - stackoverflow.com/questions/10574363/…
lis

7
ostatnia opcja -> brak pamięci: D
ternes3

1
Błąd OOM, nadchodzimy ... jeśli jest to duży obraz, będziesz musiał skalować w górę lub w dół w zależności od rozmiaru ekranu! w takim przypadku najprawdopodobniej będziesz musiał załadować bitmapę za pomocą zadania asynchronicznego.
Jonny2Plates

25

Inną opcją jest dodanie pojedynczego obrazu (niekoniecznie dużego) do drawables (nazwijmy go backgroung.jpg), utworzenie ImageView iv_background w katalogu głównym twojego xml bez atrybutu „src”. Następnie w metodzie onCreate odpowiedniego działania:

    /* create a full screen window */
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
            WindowManager.LayoutParams.FLAG_FULLSCREEN);
    setContentView(R.layout.your_activity);

    /* adapt the image to the size of the display */
    Display display = getWindowManager().getDefaultDisplay();
    Point size = new Point();
    display.getSize(size);
    Bitmap bmp = Bitmap.createScaledBitmap(BitmapFactory.decodeResource(
      getResources(),R.drawable.background),size.x,size.y,true);

    /* fill the background ImageView with the resized image */
    ImageView iv_background = (ImageView) findViewById(R.id.iv_background);
    iv_background.setImageBitmap(bmp);

Bez przycinania, bez wielu obrazów o różnych rozmiarach. Mam nadzieję, że to pomoże!


3
Jest to przydatne rozwiązanie, ale pamiętaj, aby przetwarzać mapy bitowe poza głównym wątkiem: developer.android.com/training/displaying-bitmaps/ ...
Kyle Ivey

19

Powinieneś umieścić obrazy o różnych rozmiarach w następującym folderze

Aby uzyskać więcej informacji, odwiedź ten link

  • ldpi

  • mdpi

  • hdpi

  • xhdpi

  • xxhdpi

i użyj tła RelativeLayout lub LinearLayout zamiast używania ImageView jako poniższego przykładu

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
 xmlns:android="http://schemas.android.com/apk/res/android"
 android:layout_width="fill_parent"
 android:layout_height="fill_parent"
 android:orientation="vertical"
 android:background="@drawable/your_image">

</RelativeLayout>

Otrzymuję błąd, któryUnexpected namespace prefix "xmlns" found for tag RelativeLayout
CodyBugstein

To sprawia, że ​​mój Fragment jest tak opóźniony. Nie mogę zrozumieć, dlaczego.
Sermilion,

użyj pamięci podręcznej lub załaduj obraz za pomocą picassa ( square.github.io/picasso ) mam nadzieję, że rozwiąże twój problem
Munish Kapoor

7

Co powiesz na

android:background="@drawable/your_image"

na głównym planie Twojej działalności?

W ten sposób możesz mieć różne obrazy dla różnych gęstości ekranu, umieszczając je w odpowiednich res/drawable-**dpifolderach.


7

Minęło trochę czasu od opublikowania tego, ale to mi pomogło.

Możesz używać układów zagnieżdżonych. Zacznij od RelativeLayout i umieść w nim swój ImageView.

Ustaw wysokość i szerokość tak, aby match_parent wypełniły ekran.

Ustaw scaleType = "centreCrop", aby obraz był dopasowany do ekranu i nie rozciągał się.

Następnie możesz wprowadzić dowolne inne układy, tak jak zwykle, na przykład LinearLayout poniżej.

Możesz użyć android: alpha, aby ustawić przezroczystość obrazu.

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

  <ImageView
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:scaleType="centerCrop"
    android:src="@drawable/image"
    android:alpha="0.6"/>

  <LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity">

      <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello"/>

      <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="There"/>

   </LinearLayout>
</RelativeLayout>

7

Jeśli chcesz, aby obraz wyświetlał się ZA przezroczystym paskiem akcji, umieść następujące elementy w definicji stylu motywu:

<item name="android:windowActionBarOverlay">true</item>

Cieszyć się!


7

Użyj tego

android:background="@drawable/your_image"

w swojej działalności pierwszy układ liniowy lub względny.


1

Zgodnie z odpowiedzią NoToast, musisz mieć wiele wersji "your_image" w swoich res / drawable-ldpi, mdpi, hdpi, x-hdpi (dla xtra dużych ekranów), usunąć match_parent i zachować android: adjustViewBounds = " prawdziwe"


1

Dodaj android:background="@drawable/your_image"wewnątrz swojego Układu relatywnego / Układu liniowego.


0

Jeśli masz bg.png jako obraz tła, po prostu:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@drawable/bg"
    tools:context=".MainActivity" >

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_centerVertical="true"
        android:text="@string/hello_world"/>
</RelativeLayout>

-1

Pracujący. powinieneś wypróbować to:

android:src="@drawable/img"


-2

Najłatwiejszy sposób:

Krok 1: Otwórz plik AndroidManifest.xml

Możesz zobaczyć plik tutaj!

Krok 2: Zlokalizuj android:theme="@style/AppTheme" >

Krok 3: Zmień na android:theme="@style/Theme.AppCompat.NoActionBar" >

Krok 4: Następnie dodaj ImageView i obraz

Krok 4: To wszystko!

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.