В ручке по умолчанию в android SlidingDrawer в центре ящика. Можно ли изменить это положение налево или вправо..? Если возможно, как это сделать, android:gravity="left"
не работает в кнопке.
Как изменить положение кнопки ручки джойстика
Ответ 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" на макет содержимого скользящего ящика.