Á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:

Scrollbar captura de pantalla

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?

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); } }); 
  • Barra de desplazamiento en android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.