2012-02-06 4 views
1

У меня есть RelativeLayout, который сопоставляет другие макеты (представления), расположенные по полям. У меня также есть GestureDetector, который детектирует прокрутки и делает вызовы scrollBy() для RelativeLayout:Android посещает невидимые части просмотров внутри 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

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

Благодаря

ответ

2

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

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

НТН

+0

Спасибо за ответ, я попытался вызвать container.invalidate() после scrollBy(), но он не вступил в силу, но до конца жестов все равно не может делать никаких обновлений. Представления для детей, которые размещены полностью вне видимой области, хороши, но виды, которые имеют видимую часть перед прокруткой, обрезаны (только рядом с правой и нижней границами) – kest

0

В моем случае я имел RelativeLayout на верхнем уровне (управление подкачкой пользовательского класса с просмотрами страниц,). Эта ширина и высота родительского класса устанавливаются в MATCH_PARENT

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

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

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

+0

Gah, все еще обрезая RadioGroup и флажок. Расследует далее ... –

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