J'ai de l'activité et beaucoup de widgets dessus, certains ont des animations et à cause des animations, certains des widgets se déplacent (traduisent) les uns sur les autres. Par exemple, la vue texte se déplace sur certains boutons. . .
Maintenant, je veux que les boutons soient toujours sur le devant. Et lorsque la visualisation de texte est en mouvement, je veux passer derrière les boutons.
Je ne peux pas y arriver. J'ai tout essayé et "bringToFront ()" ne fonctionne vraiment pas.
note Je ne veux pas contrôler l'ordre des z par l'ordre de placement de l'élément à la présentation car je ne peux tout simplement pas :), la présentation est complexe et je ne peux pas placer tous les boutons au début de la présentation
Vous pouvez appeler bringToFront () sur la vue que vous souhaitez placer au premier plan.
Ceci est un exemple:
yourView.bringToFront();
Je cherchais une bonne réponse dans le dépassement de capacité de la pile et quand je ne pouvais pas en trouver une, je parcourais la documentation.
personne ne semble être tombé sur cette réponse simple pour l'instant:
ViewCompat.setTranslationZ(view, translationZ);
traduction par défaut z est 0.0
bringToFront()
est le bon moyen, mais, REMARQUE: vous devez appeler les méthodes bringToFront()
et invalidate()
sur la vue de niveau supérieur (sous votre vue racine), par exemple:
La hiérarchie de votre vue est la suivante:
-RelativeLayout
|--LinearLayout1
|------Button1
|------Button2
|------Button3
|--ImageView
|--LinearLayout2
|------Button4
|------Button5
|------Button6
Ainsi, lorsque vous animerez vos boutons (1-> 6), ceux-ci apparaîtront sous (en dessous) de la ImageView
. Pour la placer au dessus de la ImageView
, vous devez appeler les méthodes bringToFront()
et invalidate()
sur votre LinearLayout
s. Cela fonctionnera ensuite:) ** REMARQUE: n'oubliez pas de définir Android:clipChildren="false"
pour votre présentation racine ou gradparent_layout de animate-view. Jetons un coup d'oeil à mon vrai code:
.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:hw="http://schemas.Android.com/apk/res-auto"
Android:id="@+id/layout_parent"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:background="@color/common_theme_color"
Android:orientation="vertical" >
<com.binh.helloworld.customviews.HWActionBar
Android:id="@+id/action_bar"
Android:layout_width="match_parent"
Android:layout_height="@dimen/dimen_actionbar_height"
Android:layout_alignParentTop="true"
hw:titleText="@string/app_name" >
</com.binh.helloworld.customviews.HWActionBar>
<RelativeLayout
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:layout_below="@id/action_bar"
Android:clipChildren="false" >
<LinearLayout
Android:id="@+id/layout_top"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:layout_alignParentTop="true"
Android:gravity="center_horizontal"
Android:orientation="horizontal" >
</LinearLayout>
<ImageView
Android:id="@+id/imgv_main"
Android:layout_width="@dimen/common_imgv_height"
Android:layout_height="@dimen/common_imgv_height"
Android:layout_centerInParent="true"
Android:contentDescription="@string/app_name"
Android:src="@drawable/ic_launcher" />
<LinearLayout
Android:id="@+id/layout_bottom"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:layout_alignParentBottom="true"
Android:gravity="center_horizontal"
Android:orientation="horizontal" >
</LinearLayout>
</RelativeLayout>
</RelativeLayout>
Certains codes en .Java
private LinearLayout layoutTop, layoutBottom;
...
layoutTop = (LinearLayout) rootView.findViewById(R.id.layout_top);
layoutBottom = (LinearLayout) rootView.findViewById(R.id.layout_bottom);
...
//when animate back
//dragedView is my layoutTop's child view (i added programmatically) (like buttons in above example)
dragedView.setVisibility(View.GONE);
layoutTop.bringToFront();
layoutTop.invalidate();
dragedView.startAnimation(animation); // TranslateAnimation
dragedView.setVisibility(View.VISIBLE);
GLuck!
Essayez FrameLayout
, cela vous donne la possibilité de placer les vues les unes sur les autres. Vous pouvez créer deux LinearLayouts
: une avec les vues d'arrière-plan et l'autre avec des vues de premier plan et les combiner à l'aide de FrameLayout
. J'espère que cela t'aides.
Une solution encore plus simple consiste à éditer le XML de l'activité. Utilisation
Android:translationZ=""
Avec ce code en xml
Android:translationZ="90dp"
Vous pouvez essayer d'utiliser la bringChildToFront
et vérifier si cette documentation est utile dans la page Développeurs Android .
j'ai fait face au même problème ... La solution suivante a fonctionné pour moi.
FrameLayout glFrame=(FrameLayout) findViewById(R.id.animatedView);
glFrame.addView(yourView);
glFrame.bringToFront();
glFrame.invalidate();
Il peut y avoir un autre moyen qui sauve la journée. Il suffit d'initier un nouveau dialogue avec la mise en page souhaitée et de l'afficher. J'en ai besoin pour montrer un loadingView sur un DialogFragment et c'était le seul moyen de réussir.
Dialog topDialog = new Dialog(this, Android.R.style.Theme_Translucent_NoTitleBar);
topDialog.setContentView(R.layout.dialog_top);
topDialog.show();
bringToFront () peut ne pas fonctionner dans certains cas, comme le mien. Mais le contenu de la disposition dialog_top doit remplacer tout ce qui se trouve sur la couche ui. Mais de toute façon, c'est une solution de contournement moche.
Vous devez utiliser framelayout. Et la meilleure façon de le faire est de rendre la vue invisible lorsque cela n’est pas nécessaire. Aussi, vous devez définir la position pour chaque vue, afin qu'ils se déplacent en fonction de la position correspondante
Si vous utilisez une LinearLayout
, vous devez appeler myView.bringToFront()
, puis parentView.requestLayout()
et parentView.invalidate()
pour obliger le parent à redessiner avec la nouvelle commande enfant.
Si vous utilisez ConstraintLayout
, placez simplement l'élément après les autres pour le rendre plus visible