Как сделать красивое прозрачное меню, подобное «поделиться меню» в галерее Android? - PullRequest
5 голосов
/ 14 февраля 2011

На моем устройстве Android 2.2.2 галерея выглядит очень красиво.Что я хотел бы сделать в своем собственном приложении, так это нажать кнопку и затем показать меню, которое выглядит следующим образом: enter image description here

Использует ли это какие-либо стандартные темы / стили для Android?Кто-нибудь знает пример кода для такого меню?

Редактировать: Я понял, что можно подражать этому меню с помощью диалога.Чтобы упростить задачу, в этом примере я не использую ListView, а просто одну запись TextView для диалога:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:id="@+id/layout_root"
              android:orientation="vertical"
              android:layout_width="wrap_content"
              android:layout_height="wrap_content"
              >
    <TextView android:id="@+id/text"
              android:layout_width="wrap_content"
              android:layout_height="fill_parent"
              android:textColor="#FFF"
              android:padding="10dp"
              />
</LinearLayout>

Отображение диалога при нажатии кнопки:

                Dialog dialog = new Dialog(MyActivity.this);
                dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);

                dialog.setContentView(R.layout.custom_dialog);

                TextView text = (TextView) dialog.findViewById(R.id.text);
                text.setText("Test option 1");

                WindowManager.LayoutParams WMLP = dialog.getWindow().getAttributes();
                WMLP.gravity = (Gravity.BOTTOM | Gravity.LEFT);
                WMLP.x = 0;
                WMLP.y = 0;
                dialog.getWindow().setAttributes(WMLP);

                dialog.show();

Это создает диалог, который приближается к меню на картинке.У меня все еще есть две проблемы:

1) Как я могу нарисовать этот маленький треугольник в нижней части диалогового окна, как это сделано на картинке выше?

2) Кнопка, котораяПредполагается, что диалоговое окно находится горизонтально в середине нижней панели кнопок.Поэтому, когда я нажимаю его, диалог должен отображаться прямо над этой кнопкой.Я хотел бы сделать следующее:

WMLP.x = middleButton.getLeft() + (middleButton.getWidth() / 2) - dialog.getWindow().getDecorView().getPaddingLeft() - (WMLP.width / 2);

Проблема в том, что WMLP.width равен -2.Я предполагаю, что причина в том, что ширина макета установлена ​​на «wrap_content» (то есть -2), а фактическая ширина в данный момент неизвестна.Итак, как я могу определить ширину диалога, чтобы я мог расположить его концентрически над другим видом?

Обновление: я наконец-то нашел отличный источник для такого диалога: http://www.londatiga.net/it/how-to-create-quickaction-dialog-in-android/

Это именно то, что я хотел, и сейчас я использую это в своем приложении.

Ответы [ 3 ]

1 голос
/ 15 февраля 2011

Вы можете сделать это, добавив всплывающее окно в текущем местоположении, для рисования этого классного меню вам понадобится изображение этого фона и небольшая стрелка для рисования.

Также вам следуетПрочитайте про Nine-Path Drawable, чтобы сделать это.

PS: Я уже сделал это, но с другим изображением.

0 голосов
/ 15 февраля 2011

Это возможно, или, по крайней мере, может быть достигнуто с помощью конструкций PathShape. В сочетании с ShapeDrawable вы можете создать свой собственный «диалоговый» элемент управления. Используя тот же путь, вы можете определить области отсечения чертежа Canvas. Наконец, используя ColorDrawable, вы можете закрасить холст прозрачным цветом.

0 голосов
/ 15 февраля 2011

О диалоге

3 варианта:

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

  2. Другой вариант, будет использовать пользовательский вид. Я никогда не пробовал это, но я думаю, что вы можете указать набор точек и обвести их, создав белую рамку. Внутри может быть нарисованный прямоугольник с прозрачностью (легко). Есть что-то, что может нарисовать тень с вашим объектом рисования (то, что вы используете для рисования текста, линий, прямоугольников), но я считаю, что это будет самой сложной вещью для достижения с помощью функции рисования вручную.

  3. Используйте источник! (Другими словами, Android открыт ... посмотрите, как они это сделали в исходном коде)

О ширине вида:

Когда вы пытаетесь получить значение? Если вы делаете это в методе onCreate, он не должен работать. Делайте это, когда пользователь нажимает кнопку. Если вы уже делаете это на этот раз, я не могу вам помочь. Он должен работать. Я делал это много раз раньше!

Бесплатный совет: Вместо view.getLeft (который возвращает расстояние до своего родителя) лучше использовать view.getLocationOnScreen.

...