2010-12-08 3 views
6

По-видимому, на Android есть bug, который разбивает View.bringToFront.Как перенести взгляд на передний план без вызова bringToFront()?

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

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

Я проверил источник BringToFront и он вызывает 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 удаляет свой дочерний элемент и затем добавляет его обратно, он помещается в конец сетки!

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

ответ

3

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

+0

Это не будет работать с Property Animation. – 2014-12-24 12:10:38

1

Вы пробовали сделать View фокусируемым и просто вызывающим запросомFocus()?

1

Вызов функции bringToFront() изменяет порядок в 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

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

view.setZ(float) 
0

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

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

Пример: 6-кратное увеличение в режиме просмотра карты потребует 7dp в атрибуте translationZ для представления, которое вы хотите переднего плана.

Смежные вопросы