Форум программистов, компьютерный форум, киберфорум
Наши страницы
Программирование Android
Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 32, средняя оценка - 4.91
Termit___
5 / 5 / 0
Регистрация: 02.04.2013
Сообщений: 86
#1

Swipe навигация в приложении - Программирование Android

04.07.2013, 16:06. Просмотров 5695. Ответов 19
Метки нет (Все метки)

Здравствуйте.
Возникла потребность в навигации между активити жестами(свайп). Ведешь пальцем влево и переходит в нужное активити.

http://www.cyberforum.ru/android-dev/thread1630352.html


Нагуглил я очень много всего, куча всяких разных методов, все очень громозкое и сложное.
Хочется просто в обработчик запихать интент с передачей данных и открытие нового класса(нового активити). С этим проблемм нет. Проблема в том что не знаю подходящего метода для свайпа. Может кто подскажет? Буду благодарен.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.07.2013, 16:06
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Swipe навигация в приложении (Программирование Android):

Swipe и RecycledView
Добрый день. Пытаюсь сделать swipe на элементах RecycledView. Layoutдля...

swipe в android 2.1
Подскажите как можно сделать переход по activity с помощью swipe для android...

Swipe переключение
Всем привет! Решил реализовать swipe-листание,но ничего не получается. все...

Как реализовать swipe меню
Подскажите как реализовать подобное меню.

Swipe к TextView или Button
Можно ли применить Swipe не конкретно для каждого активити, а к TextView, или,...

19
spydark91
86 / 86 / 13
Регистрация: 03.03.2011
Сообщений: 1,873
04.07.2013, 16:10 #2
http://www.cyberforum.ru/android-dev/thread858799.html
0
Termit___
5 / 5 / 0
Регистрация: 02.04.2013
Сообщений: 86
04.07.2013, 16:16  [ТС] #3
Не совсем то. Нужно что то вроде этого:
Кликните здесь для просмотра всего текста

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
background.setOnTouchListener(new OnSwipeTouchListener() {
        public boolean onSwipeTop() {
            Toast.makeText(MainActivity.this, "top", Toast.LENGTH_SHORT).show();
            return true;
        }
        public boolean onSwipeRight() {
            Toast.makeText(MainActivity.this, "right", Toast.LENGTH_SHORT).show();
            return true;
        }
        public boolean onSwipeLeft() {
            Toast.makeText(MainActivity.this, "left", Toast.LENGTH_SHORT).show();
            return true;
        }
        public boolean onSwipeBottom() {
            Toast.makeText(MainActivity.this, "bottom", Toast.LENGTH_SHORT).show();
            return true;
        }
    });


ТОлько я пока не совсем понимаю как это прикрутить к моему случаю.
0
spydark91
86 / 86 / 13
Регистрация: 03.03.2011
Сообщений: 1,873
04.07.2013, 16:22 #4
если правильно понял то на жест влево вызываем активити 1, на жест вправо активити 2 и тд
ну вставляем примерно такой код, создающий новую активность в код приведенный вами выше
Java
1
2
                            Intent intent = new Intent(getActivity(), userImgDialog_Activity.class);                
                            startActivity(intent);
0
Termit___
5 / 5 / 0
Регистрация: 02.04.2013
Сообщений: 86
04.07.2013, 16:24  [ТС] #5
Да что вставлять понятно, а вот с тем кодом что я выложил непонятно. Что за background? Чем его заменить? Его объявлять нужно в начали или что? Не пойму чему нужно присваивать этот листнер. Поидее работать должно на всем экране.
0
spydark91
86 / 86 / 13
Регистрация: 03.03.2011
Сообщений: 1,873
04.07.2013, 16:30 #6
сам ни разу не пробовал так делать ,но думаю что должно как то так быть
XML
1
2
3
<LinearLayout 
необходимые атрибуты
android:id="@+id/bg">наполнение</LinearLayout>
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
final LinearLayout bg = (LinearLayout)findViewById(R.id.bg);
bg.setOnTouchListener(new OnSwipeTouchListener() {
public boolean onSwipeTop() {
Toast.makeText(MainActivity.this, "top", Toast.LENGTH_SHORT).show();
return true;
}
public boolean onSwipeRight() {
Toast.makeText(MainActivity.this, "right", Toast.LENGTH_SHORT).show();
return true;
}
public boolean onSwipeLeft() {
Toast.makeText(MainActivity.this, "left", Toast.LENGTH_SHORT).show();
return true;
}
public boolean onSwipeBottom() {
Toast.makeText(MainActivity.this, "bottom", Toast.LENGTH_SHORT).show();
return true;
}
});
попробуйте
0
Termit___
5 / 5 / 0
Регистрация: 02.04.2013
Сообщений: 86
04.07.2013, 17:44  [ТС] #7
Не отрабатывает. Ошибку выдает на 3 строке(bg.setOn.Touch...)
Вообще я могу ошибаться с методом, возможно для реализации свайпа нужен другой метод.

