6 Stimmen

Wie kann man eine Ansicht in den Vordergrund bringen, ohne bringToFront() aufzurufen?

Es gibt offenbar eine Fehler in Android, das die View.bringToFront .

Wenn ich Ansichten in einer GridView angeordnet habe und eine Ansicht durch den Aufruf von bringToFront() in den Vordergrund bringen möchte, wird sie möglicherweise an die untere rechte Position in der GridView verschoben.

Irgendetwas ist da faul, deshalb kann ich bringToFront() nicht verwenden. Wenn ich es nicht aufrufe, funktioniert alles gut. Aber die Ansichten überschneiden sich - wenn ich die Skalierungsanimation verwende, um eine Ansicht zu vergrößern, wird sie teilweise von den Ansichten unten und rechts verdeckt.

Ich habe den Quelltext von bringToFront überprüft und er ruft parent.bringChildToFront(...)

es ist diese Methode

public void bringChildToFront(View child) {
     int index = indexOfChild(child);
      if (index >= 0) {
          removeFromArray(index);
          addInArray(child, mChildrenCount);
          child.mParent = this;
      }
  }

es scheint Entfernt den Blick von sich selbst! Ohne Gnade! Ist eine ViewGroup so dumm, dass sie die Z-Indizes nicht anders verwalten kann als durch das Umherschieben von Steuerelementen? Wenn GridView sein Kind entfernt und dann wieder hinzufügt, wird es am Ende des Grids platziert!

Gibt es irgendetwas, das ich tun kann, um eine Ansicht über anderen anzuzeigen, ohne auf einige Hacks zurückzugreifen? Eine Sache, die mir in den Sinn kommt, ist, eine andere Ansicht über der GridView zu erstellen, die über der Ansicht zu sein scheint, die ich versuche, nach vorne zu bringen(), aber ich mag diese Lösung nicht.

3voto

Axarydax Punkte 16025

Anscheinend habe ich die android:clipChildren="false" Eigenschaft in GridView. Damit ist mein Problem gelöst.

1voto

CaseyB Punkte 24477

Haben Sie versucht, die View fokussierbar und rufen einfach requestFocus() auf?

1voto

Will Poitras Punkte 386

Der Aufruf von bringToFront() ändert die Reihenfolge im GridView. Versuchen Sie, eine ImageView mit einem Bild der Ansicht zu erstellen, die Sie animieren möchten, und animieren Sie diese stattdessen.

Bitmap bitmap = Bitmap.createBitmap(view.getWidth(), view.getHeight(), Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(bitmap);
view.draw(canvas);
final ImageView imageView = new ImageView(getActivity());
imageView.setImageBitmap(bitmap);
ViewGroup.LayoutParams params = new ViewGroup.LayoutParams(view.getWidth() , view.getHeight());
imageView.setLayoutParams(params);
rootview.addView(imageView);

Fügen Sie einen Animations-Listener zu Ihrer Animation hinzu und entfernen Sie die ImageView am Ende der Animation.

1voto

Vitaly Zinchenko Punkte 4667

Von API 21 aus können Sie aufrufen:

view.setZ(float)

0voto

JPhi Denis Punkte 347

Wenn Sie eine API über 21 anstreben, können Sie einfach das Attribut android:translationZ="xxx dp" zu Ihrem XML.

Bitte beachten Sie, dass Sie beim Hinzufügen von Erhebungen in Ansichten wie Cardview in die Z-Achse gehen. Wenn Sie eine Ansicht auf diese Weise in den Vordergrund bringen wollen, müssen Sie sie nur höher als die eingestellte Höhe machen.

Beispiel: Eine 6-dp-Erhöhung in der Kartenansicht erfordert einen 7-dp-Wert im Attribut translationZ der Ansicht, die im Vordergrund stehen soll.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X