From 666998d3a66d7fd0a3269ece3911e77950b23237 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E5=8A=B2=E9=B9=8F?= Date: Mon, 5 Jul 2021 12:05:35 +0800 Subject: [PATCH] fix wrong page slided index --- .../pub/doric/shader/slider/SliderNode.java | 26 +++++- doric-demo/src/SliderDemo.ts | 91 ++++++++++++++++++- .../Pod/Classes/Shader/DoricSliderNode.m | 35 ++++++- 3 files changed, 143 insertions(+), 9 deletions(-) diff --git a/doric-android/doric/src/main/java/pub/doric/shader/slider/SliderNode.java b/doric-android/doric/src/main/java/pub/doric/shader/slider/SliderNode.java index 70919521..ec663647 100644 --- a/doric-android/doric/src/main/java/pub/doric/shader/slider/SliderNode.java +++ b/doric-android/doric/src/main/java/pub/doric/shader/slider/SliderNode.java @@ -81,8 +81,14 @@ public class SliderNode extends SuperNode { if (slideAdapter.loop) { if (position == 0) { recyclerView.scrollToPosition(slideAdapter.itemCount); + + position = slideAdapter.itemCount - 1; } else if (position == slideAdapter.itemCount + 1) { recyclerView.scrollToPosition(1); + + position = 0; + } else { + position = position - 1; } } @@ -202,9 +208,18 @@ public class SliderNode extends SuperNode { int page = params.getProperty("page").asNumber().toInt(); boolean smooth = params.getProperty("smooth").asBoolean().value(); if (smooth) { - mView.smoothScrollToPosition(page); + if (slideAdapter.loop) { + mView.smoothScrollToPosition(page + 1); + } else { + mView.smoothScrollToPosition(page); + } + } else { - mView.scrollToPosition(page); + if (slideAdapter.loop) { + mView.scrollToPosition(page + 1); + } else { + mView.scrollToPosition(page); + } } if (!TextUtils.isEmpty(onPageSlidedFuncId)) { callJSResponse(onPageSlidedFuncId, page); @@ -216,6 +231,11 @@ public class SliderNode extends SuperNode { @DoricMethod public int getSlidedPage() { LinearLayoutManager linearLayoutManager = (LinearLayoutManager) mView.getLayoutManager(); - return linearLayoutManager != null ? linearLayoutManager.findFirstVisibleItemPosition() : 0; + int pageIndex = linearLayoutManager != null ? linearLayoutManager.findFirstVisibleItemPosition() : 0; + if (slideAdapter.loop) { + return pageIndex - 1; + } else { + return pageIndex; + } } } diff --git a/doric-demo/src/SliderDemo.ts b/doric-demo/src/SliderDemo.ts index c2162e9d..67424e7f 100644 --- a/doric-demo/src/SliderDemo.ts +++ b/doric-demo/src/SliderDemo.ts @@ -1,4 +1,4 @@ -import { Group, Panel, text, gravity, Gravity, Color, LayoutSpec, vlayout, slider, slideItem, image, layoutConfig, ScaleType, switchView, hlayout } from "doric"; +import { Group, Panel, text, gravity, Gravity, Color, LayoutSpec, vlayout, slider, slideItem, image, layoutConfig, ScaleType, switchView, hlayout, modal, input, stack, InputType } from "doric"; import { colors } from "./utils"; const imageUrls = [ @@ -11,6 +11,13 @@ const imageUrls = [ 'http://calonye.com/wp-content/uploads/2015/08/0-wx_fmtgiftpwebpwxfrom5wx_lazy1-9.gif', 'http://hbimg.b0.upaiyun.com/ca29ea125b7f2d580f573e48eb594b1ef509757f34a08-m0hK45_fw658', 'https://misc.aotu.io/ONE-SUNDAY/SteamEngine.png', + 'http://b.hiphotos.baidu.com/image/pic/item/908fa0ec08fa513db777cf78376d55fbb3fbd9b3.jpg', + 'http://f.hiphotos.baidu.com/image/pic/item/0e2442a7d933c8956c0e8eeadb1373f08202002a.jpg', + 'http://f.hiphotos.baidu.com/image/pic/item/b151f8198618367aa7f3cc7424738bd4b31ce525.jpg', + 'http://b.hiphotos.baidu.com/image/pic/item/0eb30f2442a7d9337119f7dba74bd11372f001e0.jpg', + 'http://a.hiphotos.baidu.com/image/h%3D300/sign=b38f3fc35b0fd9f9bf175369152cd42b/9a504fc2d5628535bdaac29e9aef76c6a6ef63c2.jpg', + 'http://h.hiphotos.baidu.com/image/pic/item/810a19d8bc3eb1354c94a704ac1ea8d3fd1f4439.jpg', + 'http://calonye.com/wp-content/uploads/2015/08/0-wx_fmtgiftpwebpwxfrom5wx_lazy1-9.gif', ] @Entry class SliderPanel extends Panel { @@ -29,11 +36,30 @@ class SliderPanel extends Panel { } }) }, + loop: true, layoutConfig: { widthSpec: LayoutSpec.MOST, heightSpec: LayoutSpec.MOST, weight: 1, }, + onPageSlided: (index) => { + modal(context).toast(index.toString()) + } + }) + + let pageIndexInput = input({ + backgroundColor: Color.WHITE, + layoutConfig: { + widthSpec: LayoutSpec.FIT, + heightSpec: LayoutSpec.FIT, + }, + hintText: "Page index", + inputType: InputType.Number, + textAlignment: Gravity.Center, + border: { + width: 1, + color: Color.GRAY, + }, }) rootView.addChild(vlayout([ @@ -62,7 +88,7 @@ class SliderPanel extends Panel { height: 50, }), switchView({ - state: false, + state: true, onSwitch: (state) => { pager.loop = state }, @@ -97,6 +123,67 @@ class SliderPanel extends Panel { space: 10, backgroundColor: Color.RED, }), + hlayout([ + text({ + text: "Slide to page", + layoutConfig: { + widthSpec: LayoutSpec.FIT, + heightSpec: LayoutSpec.JUST, + }, + textSize: 20, + textColor: Color.BLACK, + textAlignment: gravity().center(), + height: 50, + }), + pageIndexInput, + text({ + text: "Go!", + layoutConfig: { + widthSpec: LayoutSpec.FIT, + heightSpec: LayoutSpec.JUST, + }, + padding: { + left: 10, + right: 10 + }, + textSize: 20, + textColor: Color.BLACK, + backgroundColor: Color.WHITE, + textAlignment: gravity().center(), + height: 40, + onClick: async () => { + let index = await pageIndexInput.getText(context); + await pager.slidePage(context, parseInt(index), true) + } + }), + ], { + layoutConfig: layoutConfig().most().configHeight(LayoutSpec.FIT), + gravity: gravity().center(), + space: 10, + backgroundColor: Color.RED, + }), + hlayout([ + text({ + text: "getSlidedPage", + layoutConfig: { + widthSpec: LayoutSpec.FIT, + heightSpec: LayoutSpec.JUST, + }, + textSize: 20, + textColor: Color.BLACK, + textAlignment: gravity().center(), + height: 50, + onClick: async () => { + let index = await pager.getSlidedPage(context); + modal(context).toast(index.toString()) + } + }), + ], { + layoutConfig: layoutConfig().most().configHeight(LayoutSpec.FIT), + gravity: gravity().center(), + space: 10, + backgroundColor: Color.RED, + }), pager, ]).also(it => { it.layoutConfig = { diff --git a/doric-iOS/Pod/Classes/Shader/DoricSliderNode.m b/doric-iOS/Pod/Classes/Shader/DoricSliderNode.m index dcbc1c7d..3e3ddcae 100644 --- a/doric-iOS/Pod/Classes/Shader/DoricSliderNode.m +++ b/doric-iOS/Pod/Classes/Shader/DoricSliderNode.m @@ -96,9 +96,22 @@ - (void)blendView:(UICollectionView *)view forPropName:(NSString *)name propValu self.onPageSelectedFuncId = prop; } else if ([@"loop" isEqualToString:name]) { self.loop = [prop boolValue]; + + __weak typeof(self) _self = self; if (self.loop) { - [self.view reloadData]; - [self.view setContentOffset:CGPointMake(1 * self.view.width, self.view.contentOffset.y) animated:false]; + dispatch_async(dispatch_get_main_queue(), ^{ + __strong typeof(_self) self = _self; + + [self.view reloadData]; + [self.view setContentOffset:CGPointMake(1 * self.view.width, self.view.contentOffset.y) animated:false]; + }); + } else { + dispatch_async(dispatch_get_main_queue(), ^{ + __strong typeof(_self) self = _self; + + [self.view reloadData]; + [self.view setContentOffset:CGPointMake(0, self.view.contentOffset.y) animated:false]; + }); } } else if ([@"bounces" isEqualToString:name]) { self.view.bounces = [prop boolValue]; @@ -226,8 +239,12 @@ - (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView { if (self.loop) { if (pageIndex == 0) { [self.view setContentOffset:CGPointMake(self.itemCount * self.view.width, self.view.contentOffset.y) animated:false]; + pageIndex = self.itemCount - 1; } else if (pageIndex == self.itemCount + 1) { [self.view setContentOffset:CGPointMake(1 * self.view.width, self.view.contentOffset.y) animated:false]; + pageIndex = 0; + } else { + pageIndex = pageIndex - 1; } } @@ -242,7 +259,13 @@ - (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView { - (void)slidePage:(NSDictionary *)params withPromise:(DoricPromise *)promise { NSUInteger pageIndex = [params[@"page"] unsignedIntegerValue]; BOOL smooth = [params[@"smooth"] boolValue]; - [self.view setContentOffset:CGPointMake(pageIndex * self.view.width, self.view.contentOffset.y) animated:smooth]; + + if (self.loop) { + [self.view setContentOffset:CGPointMake((pageIndex + 1) * self.view.width, self.view.contentOffset.y) animated:smooth]; + } else { + [self.view setContentOffset:CGPointMake(pageIndex * self.view.width, self.view.contentOffset.y) animated:smooth]; + } + [promise resolve:nil]; self.lastPosition = pageIndex; if (self.onPageSelectedFuncId && self.onPageSelectedFuncId.length > 0) { @@ -252,7 +275,11 @@ - (void)slidePage:(NSDictionary *)params withPromise:(DoricPromise *)promise { - (NSNumber *)getSlidedPage { NSUInteger pageIndex = (NSUInteger) (self.view.contentOffset.x / self.view.width); - return @(pageIndex); + if (self.loop) { + return @(pageIndex - 1); + } else { + return @(pageIndex); + } } @end