2013-04-24 16 views
21

Voglio impostare i margini in base alla percentuale. Dispongo di 4 immagini in una finestra di dialogo lineare e voglio impostare i margini sinistro, destro, superiore, inferiore che mantengono la stessa percentuale per ogni dimensione dello schermo.margini di layout Android con percentuale

è possibile?

ecco un demo quello che voglio .. enter image description here

E qui è quello che ho provato e non funziona

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

    <LinearLayout 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:layout_weight="1" 
     android:weightSum="10" > 

     <Thumbnail 
      android:id="@+id/thumb1" 
      android:layout_width="0dp" 
      android:layout_height="match_parent" 
      android:layout_weight="4" /> 

     <Thumbnail 
      android:id="@+id/thumb2" 
      android:layout_width="0dp" 
      android:layout_height="match_parent" 
      android:layout_weight="4" /> 

    </LinearLayout> 

    <LinearLayout 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:layout_weight="1" 
     android:weightSum="10" > 

     <Thumbnail 
      android:id="@+id/thumb3" 
      android:layout_width="0dp" 
      android:layout_height="match_parent" 
      android:layout_weight="4" > 
     </Thumbnail> 

     <Thumbnail 
      android:id="@+id/thumb4" 
      android:layout_width="0dp" 
      android:layout_height="match_parent" 
      android:layout_weight="4" /> 

    </LinearLayout> 

</LinearLayout> 

Grazie per il vostro aiuto

risposta

22

Si può avere invisibile View s nei tuoi LinearLayout s come distanziali e utilizzare il meccanismo layout_weight per assegnare loro la dimensione relativa.

Esempio:

<LinearLayout 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:layout_weight="1"> 

    <Thumbnail 
     android:id="@+id/thumb1" 
     android:layout_width="0dp" 
     android:layout_height="match_parent" 
     android:layout_weight="4" /> 

    <View 
     android:layout_width="0dp" 
     android:layout_height="0dp" 
     android:layout_weight="2" 
     android:visibility="invisible"/> 

    <Thumbnail 
     android:id="@+id/thumb2" 
     android:layout_width="0dp" 
     android:layout_height="match_parent" 
     android:layout_weight="4" /> 

</LinearLayout> 
+1

logica se non c'è altro modo :) ma non sicuro che con l'utilizzo di memoria, perché ho bisogno di così tanto vista invisibili – dracula

+2

C'è una 'vista' per questo. Non penso che ci sarà alcuna penalità di prestazioni/memoria per l'uso invisibile di 'View', ma, in realtà, non è sicuro -' View.java' è enorme, lo ha scremato per pochi minuti. –

+1

@AlexanderMalakhov 'Spazio' è stato aggiunto al livello API 14, quindi non è così utile. La sua denominazione rende lo scopo più evidente però. – laalto

0

Guardando l'immagine qui è quello che si potrebbe fare, utilizzare un layout relativa e mettere il layout lineare, al suo interno. è anche possibile utilizzare il peso per rendere le viste dell'immagine idonee.

<RelativeLayout 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:layout_marginLeft="5dp" 
    android:layout_marginLeft="5dp" > 

    <LinearLayout 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentLeft="true" 
     android:orientation="vertical" > 

     <ImageView 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" /> 

     <ImageView 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" /> 
    </LinearLayout> 

    <LinearLayout 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentRight="true" 
     android:orientation="vertical" > 

     <ImageView 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" /> 

     <ImageView 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" /> 
    </LinearLayout> 

</RelativeLayout> 
+0

dare un margine esatto non è un buon modo per più schermi. è per questo che sto cercando una soluzione di percentege – dracula

+0

L'impostazione di un margine sinistro e uno destro per il tuo layout relativo imposterà gli stessi margini su tutti gli schermi poiché questi valori sono in dp. – deepdroid

+0

ma i valori dp hanno effetti diversi per ciascuna densità. – dracula

19

Aggiunto il 1 Agosto 2017:

I due layout di questa risposta sono ormai deprecato, ma v'è una descrizione a condizione che vi su come ottenere la stessa funzionalità con ConstraintLayout. Grazie a dpg per averlo indicato.

Se si prevede di utilizzare le percentuali con le risorse, this answer potrebbe essere utile.


Vecchia risposta:

Ora c'è un modo migliore che è venuto fuori con la libreria di supporto versione 23.0.0 (giunto il momento, giusto?). È ora possibile utilizzare PercentFrameLayout o PercentRelativeLayout. Entrambi hanno i seguenti attributi:

  • layout_widthPercent
  • layout_heightPercent
  • layout_marginPercent
  • layout_marginLeftPercent
  • layout_marginTopPercent
  • layout_marginRightPercent
  • layout_marginBottomPercent
  • layout_marginStartPe rcent
  • layout_marginEndPercent

