Как вывести вид на передний план, не вызывая метода takeToFront ()? - PullRequest
6 голосов
/ 08 декабря 2010

Существует, по-видимому, ошибка в Android, которая ломает View.bringToFront.

Если у меня есть Виды, расположенные в GridView, и я хочу вывести Вид на передний план, вызвав метод takeToFront (), он может переместиться в нижнее правое положение в GridView.

Там происходит что-то неясное, поэтому я не могу использовать метод takeToFront (). Когда я этого не называю, все работает отлично. Но виды перекрываются - если я использую масштабную анимацию для увеличения вида, это частично скрывается видами снизу и справа.

Я проверил исходный код метода takeToFront, и он вызывает parent.bringChildToFront (...)

именно этот метод

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

очевидно, удаляет вид из себя! Без пощады! Является ли ViewGroup настолько глупой, что она не может управлять Z-индексами каким-либо иным способом, который перемешивает элементы управления? Очевидно, что когда GridView удаляет своего дочернего элемента, а затем добавляет его снова, он помещается в конец таблицы!

Могу ли я что-нибудь сделать, чтобы показать View поверх других, не прибегая к каким-либо взломам? Одна вещь, которая приходит мне в голову, - это создать другой вид поверх GridView, который будет казаться выше того, который я пытаюсь привести ToFront (), но мне не нравится это решение.

Ответы [ 5 ]

3 голосов
/ 16 декабря 2010

очевидно, я пропустил свойство android:clipChildren="false" в GridView. Это решает мою проблему.

1 голос
/ 13 октября 2015

Из API 21 вы можете позвонить:

view.setZ(float)
1 голос
/ 03 августа 2015

Вызов метода takeToFront () изменяет порядок в GridView. Попробуйте создать ImageView с изображением вида, который вы хотите анимировать и анимировать.

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);

Добавьте слушателя анимации к вашей анимации и удалите ImageView в конце анимации.

1 голос
/ 09 декабря 2010

Вы пытались сделать фокусировку View и просто вызвать requestFocus ()?

0 голосов
/ 06 марта 2017

Если вы настроите API выше 21, вы можете просто добавить атрибут android:translationZ="xxx dp" в свой XML.

Обратите внимание, что если вы добавите высоту в представлениях, таких как просмотр карты, вы перейдете к оси Z. И если вы хотите, чтобы вид выходил на передний план с помощью этого способа, вам просто нужно сделать его выше, чем установленная вами высота.

Пример: для повышения высоты карты на 6 дп при просмотре атрибута потребуется 7 дп для трансляции атрибута Z нужного вам вида.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...