From 5d9b5a063bbda7a3825b6a0509d5e7c3777fc95f Mon Sep 17 00:00:00 2001 From: yausername <13ritvik@gmail.com> Date: Sun, 29 Sep 2019 22:05:29 +0530 Subject: [PATCH 1/2] fix scrolling in video detail fragment. fixes #2627 --- app/build.gradle | 1 - .../schabi/newpipe/about/AboutActivity.java | 1 - .../list/comments/CommentsFragment.java | 2 +- .../fragment_video_detail.xml | 28 +++++++++---------- .../main/res/layout/fragment_video_detail.xml | 25 ++++++++--------- 5 files changed, 27 insertions(+), 30 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 614d49ac9..5c73c0936 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -73,7 +73,6 @@ dependencies { implementation 'com.nostra13.universalimageloader:universal-image-loader:1.9.5' implementation 'de.hdodenhof:circleimageview:2.2.0' - implementation 'com.github.nirhart:ParallaxScroll:dd53d1f9d1' implementation 'com.nononsenseapps:filepicker:4.2.1' implementation "com.google.android.exoplayer:exoplayer:${exoPlayerLibVersion}" diff --git a/app/src/main/java/org/schabi/newpipe/about/AboutActivity.java b/app/src/main/java/org/schabi/newpipe/about/AboutActivity.java index 0450290d2..6776b593b 100644 --- a/app/src/main/java/org/schabi/newpipe/about/AboutActivity.java +++ b/app/src/main/java/org/schabi/newpipe/about/AboutActivity.java @@ -36,7 +36,6 @@ public class AboutActivity extends AppCompatActivity { new SoftwareComponent("ACRA", "2013", "Kevin Gaudin", "http://www.acra.ch", StandardLicenses.APACHE2), new SoftwareComponent("Universal Image Loader", "2011 - 2015", "Sergey Tarasevich", "https://github.com/nostra13/Android-Universal-Image-Loader", StandardLicenses.APACHE2), new SoftwareComponent("CircleImageView", "2014 - 2017", "Henning Dodenhof", "https://github.com/hdodenhof/CircleImageView", StandardLicenses.APACHE2), - new SoftwareComponent("ParalaxScrollView", "2014", "Nir Hartmann", "https://github.com/nirhart/ParallaxScroll", StandardLicenses.MIT), new SoftwareComponent("NoNonsense-FilePicker", "2016", "Jonas Kalderstam", "https://github.com/spacecowboy/NoNonsense-FilePicker", StandardLicenses.MPL2), new SoftwareComponent("ExoPlayer", "2014-2017", "Google Inc", "https://github.com/google/ExoPlayer", StandardLicenses.APACHE2), new SoftwareComponent("RxAndroid", "2015", "The RxAndroid authors", "https://github.com/ReactiveX/RxAndroid", StandardLicenses.APACHE2), diff --git a/app/src/main/java/org/schabi/newpipe/fragments/list/comments/CommentsFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/list/comments/CommentsFragment.java index 956e6c1c8..481639a7c 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/list/comments/CommentsFragment.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/list/comments/CommentsFragment.java @@ -93,7 +93,7 @@ public class CommentsFragment extends BaseListInfoFragment { public void handleResult(@NonNull CommentsInfo result) { super.handleResult(result); - AnimationUtils.slideUp(getView(),120, 96, 0.06f); + AnimationUtils.slideUp(getView(),120, 150, 0.06f); if (!result.getErrors().isEmpty()) { showSnackBarError(result.getErrors(), UserAction.REQUESTED_COMMENTS, NewPipe.getNameOfService(result.getServiceId()), result.getUrl(), 0); diff --git a/app/src/main/res/layout-large-land/fragment_video_detail.xml b/app/src/main/res/layout-large-land/fragment_video_detail.xml index 15d6b7a17..a61660d0c 100644 --- a/app/src/main/res/layout-large-land/fragment_video_detail.xml +++ b/app/src/main/res/layout-large-land/fragment_video_detail.xml @@ -130,24 +130,24 @@ android:visibility="gone" tools:text="12:38" tools:visibility="visible" /> + + + - - + + - - Date: Wed, 2 Oct 2019 06:29:20 +0530 Subject: [PATCH 2/2] fix scroll jittering --- .../support/design/widget/FlingBehavior.java | 158 +++++++----------- 1 file changed, 61 insertions(+), 97 deletions(-) diff --git a/app/src/main/java/android/support/design/widget/FlingBehavior.java b/app/src/main/java/android/support/design/widget/FlingBehavior.java index 59eb08294..6e4754e11 100644 --- a/app/src/main/java/android/support/design/widget/FlingBehavior.java +++ b/app/src/main/java/android/support/design/widget/FlingBehavior.java @@ -1,116 +1,80 @@ package android.support.design.widget; -import android.animation.ValueAnimator; import android.content.Context; -import android.support.annotation.NonNull; -import android.support.design.animation.AnimationUtils; +import android.support.annotation.Nullable; import android.util.AttributeSet; -import android.view.View; +import android.view.MotionEvent; +import android.widget.OverScroller; -// check this https://github.com/ToDou/appbarlayout-spring-behavior/blob/master/appbarspring/src/main/java/android/support/design/widget/AppBarFlingFixBehavior.java +import java.lang.reflect.Field; + +// check this https://stackoverflow.com/questions/56849221/recyclerview-fling-causes-laggy-while-appbarlayout-is-scrolling/57997489#57997489 public final class FlingBehavior extends AppBarLayout.Behavior { - private ValueAnimator mOffsetAnimator; - private static final int MAX_OFFSET_ANIMATION_DURATION = 600; // ms - - public FlingBehavior() { - } - public FlingBehavior(Context context, AttributeSet attrs) { super(context, attrs); } @Override - public void onNestedPreScroll(CoordinatorLayout coordinatorLayout, AppBarLayout child, View target, int dx, int dy, int[] consumed, int type) { - if (dy != 0) { - int val = child.getBottom(); - if (val != 0) { - int min, max; - if (dy < 0) { - // We're scrolling down - } else { - // We're scrolling up - if (mOffsetAnimator != null && mOffsetAnimator.isRunning()) { - mOffsetAnimator.cancel(); - } - min = -child.getUpNestedPreScrollRange(); - max = 0; - consumed[1] = scroll(coordinatorLayout, child, dy, min, max); - } + public boolean onInterceptTouchEvent(CoordinatorLayout parent, AppBarLayout child, MotionEvent ev) { + switch (ev.getActionMasked()) { + case MotionEvent.ACTION_DOWN: + // remove reference to old nested scrolling child + resetNestedScrollingChild(); + // Stop fling when your finger touches the screen + stopAppBarLayoutFling(); + break; + default: + break; + } + return super.onInterceptTouchEvent(parent, child, ev); + } + + @Nullable + private OverScroller getScrollerField() { + try { + Class headerBehaviorType = this.getClass().getSuperclass().getSuperclass().getSuperclass(); + if (headerBehaviorType != null) { + Field field = headerBehaviorType.getDeclaredField("scroller"); + field.setAccessible(true); + return ((OverScroller) field.get(this)); + } + } catch (NoSuchFieldException | IllegalAccessException e) { + // ? + } + return null; + } + + @Nullable + private Field getLastNestedScrollingChildRefField() { + try { + Class headerBehaviorType = this.getClass().getSuperclass().getSuperclass(); + if (headerBehaviorType != null) { + Field field = headerBehaviorType.getDeclaredField("lastNestedScrollingChildRef"); + field.setAccessible(true); + return field; + } + } catch (NoSuchFieldException e) { + // ? + } + return null; + } + + private void resetNestedScrollingChild(){ + Field field = getLastNestedScrollingChildRefField(); + if(field != null){ + try { + Object value = field.get(this); + if(value != null) field.set(this, null); + } catch (IllegalAccessException e) { + // ? } } } - @Override - public boolean onNestedPreFling(@NonNull CoordinatorLayout coordinatorLayout, @NonNull AppBarLayout child, @NonNull View target, float velocityX, float velocityY) { - - if (velocityY != 0) { - if (velocityY < 0) { - // We're flinging down - int val = child.getBottom(); - if (val != 0) { - final int targetScroll = - +child.getDownNestedPreScrollRange(); - animateOffsetTo(coordinatorLayout, child, targetScroll, velocityY); - } - - } else { - // We're flinging up - int val = child.getBottom(); - if (val != 0) { - final int targetScroll = -child.getUpNestedPreScrollRange(); - if (getTopBottomOffsetForScrollingSibling() > targetScroll) { - animateOffsetTo(coordinatorLayout, child, targetScroll, velocityY); - } - } - } - } - - return super.onNestedPreFling(coordinatorLayout, child, target, velocityX, velocityY); + private void stopAppBarLayoutFling() { + OverScroller scroller = getScrollerField(); + if (scroller != null) scroller.forceFinished(true); } - private void animateOffsetTo(final CoordinatorLayout coordinatorLayout, - final AppBarLayout child, final int offset, float velocity) { - final int distance = Math.abs(getTopBottomOffsetForScrollingSibling() - offset); - - final int duration; - velocity = Math.abs(velocity); - if (velocity > 0) { - duration = 3 * Math.round(1000 * (distance / velocity)); - } else { - final float distanceRatio = (float) distance / child.getHeight(); - duration = (int) ((distanceRatio + 1) * 150); - } - - animateOffsetWithDuration(coordinatorLayout, child, offset, duration); - } - - private void animateOffsetWithDuration(final CoordinatorLayout coordinatorLayout, - final AppBarLayout child, final int offset, final int duration) { - final int currentOffset = getTopBottomOffsetForScrollingSibling(); - if (currentOffset == offset) { - if (mOffsetAnimator != null && mOffsetAnimator.isRunning()) { - mOffsetAnimator.cancel(); - } - return; - } - - if (mOffsetAnimator == null) { - mOffsetAnimator = new ValueAnimator(); - mOffsetAnimator.setInterpolator(AnimationUtils.DECELERATE_INTERPOLATOR); - mOffsetAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { - @Override - public void onAnimationUpdate(ValueAnimator animator) { - setHeaderTopBottomOffset(coordinatorLayout, child, - (Integer) animator.getAnimatedValue()); - } - }); - } else { - mOffsetAnimator.cancel(); - } - - mOffsetAnimator.setDuration(Math.min(duration, MAX_OFFSET_ANIMATION_DURATION)); - mOffsetAnimator.setIntValues(currentOffset, offset); - mOffsetAnimator.start(); - } } \ No newline at end of file