jenkins-bot has submitted this change and it was merged.
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(-)
Approvals:
Dbrant: Looks good to me, approved
jenkins-bot: Verified
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: merged
Gerrit-Change-Id: I4dead75193f80d1355848aba15e187f73cd301bc
Gerrit-PatchSet: 1
Gerrit-Project: apps/android/wikipedia
Gerrit-Branch: master
Gerrit-Owner: Niedzielski <[email protected]>
Gerrit-Reviewer: BearND <[email protected]>
Gerrit-Reviewer: Brion VIBBER <[email protected]>
Gerrit-Reviewer: Dbrant <[email protected]>
Gerrit-Reviewer: Mholloway <[email protected]>
Gerrit-Reviewer: jenkins-bot <>
_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits