Подтвердить что ты не робот

Как изменить положение кнопки ручки джойстика

В ручке по умолчанию в android SlidingDrawer в центре ящика. Можно ли изменить это положение налево или вправо..? Если возможно, как это сделать, android:gravity="left" не работает в кнопке.

4b9b3361

Ответ 1

Поместите свой дескриптор в RelativeLayout и установите android: layout_alignParentRight = "true" в дескрипторе.

Например, например:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content">

    <TextView android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="@string/hello" />

    <SlidingDrawer android:id="@+id/drawer"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:handle="@+id/handle" 
        android:content="@+id/content">

        <RelativeLayout
            android:layout_width="fill_parent"
            android:layout_height="wrap_content" 
            android:id="@+id/handle">
            <ImageView android:src="@drawable/icon"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_alignParentRight="true" />
        </RelativeLayout>

        <LinearLayout 
            android:gravity="center" 
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:background="#aaaa00" android:id="@+id/content">
            <ImageView android:src="@drawable/icon"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:layout_gravity="center">
            </ImageView>
        </LinearLayout>

    </SlidingDrawer>

</FrameLayout>

Ответ 2

Проблема, с которой я столкнулась с ответом HenrikS, заключалась в том, что в моем случае у меня были некоторые взгляды относительно относительного макета, и когда я попытался щелкнуть их, я понял, что относительный макет перехватывает эти клики, потому что ширина была установлена ​​на fill_parent.

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

public class CustomSlidingDrawer extends SlidingDrawer {

public CustomSlidingDrawer(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
}

public CustomSlidingDrawer(Context context, AttributeSet attrs) {
    this(context, attrs, 0);
}

@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
    super.onLayout(changed, l, t, r, b);

    final int height = b - t;

    ImageView handle = (ImageView) getHandle();
    int childLeft = 0;
    int childWidth = handle.getWidth();
    int topOffset = 0;
    int bottomOffest = 0;
    int childHeight = handle.getHeight();

    int childTop = this.isOpened()?topOffset:height - childHeight + bottomOffest;

    handle.layout(childLeft, childTop , childLeft + childWidth, childTop+childHeight);
}
}

Ответ 3

Идея проста: установите для дескриптора дескриптора правильное значение в зависимости от желаемого выравнивания.

В приведенном ниже примере я получаю класс из SlidingDrawer и переопределяю onLayout следующим образом. Мой скользящий ящик находится внизу экрана, и я хочу, чтобы ручка была выровнена по левому краю, а не выравнивалась по центру.

public class ToolDrawer extends SlidingDrawer {
    private int m_handleWidth = 0;  // original handle width

    public boolean onTouchEvent(MotionEvent event) {
        float x = event.getX();
        if (x <= m_handleWidth) {
            return super.onTouchEvent(event);
        }
        return false;
    }

    protected void onLayout (boolean changed, int left, int top, int right, int bottom) {
        super.onLayout(changed, left, top, right, bottom);

        if (changed) {
            ImageView iv = (ImageView) getHandle();
            iv.setPadding(0, 0, getWidth() - iv.getWidth(), 0);
            if (m_handleWidth == 0) {
                m_handleWidth = iv.getWidth();
            }
        }
    }
}

Это так просто.

Ответ 4

Я пробовал android:paddingBottom="300dp" для ImageView, и он отлично работает, также с левым, правым и верхним. Но вы должны установить отступы из среднего положения, поэтому bottom="300dp" означает, что рукоятка перемещается вверх по 300 с середины

Ответ 5

Более простое решение для левой выровненной ручки:

@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
    super.onLayout(changed, l, t, r, b);
    final View handle = getHandle();
    handle.layout(0, handle.getTop(), handle.getWidth(), handle.getBottom());
}

Ответ 6

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

Итак, я использую SlidingTray из библиотеки Sileria (вер. 3.5) http://aniqroid.sileria.com/doc/api/

Тогда вот так

Ответ 7

Я нашел решение для garibay Вам просто нужно установить android: clickable = "true" на макет содержимого скользящего ящика.