NestedTouchScrollingLayout
:8ball: 处理子 View,父 View 嵌套滚动,成本比 support v4 NestedScrolling 低,放心食用~
Install / Use
/learn @JarvisGG/NestedTouchScrollingLayoutREADME
NestedTouchScrollingLayout
This layout is used to support dispatch touch event. There has some example gif~
主要用来做 View 的无缝拖拽,详细效果看 gif~
|Author|Jarvis| |---|--- |E-mail|yang4130qq@gmail.com
效果
|
|
|
|---|---|
|normal|webview|
|
|
|
|bottomsheet normal|bottomsheet appbarlayout|
|
|
|
|webview recyclerview|imageview recyclerview|
|
||
|scene1|scene2|
Usage example
normal use
<jarvis.com.library.NestedTouchScrollingLayout
android:id="@+id/wrapper"
android:layout_gravity="center"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<android.support.v7.widget.RecyclerView
android:id="@+id/container_rv"
android:layout_width="match_parent"
android:layout_height="400dp"
android:background="#fff"
android:overScrollMode="always">
</android.support.v7.widget.RecyclerView>
</jarvis.com.library.NestedTouchScrollingLayout>
// 设置手指下拉阻尼
mNestedTouchScrollingLayout.setDampingDown(2.0f / 5);
// 设置手指上拉阻尼
mNestedTouchScrollingLayout.setDampingUp(3.0f / 5);
mNestedTouchScrollingLayout.registerNestScrollChildCallback(new NestedTouchScrollingLayout.INestChildScrollChange() {
// 当前 Layout 偏移距离
@Override
public void onNestChildScrollChange(float deltaY, float velocityY) {
}
// finger 脱离屏幕 Layout 偏移量,以及当前 Layout 的速度
@Override
public void onNestChildScrollRelease(final float deltaY, final int velocityY) {
mNestedTouchScrollingLayout.recover(0, new Runnable() {
@Override
public void run() {
Log.i("NestedTouchScrollingLayout ---> ", "deltaY : " + deltaY + " velocityY : " + velocityY);
}
});
}
// 手指抬起时机
@Override
public void onFingerUp(float velocityY) {
}
// 横向拖拽
@Override
public void onNestChildHorizationScroll(MotionEvent event, float deltaX, float deltaY) {
}
// 当前 SheetView 运动状态
@Override
public void onNestScrollingState(int state) {
}
});
bottomsheet use
<jarvis.com.library.NestedTouchScrollingLayout
android:id="@+id/wrapper"
android:layout_marginTop="30dp"
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.v7.widget.RecyclerView
android:background="#fff"
android:id="@+id/container_rv"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</jarvis.com.library.NestedTouchScrollingLayout>
// 临界速度,根据业务而定
public static int mVelocityYBound = 1300;
// 规定 sheetView 弹起方向
mNestedTouchScrollingLayout.setSheetDirection(NestedTouchScrollingLayout.SheetDirection.BOTTOM);
mNestedTouchScrollingLayout.registerNestScrollChildCallback(new NestedTouchScrollingLayout.INestChildScrollChange() {
@Override
public void onNestChildScrollChange(float deltaY, float velocityY) {
}
@Override
public void onNestChildScrollRelease(float deltaY, int velocityY) {
int totalYRange = mNestedTouchScrollingLayout.getMeasuredHeight();
int helfLimit = (totalYRange - DisplayUtils.dpToPixel(BottomSheetActivity.this, 400)) / 2;
int hideLimit = totalYRange - DisplayUtils.dpToPixel(BottomSheetActivity.this, 400) / 2;
int helfHeight = totalYRange - DisplayUtils.dpToPixel(BottomSheetActivity.this, 400);
if (velocityY > mVelocityYBound && velocityY > 0) {
if (Math.abs(deltaY) > helfHeight) {
mNestedTouchScrollingLayout.hiden();
} else {
mNestedTouchScrollingLayout.peek(mNestedTouchScrollingLayout.getMeasuredHeight() - DisplayUtils.dpToPixel(BottomSheetActivity.this,400));
}
} else if (velocityY < -mVelocityYBound && velocityY < 0) {
if (Math.abs(deltaY) < helfHeight) {
mNestedTouchScrollingLayout.expand();
} else {
mNestedTouchScrollingLayout.peek(mNestedTouchScrollingLayout.getMeasuredHeight() - DisplayUtils.dpToPixel(BottomSheetActivity.this,400));
}
} else {
if (Math.abs(deltaY) > hideLimit) {
mNestedTouchScrollingLayout.hiden();
} else if (Math.abs(deltaY) > helfLimit) {
mNestedTouchScrollingLayout.peek(mNestedTouchScrollingLayout.getMeasuredHeight() - DisplayUtils.dpToPixel(BottomSheetActivity.this, 400));
} else {
mNestedTouchScrollingLayout.expand();
}
}
}
@Override
public void onFingerUp(float velocityY) {
}
@Override
public void onNestChildHorizationScroll(MotionEvent event, float deltaX, float deltaY) {
}
});
Next
- [x] hold all touch event, and dispath touch event to child view.
- [x] fix ACTION_UP dispatch child click event.
- [x] support bottomsheet.
- [x] support CoordinatorLayout (AppbarLayout).
- [x] add damping draging.
- [ ] add blur cover.
Usage
方式 1:
repositories {
// ...
maven { url "https://jitpack.io" }
}
dependencies {
implementation 'com.github.JarvisGG:NestedTouchScrollingLayout:1.2.4'
}
方式 2:
repositories {
// ...
jcenter()
}
dependencies {
implementation 'com.jarvis.library.NestedTouchScrollingLayout:library:1.2.4'
}
Tip
star star star !!!!:blush:
LICENSE
![]()
This library is under the MIT license. check the LICENSE file for more detail.
Copyright (c) 2018 Jarvis
Related Skills
openhue
339.5kControl Philips Hue lights and scenes via the OpenHue CLI.
sag
339.5kElevenLabs text-to-speech with mac-style say UX.
weather
339.5kGet current weather and forecasts via wttr.in or Open-Meteo
tweakcc
1.5kCustomize Claude Code's system prompts, create custom toolsets, input pattern highlighters, themes/thinking verbs/spinners, customize input box & user message styling, support AGENTS.md, unlock private/unreleased features, and much more. Supports both native/npm installs on all platforms.