Si può anche dare un'occhiata a PercentLayoutHelper.PercentLayoutParams

+0

È solo per Android 6? –

+1

I layout percentuali si trovano nella libreria di supporto percentuale, il che significa che non sono solo per Android 6. – neits

+1

Il nuovo modo migliore è diventato deprecato ora. Per entrambi i layout sui collegamenti: 'Questa classe è stata dichiarata obsoleta al livello API 26.0.0-beta1. considera invece l'uso di ConstraintLayout e dei layout associati. – dpg

0

È possibile impostare i margini con percentuale utilizzando ConstraintLayout's Guidelines.

dire che si desidera definire seguenti valori percentuali per il layout:

Requested percentage values

Quindi è sufficiente aggiungere seguenti linee guida per il layout:

Layout Editor

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

    <ImageView 
     android:id="@+id/imageView1" 
     android:layout_width="0dp" 
     android:layout_height="0dp" 
     android:scaleType="centerCrop" 
     app:srcCompat="@drawable/ic_launcher_background" 
     app:layout_constraintTop_toTopOf="@+id/horGuideline1" 
     app:layout_constraintStart_toStartOf="@+id/verGuideline1" 
     app:layout_constraintEnd_toStartOf="@+id/verGuideline2" 
     app:layout_constraintBottom_toTopOf="@+id/horGuideline2" /> 

    <ImageView 
     android:id="@+id/imageView2" 
     android:layout_width="0dp" 
     android:layout_height="0dp" 
     android:scaleType="centerCrop" 
     app:srcCompat="@drawable/ic_launcher_background" 
     app:layout_constraintTop_toTopOf="@+id/horGuideline1" 
     app:layout_constraintStart_toStartOf="@+id/verGuideline3" 
     app:layout_constraintEnd_toStartOf="@+id/verGuideline4" 
     app:layout_constraintBottom_toTopOf="@+id/horGuideline2" /> 

    <ImageView 
     android:id="@+id/imageView3" 
     android:layout_width="0dp" 
     android:layout_height="0dp" 
     android:scaleType="centerCrop" 
     app:srcCompat="@drawable/ic_launcher_background" 
     app:layout_constraintTop_toTopOf="@+id/horGuideline3" 
     app:layout_constraintStart_toStartOf="@+id/verGuideline1" 
     app:layout_constraintEnd_toStartOf="@+id/verGuideline2" 
     app:layout_constraintBottom_toTopOf="@+id/horGuideline4" /> 

    <ImageView 
     android:id="@+id/imageView4" 
     android:layout_width="0dp" 
     android:layout_height="0dp" 
     android:scaleType="centerCrop" 
     app:srcCompat="@drawable/ic_launcher_background" 
     app:layout_constraintTop_toTopOf="@+id/horGuideline3" 
     app:layout_constraintStart_toStartOf="@+id/verGuideline3" 
     app:layout_constraintEnd_toStartOf="@+id/verGuideline4" 
     app:layout_constraintBottom_toTopOf="@+id/horGuideline4" /> 

    <android.support.constraint.Guideline 
     android:id="@+id/verGuideline1" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:orientation="vertical" 
     app:layout_constraintGuide_percent="0.05" /> 

    <android.support.constraint.Guideline 
     android:id="@+id/verGuideline2" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:orientation="vertical" 
     app:layout_constraintGuide_percent="0.35" /> 

    <android.support.constraint.Guideline 
     android:id="@+id/verGuideline3" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:orientation="vertical" 
     app:layout_constraintGuide_percent="0.65" /> 

    <android.support.constraint.Guideline 
     android:id="@+id/verGuideline4" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:orientation="vertical" 
     app:layout_constraintGuide_percent="0.95" /> 

    <android.support.constraint.Guideline 
     android:id="@+id/horGuideline1" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:orientation="horizontal" 
     app:layout_constraintGuide_percent="0.12" /> 

    <android.support.constraint.Guideline 
     android:id="@+id/horGuideline2" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:orientation="horizontal" 
     app:layout_constraintGuide_percent="0.47" /> 

    <android.support.constraint.Guideline 
     android:id="@+id/horGuideline3" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:orientation="horizontal" 
     app:layout_constraintGuide_percent="0.53" /> 

    <android.support.constraint.Guideline 
     android:id="@+id/horGuideline4" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:orientation="horizontal" 
     app:layout_constraintGuide_percent="0.88" /> 

</android.support.constraint.ConstraintLayout> 

Come risultato il tuo layout è simile a questo:

Result view

Problemi correlati