feat: add observeScrollingInterval in coordinator plugin
This commit is contained in:
		| @@ -18,10 +18,14 @@ package pub.doric.plugin; | ||||
| import android.graphics.Color; | ||||
| import android.view.View; | ||||
|  | ||||
| import com.github.pengfeizhou.jscore.JSArray; | ||||
| import com.github.pengfeizhou.jscore.JSNumber; | ||||
| import com.github.pengfeizhou.jscore.JSObject; | ||||
| import com.github.pengfeizhou.jscore.JSValue; | ||||
| import com.github.pengfeizhou.jscore.JavaValue; | ||||
|  | ||||
| import java.util.ArrayList; | ||||
| import java.util.List; | ||||
| import java.util.concurrent.Callable; | ||||
|  | ||||
| import pub.doric.DoricContext; | ||||
| @@ -173,4 +177,86 @@ public class CoordinatorPlugin extends DoricJavaPlugin { | ||||
|             viewNode.blend(jsObject); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|  | ||||
|     @DoricMethod(thread = ThreadMode.UI) | ||||
|     public void observeScrollingInterval(final JSObject argument, final DoricPromise doricPromise) { | ||||
|         getDoricContext().getDriver().asyncCall(new Callable<Object>() { | ||||
|             @Override | ||||
|             public Object call() throws Exception { | ||||
|                 JSValue[] scrollableIds = argument.getProperty("scrollable").asArray().toArray(); | ||||
|                 ViewNode<?> scrollNode = null; | ||||
|                 for (JSValue value : scrollableIds) { | ||||
|                     if (scrollNode == null) { | ||||
|                         scrollNode = getDoricContext().targetViewNode(value.asString().value()); | ||||
|                     } else { | ||||
|                         if (value.isString() && scrollNode instanceof SuperNode) { | ||||
|                             String viewId = value.asString().value(); | ||||
|                             scrollNode = ((SuperNode<?>) scrollNode).getSubNodeById(viewId); | ||||
|                         } | ||||
|                     } | ||||
|                 } | ||||
|                 if (scrollNode == null) { | ||||
|                     throw new Exception("Cannot find scrollable view"); | ||||
|                 } | ||||
|                 String callbackId = argument.getProperty("onScrolledInterval").asString().value(); | ||||
|                 final DoricPromise currentPromise = new DoricPromise(getDoricContext(), callbackId); | ||||
|                 JSArray observingInterval = argument.getProperty("observingInterval").asArray(); | ||||
|                 final List<Float> interval = new ArrayList<>(); | ||||
|                 for (int i = 0; i < observingInterval.size(); i++) { | ||||
|                     interval.add(observingInterval.get(i).asNumber().toFloat()); | ||||
|                 } | ||||
|  | ||||
|                 JSValue inclusive = argument.getProperty("inclusive"); | ||||
|  | ||||
|                 final boolean leftInclusive = inclusive.isString() && "Left".equals(inclusive.asString().value()); | ||||
|  | ||||
|                 final ViewNode<?> finalScrollNode = scrollNode; | ||||
|                 final int[] rangeIdx = {0}; | ||||
|                 if (finalScrollNode instanceof IDoricScrollable) { | ||||
|                     ((IDoricScrollable) finalScrollNode).addScrollChangeListener(new DoricScrollChangeListener() { | ||||
|                         @Override | ||||
|                         public void onScrollChange(View v, int scrollX, int scrollY, int oldScrollX, int oldScrollY) { | ||||
|                             int currentRangeIdx = interval.size(); | ||||
|                             for (int i = 0; i < interval.size(); i++) { | ||||
|                                 if (leftInclusive) { | ||||
|                                     if (scrollY < interval.get(i)) { | ||||
|                                         currentRangeIdx = i; | ||||
|                                         break; | ||||
|                                     } | ||||
|                                 } else { | ||||
|                                     if (scrollY <= interval.get(i)) { | ||||
|                                         currentRangeIdx = i; | ||||
|                                         break; | ||||
|                                     } | ||||
|                                 } | ||||
|                             } | ||||
|                             if (rangeIdx[0] != currentRangeIdx) { | ||||
|                                 rangeIdx[0] = currentRangeIdx; | ||||
|                                 currentPromise.resolve(new JavaValue(rangeIdx[0])); | ||||
|                             } | ||||
|                         } | ||||
|                     }); | ||||
|                     return null; | ||||
|                 } else { | ||||
|                     throw new Exception("Scroller type error"); | ||||
|                 } | ||||
|             } | ||||
|         }, ThreadMode.UI).setCallback(new AsyncResult.Callback<Object>() { | ||||
|             @Override | ||||
|             public void onResult(Object result) { | ||||
|                 doricPromise.resolve(); | ||||
|             } | ||||
|  | ||||
|             @Override | ||||
|             public void onError(Throwable t) { | ||||
|                 doricPromise.reject(); | ||||
|             } | ||||
|  | ||||
|             @Override | ||||
|             public void onFinish() { | ||||
|  | ||||
|             } | ||||
|         }); | ||||
|     } | ||||
| } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user