Несколько советов по созданию кнопки переключения

#android #togglebutton

#Android #кнопка переключения

Вопрос:

Я должен создать ToggleButton такой (должен быть изменен на любом устройстве).

А затем разместите его в ViewGroup onLayout методе.

Не могли бы вы, пожалуйста, предоставить мне какие-либо идеи, как его создать?

введите описание изображения здесь


Я пытался сделать это таким образом:

buttons.xml

 <ToggleButton
        android:id="@id/add_favorites_button_id"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:background="@drawable/menu_button_selector"
        android:drawableTop="@drawable/star"
        android:textOff=""
        android:textOn=""
        android:contentDescription="Add Favorites"/>
  

menu_button_selector.xml

 <level-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:maxLevel="0">
    <selector xmlns:android="http://schemas.android.com/apk/res/android">
        <item android:state_checked="true">
            <rotate
                    android:fromDegrees="90"
                    android:toDegrees="90"
                    android:pivotX="50%"
                    android:pivotY="50%"
                    android:drawable="@drawable/round_button_active"/>
        </item>
        <item android:state_checked="false">
            <rotate
                    android:fromDegrees="90"
                    android:toDegrees="90"
                    android:pivotX="50%"
                    android:pivotY="50%"
                    android:drawable="@drawable/round_button"/>
        </item>

    </selector>
</item>
.....
</level-list>
  

round_button_active.xml

У меня есть некоторый фон, и я просто поворачиваю его. Потому что кнопки должны располагаться в известных градусах: 0, 45, 90, …

 <?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item>
    <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle">
        <corners android:topLeftRadius="50dp" android:topRightRadius="50dp"/>
        <solid android:color="@color/tb_red_button"/>
        <size android:width="60dp" android:height="60dp"/>
    </shape>
</item>
</layer-list>
  

А затем в onLayout методе я его верстаю:

 final View button = parentLayout.getChildAt(i);
button.getBackground().setLevel(i);
button.setOnClickListener(this);
button.layout(x1, y1, x2, y2);
  

Что я получил:

введите описание изображения здесь

кнопки на 0, 90, 180 и т. Д. Градусов Выглядят довольно ясно, какими они должны быть

но

при 45, 135 и т.д. градусах кнопка вырезается прямоугольным холстом. Даже если я поворачиваю ее, я делаю это в области видимости на прямоугольном холсте.

Комментарии:

1. Я бы начал с создания собственной пользовательской viewgroup, а затем создал пользовательскую кнопку переключения

2. Да, большое вам спасибо за хороший совет. Лучший

3. Возможно, пользовательская кнопка переключения не нужна 😉

4. Да, вы правы, извините, я потратил действительно много времени на его создание (все время неправильно), поэтому я ответил на ваш ответ вот так 😉

5. Удачи! Потому что создание пользовательских компонентов — не самая простая вещь на Android

Ответ №1:

Из того, что я понял, один из возможных способов достижения этого (с использованием изображений) будет выглядеть так

Рассматривайте изображение, которое у вас здесь, как полукруг (два полукруга с черной каймой), который является частью полного круга. Верхняя половина этого круга прозрачна. Вся эта настройка будет представлять собой изображение внутри изображения.

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

Теперь поместите оба изображения одно над другим, с красным сверху. Добавьте прослушиватель щелчков к красному изображению — просматривайте и поворачивайте его с помощью imageView.setRotate(degree)

Для создания вращательного движения, подобного ощущению, просто вызовите вышеуказанный метод после очень короткого интервала и каждый раз увеличивайте значение degree .

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

два вида изображений один над другим

Комментарии:

1. Большое вам спасибо за ваш ответ. Но есть ли какая-либо возможность создать такой фон для кнопки (используя фигуры, без изображений) с разными размерами. Из-за этого это должно применяться для устройств с разными разрешениями. Проблема в том, что холст кнопки представляет собой прямоугольник. И когда я поворачиваю фон кнопки, видны углы.

2. Почему вы хотите использовать кнопку? используйте просмотр изображений и установите для этого прослушиватель щелчков. пользователь не заметит разницы. В одном представлении изображения вы можете установить два чертежа, по одному для фона и src. Они сформируют два ваших черных круга. для красного используйте другое изображение, как я упоминал в своем ответе выше. И да, вы можете рисовать круглые фигуры в формате xml и размещать в папке для рисования. Используйте разные xml для разных кругов. Пожалуйста, обратите внимание, что зеленая и синяя границы — это просто индикаторы размера и формы изображений, они не будут видны.