Я играл с анимацией, слоями и так далее, и я кодировал это простое скользящее меню. Идея очень проста, когда пользователь касается экрана и поднимает палец, приложение показывает меню, когда пользователь касается экрана и опускает палец, это меню исчезает. Как видите, идея очень проста, но может быть полезна, когда мы хотим добавить меню в наши приложения.
Первым шагом является создание нашего скользящего слоя, который будет содержать наше меню. Для простоты я просто покажу TextView, но вы можете изменить код для отображения вашего меню. Предположим, что activity_main.xml — это xml-макет нашей Activity, поэтому мы имеем:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
android:layout_width = "match_parent" android:layout_height = "match_parent" android:background = "@color/green" > < LinearLayout android:id = "@+id/slider" android:layout_width = "match_parent" android:layout_height = "60dp" android:layout_alignParentBottom = "true" android:layout_alignParentLeft = "false" android:layout_alignParentTop = "false" android:layout_centerInParent = "true" android:background = "@color/gray" android:content = "@+id/content" android:gravity = "bottom|center_horizontal" android:orientation = "vertical" > < TextView android:id = "@id/content" android:layout_width = "match_parent" android:layout_height = "wrap_content" android:text = "Surviving with android" /> </ LinearLayout > </ RelativeLayout > |
Это базовый слой, который будет перемещаться вверх и вниз, следуя указаниям пальца пользователя. Если вы хотите добавить меню, замените TextView на ваше меню (возможно, с кнопками и т. Д.). Теперь давайте посмотрим на активность, которая должна управлять этим меню. При запуске этот слой должен быть невидимым, поэтому мы должны добавить:
1
2
3
4
5
6
7
8
9
|
@Override public void onCreate(Bundle savedInstanceState) { super .onCreate(savedInstanceState); setContentView(R.layout.activity_main); ll = (LinearLayout) findViewById(R.id.slider); ll.setVisibility(View.GONE); .... } |
Мы просто устанавливаем видимость макета в View.GONE . Теперь мы должны отслеживать движения пальцев пользователя, чтобы реагировать на эти движения. Для этого нам нужно просто переопределить метод public boolean onTouchEvent (событие MotionEvent). Если мы хотим получить больше информации о том, как обрабатывать события сенсорного экрана, посмотрите здесь . Чтобы узнать, перемещает ли пользователь палец вверх или вниз, нам просто нужно сохранить положение Y, когда пользователь впервые касается экрана (событие MotionEvent.ACTION_DOWN ), и сравнить его значение с положением Y, когда пользователь перемещает палец вверх ( Событие MotionEvent.ACTION_UP ). Итак, мы имеем:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
@Override public boolean onTouchEvent(MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN : { startY = event.getY(); break ; } case MotionEvent.ACTION_UP: { float endY = event.getY(); if (endY < startY) { System.out.println( "Move UP" ); ll.setVisibility(View.VISIBLE); } else { ll.setVisibility(View.GONE); } } } return true ; } |
Таким образом, мы создали простое меню ВКЛ / ВЫКЛ, которое отображается, когда пользователь поднимает палец вверх, и становится невидимым, когда пользователь перемещает палец вниз. Мы могли бы добавить некоторый элемент управления, например, порог, который вызывает меню.
Добавить анимацию
Чтобы сделать это меню более привлекательным и сделать слой движущимся вверх или вниз, мы можем добавить анимацию. Для этого под каталогом res добавьте каталог с именем anim (если его нет). Мы хотим создать две анимации, одна из которых показывает, что макет движется вверх, а другая — его перемещение вниз. Мы создаем два файла, один из которых называется anim_up.xml, с таким содержанием:
1
2
3
4
5
6
7
|
<? xml version = "1.0" encoding = "utf-8" ?> < translate android:fromYDelta = "100%" android:toYDelta = "40%" android:duration = "400" /> </ set > |
и еще один, называемый anim_down.xml:
1
2
3
4
5
6
7
|
<? xml version = "1.0" encoding = "utf-8" ?> < translate android:fromYDelta = "0%" android:toYDelta = "100%" android:duration = "400" /> </ set > |
Теперь нам нужно просто загрузить эту анимацию в нашу активность и запустить ее, когда пользователь перемещает палец вверх и вниз. Итак, код нашей Деятельности выглядит так:
01
02
03
04
05
06
07
08
09
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
|
private Animation animUp; private Animation animDown; @Override public void onCreate(Bundle savedInstanceState) { super .onCreate(savedInstanceState); setContentView(R.layout.activity_main); ll = (LinearLayout) findViewById(R.id.slider); ll.setVisibility(View.GONE); animUp = AnimationUtils.loadAnimation( this , R.anim.anim_up); animDown = AnimationUtils.loadAnimation( this , R.anim.anim_down); } @Override public boolean onTouchEvent(MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN : { startY = event.getY(); break ; } case MotionEvent.ACTION_UP: { float endY = event.getY(); if (endY < startY) { System.out.println( "Move UP" ); ll.setVisibility(View.VISIBLE); ll.startAnimation(animUp); } else { ll.startAnimation(animDown); ll.setVisibility(View.GONE); } } } return true ; } |