Pull to refresh

Comments 33

Классный подход для каких-нибудь читалок. Хотя, если читалка, то всё-таки лучше было бы реализовать полноценный page turn effect, тогда и ViewFlipper особо не нужен, потому что всю логику можно поместить в {currentView, prevView, nextView}, анимировать между ними, кэшируя более «далекие» элементы с неким, экономя память на хранении в контейнере.
Извиняюсь. «с неким оффсетом».
Когда уже сделают редактирование комментариев?
А никогда, что бы сразу думали что пишут и не исправляли где не надо!
Комментарий не воробей :)
вскольз посмотрел статью…
если правильно понял, что получиться в этиге, то это слайдинг для бедных какой-то.
под нормальным слайдинго я подразумеваю такое как в TweetDeck, GO Sms pro, лаучнерах между экранами.
простите за опечатки, клавиатура неудобно лежала, а проверить текст перед отправлением забыл.
Здесь описан подход к тому как это можно начинать делать. Никто не мешает накрутить, то, что вам нужно, а это уже зависит от задач приложения.
В моем случае и подход отличался.

Просто когда понадобилось сделать слайдинг, везде описан вариант похожий на ваш, а как сделать такое как в TweetDeck — так и не нашел, сначала изобретал велосипед, потом посмотрел в исходниках анродида как они сделали в своем ланчере.
И как они сделали? Расскажите вкратце.
Простите, увидел ниже
По-моему, когда слайдинг начинается после отпускания, то создается впечатление, что телефон глючит. Горизонтальный слайдинг должен быть таким же, как и вертикальный, т.е. контент должен прокручиваться непосредственно под пальцем, то бишь в реальном времени.

В качестве примера такого слайдинга могу привести Pulse News и YouTube.
Это не сложно добавить, нужно заменить событие ACTION_UP на ACTION_MOVE (т.е. на перемещение, а не отпускание) и немного модифицировать код обработки, чтобы он срабатывал не сразу после начала перемещения, а после какого-то промежутка.
а можно
— воспользоваться ViewGroup и стандартным скроллером (методом scrollTo);
— правильно обрабатывать отпускание (доскролить до конца в какую-то из сторон);
— на onLayout, упорядочить все сабвью и делать их тогоже размера, что и наш ViewGroup;
— важно еще правильно редиректить события, что бы нажатия на дочерних элементах работали.

файл из исхдников гуглового ланчера в котором подобным образом реализован слайдинг между рабочими столами:
grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android-apps/2.1_r2/com/android/launcher2/Workspace.java
Спасибо за ссылку.
Добавил в пост ссылку на готовую реализацию ViewGroup + scrollTo, без ViewFlipper.
о. здорово.

когда сам пытался это сделать, ничего путнего в интернетах не нашел, в итоге сделал велосипед через FrameView и когда пользователь начинал перетаскивание, показывал следующее View и сдвигал его анимацией… потом нашел гугло-реализацию, переделал абсолютно все.
теперь код примерно такой-же как и по приведенной вами ссылке.

уверен, что это сэкономит кому-то время.
Есть табы и заходя в один из табов необходимо переходить между экранами туда-сюда, при это сами табы должны оставаться на своих местах? При этом не хочется смешивать логику и представления в одном вью( а как иначе если использовать ViewFlipper?). Так вот, ViewFlipper поможет все таки? На сколько я понимаю, он листает только наследники View, а у меня есть Activity, логика в них и лэйауты отдельные для каждого экрана.
Что можете посоветовать?
Использование ActivityGroup приводит к StackOverFlow, точнее вложенность вьюшек(хотя их вложенность явно меньше 10)
А вы не пробовали ненужные активити завершать? Делать им finish()? Или они все вам вместе нужны?
А как вы вернетесь потом? finish() ведь убивает его из стека и видимо startActivity() не помагает, у меня не работало.
Использовал вот этот примерчик:
www.gamma-point.com/content/android-how-have-multiple-activities-under-single-tab-tabactivity
Он то и делает StackOverflow.
Вообщем, пробовал конечно. Не помогло.
Спасибо за статью. Периодически возвращался к мысли что надо как-то сделать эту хренотеть — в жизни пригодится — но лень брала свое. Лень была права!
На самом деле очень простое но не очень удачное решение, для именно такого эффекта лучше использовать подход аналогичный рабочим столам, потому что пользователю постоянно работает с ними и привык получать отзыв в виде сдвига view до того как он отпускает палец.
Я написал чуть выше, не сложно изменить логику на слайдинг без отпускания пальца.
С viewFlipperom так не получится.
Тогда я видимо вас неправильно понял, вы имели в виду слайдинг между экранами без отпускания пальца или что-то другое?
Я имел ввиду эффект смены рабочих столов, к которому так привыкли пользователи. Когда изображение смещается пропорционально изменению координат в ACTION_MOVE(на каждом событии), а окончательный переход на рабочий стол происходит после ACTION_UP в зависимости от того было ли итоговое смещение положительным или отрицательным. К сожалению описанным выше способом не получится этого сделать.
Соглашусь, если нужно видеть содержимое следующего экрана до окончательного перемещения на него, то ViewFlipper не подойдет.
А как это реализуется?
Вот здесь можете взять готовый пример на базе ViewGroup и scrollTo.
Я вот не могу понять, а почему бы вместо обработки вручную не использовать GetureDetector.onFling?

Еще описанную функциональность можно получить просто настроив Gallery (только нужно перенаправлять ей жесты).
public boolean onTouch(View v, MotionEvent event) {
ViewFlipper flipper = (ViewFlipper) findViewById(R.id.flipper);
// TODO Auto-generated method stub
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
float fromPosition = event.getX();
break;
case MotionEvent.ACTION_UP:

float toPosition = event.getX();
if (fromPosition > toPosition)
flipper.showNext();
else if (fromPosition < toPosition)
flipper.showPrevious();
default:
break;
}
return true;

ругаетсо на то что переменная fromPosition — необьявлена… где косяк?
Переменная должна быть объявлена вне метода иначе она будет перезаписана, т.е. должна быть объявлена внутри класса.
В статье есть линк на исходники, посмотрите, там все понятно.
сделал так

public class Main extends Activity implements OnTouchListener {
float fromPosition;
float toPosition;


скомпилился но не работает
А toPosition зачем вы вынесли? Вообщем возьмите проект по ссылке, попробуйте разобраться в нем (для этого и была статья), а потом попробуйте запустить его.
Причин почему может не работать может быть много, догадаться что именно произошло у вас по трем строчкам невозможно.
Sign up to leave a comment.

Articles