Android 6 中的滚动条触摸区域
Scrollbar touch area in Android 6
我观察到 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。你能帮帮我吗?
我遇到了同样的问题,最后使用了解决方法。
诀窍是在用户不滚动时(或在他停止滚动后 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);
}
}
希望这对您有所帮助
找到了一个简单的解决方案,老实说我并不完全理解 ;)
我为蓝色部分创建了一个视图覆盖层,它应该对 fastscrollbar 不敏感(父视图是 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);
}
});
我观察到 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。你能帮帮我吗?
我遇到了同样的问题,最后使用了解决方法。
诀窍是在用户不滚动时(或在他停止滚动后 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);
}
}
希望这对您有所帮助
找到了一个简单的解决方案,老实说我并不完全理解 ;)
我为蓝色部分创建了一个视图覆盖层,它应该对 fastscrollbar 不敏感(父视图是 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);
}
});