Добавлено через 6 минут
О, нашел более подробную реализацию:
Кликните здесь для просмотра всего текста

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
import android.view.GestureDetector;
import android.view.GestureDetector.SimpleOnGestureListener;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
 
public class OnSwipeTouchListener implements OnTouchListener {
 
    private final GestureDetector gestureDetector = new GestureDetector(new GestureListener());
 
    public boolean onTouch(final View view, final MotionEvent motionEvent) {
        super.onTouch(view, motionEvent);
        return gestureDetector.onTouchEvent(motionEvent);
    }
 
    private final class GestureListener extends SimpleOnGestureListener {
 
        private static final int SWIPE_THRESHOLD = 100;
        private static final int SWIPE_VELOCITY_THRESHOLD = 100;
 
        @Override
        public boolean onDown(MotionEvent e) {
            return true;
        }
 
        @Override
        public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
            boolean result = false;
            try {
                float diffY = e2.getY() - e1.getY();
                float diffX = e2.getX() - e1.getX();
                if (Math.abs(diffX) > Math.abs(diffY)) {
                    if (Math.abs(diffX) > SWIPE_THRESHOLD && Math.abs(velocityX) > SWIPE_VELOCITY_THRESHOLD) {
                        if (diffX > 0) {
                            onSwipeRight();
                        } else {
                            onSwipeLeft();
                        }
                    }
                } else {
                    if (Math.abs(diffY) > SWIPE_THRESHOLD && Math.abs(velocityY) > SWIPE_VELOCITY_THRESHOLD) {
                        if (diffY > 0) {
                            onSwipeBottom();
                        } else {
                            onSwipeTop();
                        }
                    }
                }
            } catch (Exception exception) {
                exception.printStackTrace();
            }
            return result;
        }
    }
 
    public void onSwipeRight() {
    }
 
    public void onSwipeLeft() {
    }
 
    public void onSwipeTop() {
    }
 
    public void onSwipeBottom() {
    }
}

Но тут я незнаю несколько методов. Не обьясните, знающие люди? Что за метод onFling? Тут как я понял нужно создавать отдельный класс, а потом из кода обращаться к нему таким методом:
Кликните здесь для просмотра всего текста

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
 background.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View arg0) {
            toggleSomething();
        }
    });
    background.setOnTouchListener(new OnSwipeTouchListener() {
        public boolean onSwipeTop() {
            Toast.makeText(MainActivity.this, "top", Toast.LENGTH_SHORT).show();
            return true;
        }
        public boolean onSwipeRight() {
            Toast.makeText(MainActivity.this, "right", Toast.LENGTH_SHORT).show();
            return true;
        }
        public boolean onSwipeLeft() {
            Toast.makeText(MainActivity.this, "left", Toast.LENGTH_SHORT).show();
            return true;
        }
        public boolean onSwipeBottom() {
            Toast.makeText(MainActivity.this, "bottom", Toast.LENGTH_SHORT).show();
            return true;
        }
    });

И опять же бэкгрунд непонятен.

Добавлено через 51 минуту
Не получается нифига. Может кто то уже делал такой свайп? Поделитесь опытом.
0
V0v1k
1160 / 984 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
04.07.2013, 21:05 #8
Цитата Сообщение от Termit___ Посмотреть сообщение
Ошибку выдает на 3 строке(bg.setOn.Touch...)
какую?

Не по теме:

экстрасенса в студию!

