Android обрезает невидимые части просмотров внутри RelativeLayout - PullRequest
1 голос
/ 06 февраля 2012

У меня есть RelativeLayout, который включает в себя другие макеты (представления), расположенные по полям.У меня также есть GestureDetector, который обнаруживает прокрутку и вызывает scrollBy () для RelativeLayout:

 public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,
        float distanceY) {
    int dx = (int) distanceX;
    int dy = (int) distanceY;
    sdx+= dx; sdy+= dy;
    container.scrollBy(dx, dy);
    return false;
 }

При прокрутке возникает проблема:

enter image description here

Если дочерний вид расположен частично за пределами экрана, я обрезаю его, проводя вправо или вниз.Но если какой-то вид полностью невидим в первый раз, он хорошо выглядит при показе.В чем проблема?Может быть, мне нужно добавить какой-нибудь атрибут в контейнер (пробовал android: clipChildren, android: clipToPadding, android: isScrollContainer)?Помогите мне, пожалуйста!

Спасибо

Ответы [ 2 ]

2 голосов
/ 06 февраля 2012

По умолчанию отсутствует механизм, который сообщает дочерним представлениям родителя, что им нужно перерисовать себя при событии прокрутки.Прокручиваемые виджеты в SDK обрабатывают это различными способами.Самым простым вариантом, вероятно, будет создание подкласса вашего RelativeLayout контейнера, чтобы вы могли переопределить onScrollChanged() и использовать этот обратный вызов для вызова invalidate().Это сообщит контейнеру (а затем и его дочерним элементам), что ему необходимо перерисовать после прокрутки.

Возможно, вам удастся избежать вызова container.invalidate() непосредственно после вызова container.scrollBy() в обратном вызове жеста.Я не уверен, что это звонит invalidate() слишком рано;хотя этот метод также развалится, если вы попытаетесь выполнить плавную прокрутку.

HTH

0 голосов
/ 21 марта 2013

В моем случае у меня был RelativeLayout на верхнем уровне (управление подкачкой пользовательского класса PageView). Ширина и высота родительского класса установлена ​​на MATCH_PARENT

PageView также был RelativeLayout и управлял своим собственным размером и позицией прокрутки на основе событий движения, захваченных его собственными классами ScaleGestureDetector и GestureDetector. В него также добавлено большое количество динамических видов (EditText, RadioGroup, флажок, SurfaceView для рисования и т. Д.)

Я обнаружил, что когда дочерние представления изменили свой размер / местоположение в ответ на изменение в PageView, любой дочерний вид, который существовал полностью внутри или вне области отображения экрана, имел правильные размеры. Другие, которые пересекали область, определенную экраном, имели правильное положение, но размер (ширина и высота) были обрезаны до границы окна. Это было независимо от того, установлено какое-либо из свойств RelativeLayout или, по крайней мере, так мне показалось.

Решение в моем случае состояло в том, чтобы изменить самый внешний контейнер с RelativeLayout на FrameLayout и фиксированный бум. Следовательно, FrameLayout (для подкачки), содержащий один изменяемый размер RelativeLayout (для страницы), содержащий несколько динамических компонентов для элементов формы.

...