Niedzielski has uploaded a new change for review. https://gerrit.wikimedia.org/r/252589
Change subject: Hygiene: refactor lead image parallax scrolling ...................................................................... Hygiene: refactor lead image parallax scrolling The parallax effect used in the lead image requires the coordination of views internal to ArticleHeaderView. Move this logic from LeadImagesHandler into ArticleHeaderView and replace MarginLayoutParams offsetting with translations which are simpler and available in all ViewGroups. Possible tangential fix for T116006. Bug: T116122 Bug: T116006 Change-Id: I4dead75193f80d1355848aba15e187f73cd301bc --- M app/src/main/java/org/wikipedia/page/leadimages/LeadImagesHandler.java M app/src/main/java/org/wikipedia/views/ArticleHeaderView.java M app/src/main/java/org/wikipedia/views/ObservableWebView.java 3 files changed, 35 insertions(+), 41 deletions(-) git pull ssh://gerrit.wikimedia.org:29418/apps/android/wikipedia refs/changes/89/252589/1 diff --git a/app/src/main/java/org/wikipedia/page/leadimages/LeadImagesHandler.java b/app/src/main/java/org/wikipedia/page/leadimages/LeadImagesHandler.java index 0c2f85d..4d23b31 100755 --- a/app/src/main/java/org/wikipedia/page/leadimages/LeadImagesHandler.java +++ b/app/src/main/java/org/wikipedia/page/leadimages/LeadImagesHandler.java @@ -90,10 +90,8 @@ private ImageViewWithFace image; private int displayHeightDp; - private int imageBaseYOffset; private float faceYOffsetNormalized; private float displayDensity; - @NonNull private final WebViewScrollListener webViewScrollListener = new WebViewScrollListener(); public LeadImagesHandler(@NonNull final PageFragment parentFragment, @NonNull CommunicationBridge bridge, @@ -293,8 +291,6 @@ // tell our listener that it's ok to start loading the rest of the WebView content listener.onLayoutComplete(sequence); - - forceRefreshWebView(); } private void setWebViewPaddingTop(int padding) { @@ -353,6 +349,7 @@ private void loadLeadImage(@Nullable String url) { if (!isMainPage() && !TextUtils.isEmpty(url) && leadImagesEnabled) { String fullUrl = WikipediaApp.getInstance().getNetworkProtocol() + ":" + url; + articleHeaderView.setImageYOffset(0); articleHeaderView.loadImage(fullUrl); } } @@ -371,12 +368,8 @@ image.startAnimation(anim); } - private void forceRefreshWebView() { - webViewScrollListener.onScrollChanged(webView.getScrollY(), webView.getScrollY()); - } - private void initWebView() { - webView.addOnScrollChangeListener(webViewScrollListener); + webView.addOnScrollChangeListener(articleHeaderView); webView.addOnClickListener(new ObservableWebView.OnClickListener() { @Override @@ -427,28 +420,6 @@ return parentFragment.getActivity(); } - private class WebViewScrollListener implements ObservableWebView.OnScrollChangeListener { - @Override - public void onScrollChanged(int oldScrollY, int scrollY) { - CoordinatorLayout.LayoutParams contParams = (CoordinatorLayout.LayoutParams) articleHeaderView - .getLayoutParams(); - FrameLayout.LayoutParams imgParams = (FrameLayout.LayoutParams) image.getLayoutParams(); - if (scrollY > articleHeaderView.getHeight()) { - if (contParams.topMargin != -articleHeaderView.getHeight()) { - contParams.topMargin = -articleHeaderView.getHeight(); - imgParams.topMargin = 0; - articleHeaderView.setLayoutParams(contParams); - image.setLayoutParams(imgParams); - } - } else { - contParams.topMargin = -scrollY; - imgParams.topMargin = imageBaseYOffset + scrollY / 2; //parallax, baby - articleHeaderView.setLayoutParams(contParams); - image.setLayoutParams(imgParams); - } - } - } - private class ImageLoadListener implements ImageViewWithFace.OnImageLoadListener { @Override public void onImageLoaded(Bitmap bitmap, @Nullable final PointF faceLocation) { @@ -476,6 +447,7 @@ // give our image an offset based on the location of the face, // relative to the image container float scale = (float) newHeight / (float) bmpHeight; + int imageBaseYOffset; if (faceLocation != null) { int faceY = (int) (faceLocation.y * scale); // if we have a face, then offset to the face location @@ -508,7 +480,7 @@ setImageLayoutParams(FrameLayout.LayoutParams.MATCH_PARENT, newHeight); } - forceRefreshWebView(); + articleHeaderView.setImageYOffset(imageBaseYOffset); // fade in the new image! ViewAnimations.crossFade(imagePlaceholder, image); diff --git a/app/src/main/java/org/wikipedia/views/ArticleHeaderView.java b/app/src/main/java/org/wikipedia/views/ArticleHeaderView.java index c898cc9..71e2d9b 100644 --- a/app/src/main/java/org/wikipedia/views/ArticleHeaderView.java +++ b/app/src/main/java/org/wikipedia/views/ArticleHeaderView.java @@ -49,7 +49,7 @@ import static org.wikipedia.util.ResourceUtil.getThemedAttributeId; -public class ArticleHeaderView extends FrameLayout { +public class ArticleHeaderView extends FrameLayout implements ObservableWebView.OnScrollChangeListener { @Bind(R.id.image) ImageViewWithFace image; @Bind(R.id.placeholder) ImageView placeholder; @Bind(R.id.text) AppTextView text; @@ -57,6 +57,8 @@ @NonNull private CharSequence title = ""; @NonNull private CharSequence subtitle = ""; @Nullable private String pronunciationUrl; + + private int imageYOffset; @NonNull private final AvPlayer avPlayer = new DefaultAvPlayer(new MediaPlayerImplementation()); @@ -146,6 +148,11 @@ return returnedBitmap; } + public void setImageYOffset(int offset) { + imageYOffset = offset; + updateParallaxScroll(); + } + // TODO: remove. public ImageView getPlaceholder() { return placeholder; @@ -199,6 +206,11 @@ } @Override + public void onScrollChanged(int oldScrollY, int scrollY) { + updateParallaxScroll(scrollY); + } + + @Override protected void onAttachedToWindow() { super.onAttachedToWindow(); avPlayer.init(); @@ -208,6 +220,16 @@ protected void onDetachedFromWindow() { super.onDetachedFromWindow(); avPlayer.deinit(); + } + + private void updateParallaxScroll() { + updateParallaxScroll((int) -getTranslationY()); + } + + private void updateParallaxScroll(int scrollY) { + int offset = Math.min(getHeight(), scrollY); + setTranslationY(-offset); + image.setTranslationY(imageYOffset + offset / 2); } private void updateText() { @@ -242,13 +264,13 @@ final float leadingScalar = DimenUtil.getFloat(R.dimen.lead_subtitle_leading_scalar); final float paragraphScalar = DimenUtil.getFloat(R.dimen.lead_subtitle_paragraph_scalar); return RichTextUtil.setSpans(new SpannableString(subtitle), - 0, - subtitle.length(), - Spannable.SPAN_INCLUSIVE_EXCLUSIVE, - new AbsoluteSizeSpan(getDimensionPixelSize(R.dimen.descriptionTextSize), - false), - new LeadingSpan(leadingScalar), - new ParagraphSpan(paragraphScalar)); + 0, + subtitle.length(), + Spannable.SPAN_INCLUSIVE_EXCLUSIVE, + new AbsoluteSizeSpan(getDimensionPixelSize(R.dimen.descriptionTextSize), + false), + new LeadingSpan(leadingScalar), + new ParagraphSpan(paragraphScalar)); } private void setTextDropShadow() { diff --git a/app/src/main/java/org/wikipedia/views/ObservableWebView.java b/app/src/main/java/org/wikipedia/views/ObservableWebView.java index 7197b6b..98be260 100755 --- a/app/src/main/java/org/wikipedia/views/ObservableWebView.java +++ b/app/src/main/java/org/wikipedia/views/ObservableWebView.java @@ -80,7 +80,7 @@ void onScrollChanged(int oldScrollY, int scrollY); } - public interface OnDownMotionEventListener { + public interface OnDownMotionEventListener { void onDownMotionEvent(); } -- To view, visit https://gerrit.wikimedia.org/r/252589 To unsubscribe, visit https://gerrit.wikimedia.org/r/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I4dead75193f80d1355848aba15e187f73cd301bc Gerrit-PatchSet: 1 Gerrit-Project: apps/android/wikipedia Gerrit-Branch: master Gerrit-Owner: Niedzielski <sniedziel...@wikimedia.org> _______________________________________________ MediaWiki-commits mailing list MediaWiki-commits@lists.wikimedia.org https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits