Pouvons-nous placer une petite vue sur une autre grande vue? Par exemple, j'ai une VideoView qui lit un fichier en arrière-plan. Par-dessus, quelque part au milieu/coin, je veux placer une autre ImageView.
Mais dans la disposition linéaire/relative, les vues ne peuvent être placées que les unes après les autres ou les unes par rapport aux autres, et AbsoluteLayout est déconseillé. Alors qu'est-ce que je fais?
FrameLayouts
vous permet d'empiler chaque vue au-dessus de celle ci-dessous. Ceci peut également être réalisé avec un RelativeLayout
.
FrameLayout
est le plus simple ViewGroup
et empile le Views
dans l'ordre dans lequel il est défini dans la disposition XML (ou ajouté par programmation); le premier sera plus bas et le dernier sera au dessus.
Voici un exemple où deux Views
sont empilés et décalés pour mieux illustrer le point:
Voici le XML de présentation réel avec les deux cases TextView
qui se chevauchent. Le décalage des deux cases se fait à l'aide de Android:layout_gravity
tandis que Android:gravity
est utilisé pour centrer le texte lui-même dans chaque case.
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_width="100dp"
Android:layout_height="100dp">
<TextView
Android:layout_width="60dp"
Android:layout_height="60dp"
Android:layout_gravity="top|left"
Android:background="@Android:color/holo_blue_light"
Android:gravity="center"
Android:text="First is below"/>
<TextView
Android:layout_width="60dp"
Android:layout_height="60dp"
Android:layout_gravity="bottom|right"
Android:background="@Android:color/holo_green_light"
Android:gravity="center"
Android:text=" Last is on top"/>
</FrameLayout>
Juste au cas où si vous souhaitez placer une vue au-dessus d'une ButtonView, utilisez-la; Android:elevation="7dp"
pour la vue qui doit être placée en haut du bouton.
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:padding="@dimen/dp_20"
Android:background="@color/yellow"
>
<VideoView
Android:id="@+id/videoview"
Android:layout_width="wrap_content"
Android:layout_centerInParent="true"
Android:layout_height="300dp"
Android:contentDescription="@string/app_name"
/>
<ImageView
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:src="@drawable/camera"
Android:layout_margin="30dp"
Android:layout_alignParentEnd="true"
Android:layout_centerVertical="true"
Android:id="@+id/imageView" />
</RelativeLayout>
Vous pouvez également le faire en utilisant ConstraintLayout une nouvelle mise en page introduite par google.
ConstraintLayout vous permet de créer des présentations volumineuses et complexes avec une hiérarchie de vues plates (pas de groupes de vues imbriquées).
<?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"
xmlns:tools="http://schemas.Android.com/tools"
Android:id="@+id/container"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:orientation="vertical"
Android:layout_weight="4"
tools:context="com.edalat.example.MainActivity">
<VideoView
Android:id="@+id/videoView"
Android:layout_width="283dp"
Android:layout_height="349dp"
app:layout_constraintBottom_toBottomOf="parent"
Android:layout_marginBottom="24dp"
app:layout_constraintTop_toTopOf="parent"
Android:layout_marginTop="24dp"
Android:layout_marginRight="24dp"
app:layout_constraintRight_toRightOf="parent"
Android:layout_marginLeft="24dp"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintHorizontal_bias="0.509"/>
<ImageView
Android:id="@+id/imageView"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
app:srcCompat="@mipmap/ic_launcher"
app:layout_constraintTop_toTopOf="parent"
Android:layout_marginTop="24dp"
app:layout_constraintBottom_toBottomOf="parent"
Android:layout_marginBottom="24dp"
Android:layout_marginLeft="24dp"
app:layout_constraintLeft_toLeftOf="parent"
Android:layout_marginRight="24dp"
app:layout_constraintRight_toRightOf="parent"/>
</Android.support.constraint.ConstraintLayout>