【问题标题】:Scrollbar touch area in Android 6Android 6 中的滚动条触摸区域
【发布时间】:2016-02-10 17:00:18
【问题描述】:

我观察到 Android 6.0 Marshmallow 中的新行为。滚动条的触摸区域比滚动条宽。它在以下屏幕截图中可见。滚动条有 20 dp(绿色区域),触摸区域可能是 48 dp(蓝色和绿色区域)。我只想让滚动条上方的触摸区域:

我使用以下:

<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" />

快速滚动条始终可见,我在列表视图中使用以下样式:

<item name="android:scrollbarStyle">outsideInset</item>

但结果看起来更像是outsideOverlay。我只能在 Marshmallow 设备上观察到这个问题。

我想找到导致它的属性并将其从 48dp 更改为 20dp。你能帮帮我吗?

【问题讨论】:

  • 这也是我在 ListView 上设置 android:fastScrollEnabled="true" 时遇到的问题。
  • @ClausHolst 对我来说也一样,确实应该可以设置区域大小。我试图定义一个禁用快速滚动的onTouch区域,但是普通滚动和快速滚动的设计差异太大,混淆了用户体验......

标签: android scrollbar android-styles android-6.0-marshmallow


【解决方案1】:

我遇到了同样的问题并最终使用了解决方法。

诀窍是在用户不滚动时(或在他停止滚动后 1 秒)禁用快速滚动,并在他再次开始滚动时重新激活它。 为此,您需要像这样实现 OnScrollListener 并将侦听器设置为列表视图:

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);
    }
}

希望对你有帮助

【讨论】:

    【解决方案2】:

    找到了一个简单的解决方案,老实说我不完全理解;) 我为蓝色部分创建了一个视图叠加层,它应该对快速滚动条不敏感(父视图是 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"/>
    

    然后在我的列表视图片段中,我为覆盖视图设置了一个OnTouchListener 以捕获触摸事件。这个想法是抓住MotionEvent.ACTION_DOWN 以避免跳转到快速滚动条的位置。但是下面的代码已经做到了。

    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);
        }
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多