Área de toque de Scrollbar en Android 6
Observo un nuevo comportamiento en Android 6.0 Marshmallow. El área de toque de la barra de desplazamiento está más ancha que la barra de desplazamiento. Es visible en la siguiente captura de pantalla. La barra de desplazamiento tiene 20 dp (área verde) y el área tocante es probablemente de 48 dp (área azul y verde). Me gustaría tener el área de toque por encima de la barra de desplazamiento solamente:
- Teclado Android oscurece EditText
- Cómo insertar ListView en CardView con barra de desplazamiento fuera de CardView?
- ¿Cómo puedo agregar barras de desplazamiento a un LinearLayout en Android?
- Cambiar la posición de la barra de desplazamiento en Android RecyclerView
- Ocultar barra de desplazamiento de HorizontalScrollView
Yo uso lo siguiente:
<resources xmlns:android="http://schemas.android.com/apk/res/android"> <style name="MyTheme.Dark" parent="android:Theme.Black"> <item name="android:fastScrollStyle">@style/Widget.FastScroll</item> <item name="android:scrollbarThumbVertical">@drawable/dark_scrollbar_thumb</item> <item name="android:scrollbarTrackVertical">@drawable/dark_scrollbar_track</item> <item name="android:scrollbarSize">4dp</item> <item name="android:fastScrollThumbDrawable">@drawable/dark_scrollbar_fast_thumb</item> <item name="android:fastScrollTrackDrawable">@drawable/dark_scrollbar_fast_track</item> </style> <style name="Widget.FastScroll" parent="android:Widget.Material.FastScroll"> </style> </resources>
Dark_scrollbar_fast_thumb.xml:
<?xml version="1.0" encoding="utf-8"?> <layer-list xmlns:android="http://schemas.android.com/apk/res/android" > <item> <shape> <size android:height="30dp" android:width="20dp" /> <solid android:color="@android:color/transparent" /> </shape> </item> <item android:left="8dp" android:right="8dp"> <shape> <size android:height="30dp" android:width="4dp" /> <solid android:color="@color/dark_secondary" /> </shape> </item> </layer-list>
Dark_scrollbar_fast_track.xml:
<?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" > <size android:width="@dimen/1dp" /> <solid android:color="@color/dark_scrollbar_track" /> </shape>
Dark_scrollbar_fast_thumb.xml:
<item> <shape> <size android:height="30dp" android:width="20dp" /> <solid android:color="@android:color/transparent" /> </shape> </item> <item android:left="8dp" android:right="8dp"> <shape> <size android:height="30dp" android:width="4dp" /> <solid android:color="@color/dark_secondary" /> </shape> </item>
Dark_scrollbar_fast_track.xml:
<size android:width="@dimen/1dp" /> <solid android:color="@color/dark_scrollbar_track" />
La barra de desplazamiento rápida siempre está visible y utilizo el siguiente estilo en las vistas de lista:
<item name="android:scrollbarStyle">outsideInset</item>
Pero el resultado se parece más a outsideOverlay. Puedo observar este problema sólo en dispositivos Marshmallow.
Me gustaría encontrar el atributo que lo causa y cambiarlo de 48dp a 20dp. ¿Sería tan amable de ayudarme?
- Hacer scrollbars flash de código (como iOS flashScrollIndicators)
- RecyclerView scrollbar laggy
- ¿Existe una devolución de llamada cuando RecyclerView ha terminado de mostrar sus elementos después de haberlo configurado con un adaptador?
- Barra de desplazamiento a ViewGroup personalizado
- Vista de lista de carga dinámica de Android problemas de onScrollListener
- Cómo hacer Barra de desplazamiento movible y movible en una vista de lista
- Apache cordova en android ¿dónde están las barras de desplazamiento?
- Habilitación de la barra de desplazamiento en EditText Android
Encontré el mismo problema y terminé usando una solución.
El truco es desactivar el desplazamiento rápido cuando el usuario no está desplazándose (o 1 segundo después de que dejó de desplazarse), y lo reactivará cuando comience a desplazarse de nuevo. Para ello, es necesario implementar OnScrollListener de esta manera y establecer el listener en el listview:
private int mCurrentState = 0; @Override public void onScrollStateChanged(AbsListView absListView, int state) { if (state == SCROLL_STATE_IDLE && mCurrentState != state && mListview.isFastScrollEnabled()){ mListview.postDelayed(new Runnable() { @Override public void run() { mListview.setFastScrollEnabled(false); } },1000); } mCurrentState = state; } @Override public void onScroll(AbsListView absListView, int i, int i1, int i2) { if (mCurrentState == SCROLL_STATE_TOUCH_SCROLL) { if (!mListview.isFastScrollEnabled()) mListview.setFastScrollEnabled(true); } }
Espero que esto pueda ayudarte
Encontré una solución simple que honestamente no entiendo completamente;) He creado una superposición de vista para la sección azul que debería ser sensible al tacto para la barra de desplazamiento (la vista principal es un RelativeLayout
).
<View android:id="@+id/scroll_overlay android:layout_width="25dp" android:layout_marginRight="25dp" android:alignParentTop="true" android:alignParentRight="true" android:layout_above="@id/my_list_view_bottom_bar" android:clickable="true"/>
Luego en mi fragmento de vista de lista, configuro un OnTouchListener
para la vista de superposición para capturar los eventos de toque. La idea era capturar el MotionEvent.ACTION_DOWN
para evitar saltar a la posición rápida de la barra de desplazamiento. Pero el código siguiente lo hace ya.
View scrollOverlay = (View)view.findViewById(R.id.scroll_overlay); scrollOverlay.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { return myListView.onTouchEvent(event); } });
- NotificationListenerService no funciona – incluso después de dar permiso
- ¿Cómo obtengo la vista de cuadrícula dinámica android?