0
Termit___
5 / 5 / 0
Регистрация: 02.04.2013
Сообщений: 86
08.07.2013, 14:44  [ТС] #9
Сделал как сказано здесь: http://savagelook.com/blog/android/s...ion-in-android
Только анимации не получилось. Просто переходит на новый Активити.
0
georustam
0 / 0 / 0
Регистрация: 02.03.2015
Сообщений: 8
03.03.2015, 08:56 #10
Тема актуальна, но так и не раскрыта, по ссылке 404.
0
androbro
340 / 301 / 67
Регистрация: 17.10.2014
Сообщений: 887
03.03.2015, 11:37 #11
Цитата Сообщение от Termit___ Посмотреть сообщение
И опять же бэкгрунд непонятен.
вьюха на которую ты вешаешь листенер
Цитата Сообщение от georustam Посмотреть сообщение
Тема актуальна, но так и не раскрыта
да все тут раскрыто, ТС сам же всю реализацию выложил, только прикрутить не смог.
0
georustam
0 / 0 / 0
Регистрация: 02.03.2015
Сообщений: 8
03.03.2015, 18:28 #12
Честно, вот и я не могу прикрутить...Было бы круто если бы был мануал. Спасибо Вам за ответ.
0
androbro
340 / 301 / 67
Регистрация: 17.10.2014
Сообщений: 887
04.03.2015, 09:10 #13
georustam, эх, давно это было, но как помню все отлично работало)
тут
тут
0
Rube
911 / 559 / 88
Регистрация: 13.02.2014
Сообщений: 2,072
04.03.2015, 09:52 #14
Не делай свайпы, табы делай.
0
Spelcrawler
531 / 501 / 113
Регистрация: 12.03.2014
Сообщений: 1,666
Завершенные тесты: 1
04.03.2015, 09:53 #15
Эммм, а зачем такое извращение? Есть же ViewPager.
0
georustam
0 / 0 / 0
Регистрация: 02.03.2015
Сообщений: 8
04.03.2015, 18:34 #16
Как я понял, ViewPager возможен переход только right-left но могу ошибаться. Но данная реализация, как мне кажется может стать удобной для навигации. К примеру, хочу реализовать в приложение меню как при разблокировки экрана, то есть влево "ползунок" наведу - откроется активити1, вправа активити2 и т.д. Было бы еще интересно увидеть, как такой бегунок реализовывают.
0
Spelcrawler
531 / 501 / 113
Регистрация: 12.03.2014
Сообщений: 1,666
Завершенные тесты: 1
04.03.2015, 22:59 #17
georustam, пользователи к такому не привыкли, лучше использовать стандартные методы навигации.
0
georustam
0 / 0 / 0
Регистрация: 02.03.2015
Сообщений: 8
06.03.2015, 07:18 #18
Spelcrawler, порой они сами не знают чего хотят
0
correcеt
-1 / 3 / 1
Регистрация: 20.04.2011
Сообщений: 412
11.02.2016, 22:15 #19
spydark91, вот тчо выдает на ваш код
(Пытаюсь реализовать свайп между актвити)
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.LinearLayout.setOnTouchListener(android.view.View$OnTouchListener)' on a null object reference
 
///////////////////////////////////////////////
package com.example.navigate.potehki_v01; 
 
import android.os.Bundle; 
import android.support.v7.app.AppCompatActivity; 
import android.view.GestureDetector; 
import android.view.MotionEvent; 
import android.view.View; 
import android.widget.LinearLayout; 
import android.widget.Toast; 
 
 
public class MainActivity extends AppCompatActivity { 
private GestureDetector gestureDetector; 
Last Stand 
protected void onCreate(Bundle savedInstanceState) { 
super.onCreate(savedInstanceState); 
setContentView(R.layout.activity_main); 
 
// 
LinearLayout bg = (LinearLayout)findViewById(R.id.activity2); 
bg.setOnTouchListener(new View.OnTouchListener() { 
Last Stand 
public boolean onTouch(View v, MotionEvent event) { 
return false; 
} 
public boolean onSwipeTop() { 
Toast.makeText(MainActivity.this, "top", Toast.LENGTH_SHORT).show(); 
return true; 
} 
public boolean onSwipeRight() { 
Toast.makeText(MainActivity.this, "right", Toast.LENGTH_SHORT).show(); 
return true; 
} 
public boolean onSwipeLeft() { 
Toast.makeText(MainActivity.this, "left", Toast.LENGTH_SHORT).show(); 
return true; 
} 
public boolean onSwipeBottom() { 
Toast.makeText(MainActivity.this, "bottom", Toast.LENGTH_SHORT).show(); 
return true; 
} 
}); 
 
} 
 
}
0
MrStuff88
0 / 0 / 0
Регистрация: 02.02.2015
Сообщений: 15
13.03.2016, 18:40 #20
Возобновлю тему, есть важный вопрос по ней. При использовании вышеописанного решения, чтение свайпа происходит во всему экрану. А можно ли сделать так, чтобы чтение происходило по какой-то определенной области? например в квадрате со стороной n и т.п.
0
13.03.2016, 18:40
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.03.2016, 18:40
Привет! Вот еще темы с решениями:

[Swipe, Fragment] - интерфейс как у маркета
Приветствую, которую неделю туплю и не могу сделать интерфейс как у маркета....

Странное поведение swipe-to-dismiss RecyclerView
После удаления свайпом элемента списка остаётся небольшой пробе между...

Пример простейшего приложения со swipe-меню на Android
доброго времени суток не могли бы подсказать где можно взять пример самого...

Нижняя навигация
Всем привет. Задача выглядит так: 1. Есть нижний таб бар. (5 иконок)....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru