From 1b443882968d5d26f95c7480ac06b3f0dd2097ea Mon Sep 17 00:00:00 2001 From: misakuo Date: Wed, 5 Jul 2017 18:01:14 +0800 Subject: [PATCH] + [android] add scroll event on horizontal scroller --- .../taobao/weex/ui/component/WXScroller.java | 79 +++++++++++-------- .../weex/ui/view/WXHorizontalScrollView.java | 27 +++++++ .../com/taobao/weex/ui/view/WXScrollView.java | 1 - 3 files changed, 73 insertions(+), 34 deletions(-) diff --git a/android/sdk/src/main/java/com/taobao/weex/ui/component/WXScroller.java b/android/sdk/src/main/java/com/taobao/weex/ui/component/WXScroller.java index 24e4940425..627776fe6a 100644 --- a/android/sdk/src/main/java/com/taobao/weex/ui/component/WXScroller.java +++ b/android/sdk/src/main/java/com/taobao/weex/ui/component/WXScroller.java @@ -148,48 +148,61 @@ public ViewGroup getInnerView() { @Override public void addEvent(String type) { super.addEvent(type); - if (Constants.Event.SCROLL.equals(type) && getInnerView() != null && getInnerView() instanceof WXScrollView) { - ((WXScrollView) getInnerView()).addScrollViewListener(new WXScrollViewListener() { - @Override - public void onScrollChanged(WXScrollView scrollView, int x, int y, int oldx, int oldy) { - if (shouldReport(x, y)) { - Rect frame = scrollView.getContentFrame(); + if (Constants.Event.SCROLL.equals(type) && getInnerView() != null) { + if (getInnerView() instanceof WXScrollView) { + ((WXScrollView) getInnerView()).addScrollViewListener(new WXScrollViewListener() { + @Override + public void onScrollChanged(WXScrollView scrollView, int x, int y, int oldx, int oldy) { + if (shouldReport(x, y)) { + fireScrollEvent(scrollView.getContentFrame(), x, y, oldx, oldy); + } + } - Map event = new HashMap<>(2); - Map contentSize = new HashMap<>(2); - Map contentOffset = new HashMap<>(2); + @Override + public void onScrollToBottom(WXScrollView scrollView, int x, int y) { + //ignore + } - int viewport = getInstance().getInstanceViewPortWidth(); + @Override + public void onScrollStopped(WXScrollView scrollView, int x, int y) { + //ignore + } - contentSize.put(Constants.Name.WIDTH, WXViewUtils.getWebPxByWidth(frame.width(), viewport)); - contentSize.put(Constants.Name.HEIGHT, WXViewUtils.getWebPxByWidth(frame.height(), viewport)); + @Override + public void onScroll(WXScrollView scrollView, int x, int y) { + //ignore + } + }); + } else if (getInnerView() instanceof WXHorizontalScrollView) { + ((WXHorizontalScrollView) getInnerView()).addScrollViewListener(new WXHorizontalScrollView.ScrollViewListener() { + @Override + public void onScrollChanged(WXHorizontalScrollView scrollView, int x, int y, int oldx, int oldy) { + if (shouldReport(x, y)) { + fireScrollEvent(scrollView.getContentFrame(), x, y, oldx, oldy); + } + } + }); + } + } + } - contentOffset.put(Constants.Name.X, - WXViewUtils.getWebPxByWidth(x, viewport)); - contentOffset.put(Constants.Name.Y, - WXViewUtils.getWebPxByWidth(y, viewport)); + private void fireScrollEvent(Rect contentFrame, int x, int y, int oldx, int oldy) { + Map event = new HashMap<>(2); + Map contentSize = new HashMap<>(2); + Map contentOffset = new HashMap<>(2); - event.put(Constants.Name.CONTENT_SIZE, contentSize); - event.put(Constants.Name.CONTENT_OFFSET, contentOffset); + int viewport = getInstance().getInstanceViewPortWidth(); - fireEvent(Constants.Event.SCROLL, event); - } - } + contentSize.put(Constants.Name.WIDTH, WXViewUtils.getWebPxByWidth(contentFrame.width(), viewport)); + contentSize.put(Constants.Name.HEIGHT, WXViewUtils.getWebPxByWidth(contentFrame.height(), viewport)); - @Override - public void onScrollToBottom(WXScrollView scrollView, int x, int y) { - //ignore - } + contentOffset.put(Constants.Name.X, -WXViewUtils.getWebPxByWidth(x, viewport)); + contentOffset.put(Constants.Name.Y, -WXViewUtils.getWebPxByWidth(y, viewport)); - @Override - public void onScrollStopped(WXScrollView scrollView, int x, int y) { - //ignore - } + event.put(Constants.Name.CONTENT_SIZE, contentSize); + event.put(Constants.Name.CONTENT_OFFSET, contentOffset); - @Override - public void onScroll(WXScrollView scrollView, int x, int y) { - //ignore - } - }); - } + fireEvent(Constants.Event.SCROLL, event); } private boolean shouldReport(int x, int y) { diff --git a/android/sdk/src/main/java/com/taobao/weex/ui/view/WXHorizontalScrollView.java b/android/sdk/src/main/java/com/taobao/weex/ui/view/WXHorizontalScrollView.java index f44a2245d7..d622f9145e 100644 --- a/android/sdk/src/main/java/com/taobao/weex/ui/view/WXHorizontalScrollView.java +++ b/android/sdk/src/main/java/com/taobao/weex/ui/view/WXHorizontalScrollView.java @@ -19,6 +19,7 @@ package com.taobao.weex.ui.view; import android.content.Context; +import android.graphics.Rect; import android.util.AttributeSet; import android.view.MotionEvent; import android.view.View; @@ -28,10 +29,14 @@ import com.taobao.weex.ui.view.gesture.WXGesture; import com.taobao.weex.ui.view.gesture.WXGestureObservable; +import java.util.ArrayList; +import java.util.List; + public class WXHorizontalScrollView extends HorizontalScrollView implements IWXScroller, WXGestureObservable { private WXGesture wxGesture; private ScrollViewListener mScrollViewListener; + private List mScrollViewListeners; private boolean scrollable = true; @Override @@ -60,6 +65,11 @@ protected void onScrollChanged(int l, int t, int oldl, int oldt) { if (mScrollViewListener != null) { mScrollViewListener.onScrollChanged(this, l, t, oldl, oldt); } + if (mScrollViewListeners != null) { + for (ScrollViewListener listener : mScrollViewListeners) { + listener.onScrollChanged(this, l, t, oldl, oldt); + } + } } public void setScrollViewListener(ScrollViewListener scrollViewListener) { @@ -71,6 +81,19 @@ public void destroy() { } + public void addScrollViewListener(ScrollViewListener scrollViewListener) { + if (mScrollViewListeners == null) { + mScrollViewListeners = new ArrayList<>(); + } + if (!mScrollViewListeners.contains(scrollViewListener)) { + mScrollViewListeners.add(scrollViewListener); + } + } + + public void removeScrollViewListener(ScrollViewListener scrollViewListener) { + mScrollViewListeners.remove(scrollViewListener); + } + @Override public void registerGestureListener(WXGesture wxGesture) { this.wxGesture = wxGesture; @@ -100,4 +123,8 @@ public boolean isScrollable() { public void setScrollable(boolean scrollable) { this.scrollable = scrollable; } + + public Rect getContentFrame() { + return new Rect(0, 0, computeHorizontalScrollRange(), computeVerticalScrollRange()); + } } diff --git a/android/sdk/src/main/java/com/taobao/weex/ui/view/WXScrollView.java b/android/sdk/src/main/java/com/taobao/weex/ui/view/WXScrollView.java index b6e9914211..699336c66a 100644 --- a/android/sdk/src/main/java/com/taobao/weex/ui/view/WXScrollView.java +++ b/android/sdk/src/main/java/com/taobao/weex/ui/view/WXScrollView.java @@ -42,7 +42,6 @@ import com.taobao.weex.utils.WXReflectionUtils; import java.util.ArrayList; -import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map;