This layout is used to support dispatch touch event. There has some example gif~
主要用来做 View 的无缝拖拽,详细效果看 gif~
Author | Jarvis |
---|---|
yang4130qq@gmail.com |
normal | webview |
bottomsheet normal | bottomsheet appbarlayout |
webview recyclerview | imageview recyclerview |
scene1 | scene2 |
<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) {
}
});
<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) {
}
});
- hold all touch event, and dispath touch event to child view.
- fix ACTION_UP dispatch child click event.
- support bottomsheet.
- support CoordinatorLayout (AppbarLayout).
- add damping draging.
- add blur cover.
方式 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:
This library is under the MIT license. check the LICENSE file for more detail.
Copyright (c) 2018 Jarvis