diff --git a/README.md b/README.md index c9d9abffab9317778b47011dc8b1750bf7a0879e..4d3a4b875092bb5f84881f3bcb80a570721e8505 100644 --- a/README.md +++ b/README.md @@ -22,10 +22,15 @@ ohpm install @ohos/pulltorefresh ### 快速使用 ```typescript -import { RefreshList } from '@ohos/pulltorefresh' - - - +import { RefreshList,RefreshGrid,RefreshScroll,RefreshWaterFlow, PullToRefreshConfigurator } from '@ohos/pulltorefresh' + +//动态添加list组件的属性 +class MyListModifier implements AttributeModifier { + applyNormalAttribute(instance: ListAttribute): void { + instance.divider({ strokeWidth: 1, color: 0x222222 }); + } +} +//RefreshGrid,RefreshScroll,RefreshWaterFlow组件参考如下RefreshList RefreshList({ // 必传项,列表组件所绑定的数据 data: $data, @@ -62,7 +67,7 @@ customLoad: null, customRefresh: null, }) ``` -其中List组件需要设置edgeEffect属性为(EdgeEffect.None) +以上系统组件的属性和方法的设置请参考[动态属性设置](https://gitee.com/openharmony/docs/blob/master/zh-cn/application-dev/reference/apis-arkui/arkui-ts/ts-universal-attributes-attribute-modifier.md) 设置属性示例和设置自定义动画示例请看[示例entry](https://gitee.com/openharmony-sig/PullToRefresh/tree/3.x/entry/src/main/ets/pages) ### 支持lazyForEarch的数据作为数据源 @@ -99,50 +104,53 @@ interface DataChangeListener { ### PullToRefresh组件属性 -| 属性 | 类型 | 释义 | 默认值 | -| :------------------:| :-------------------------------------------------------------: |:------------------:| :----------------------------: | -| data | Object[] | 列表或宫格组件所绑定的数据 | undefined | -| modifier | AttributeModifier | 动态修改组件的属性 | undefined | -| customList | ```() => void ``` | 自定义主体布局,内部有列表或宫格组件 | undefined | +| 属性 | 类型 | 释义 | 默认值 | +|:-------------------:| :-------------------------------------------------------------: |:------------------:| :----------------------------: | +| data | Object[] | 列表或宫格组件所绑定的数据 | undefined | +| modifier | AttributeModifier | 动态修改组件的属性 | undefined | +| customList | ```() => void ``` | 自定义主体布局,内部有列表或宫格组件 | undefined | | refreshConfigurator | PullToRefreshConfigurator | 组件属性配置 | PullToRefreshConfigurator | -| refreshOffset | Length | 触发下拉刷新的偏移量 | undefined | -| refreshOpacity | scale | 下拉刷新背景图的透明度 | undefined | -| onRefresh | ```() => Promise``` | 下拉刷新回调 | 1秒后结束下拉刷新动画并提示“刷新失败” | -| onLoadMore | ```() => Promise``` | 上拉加载更多回调 | 1秒后结束上拉加载动画 | -| customRefresh | ```() => void ``` | 自定义下拉刷新动画布局 | undefined | -| onAnimPullDown | ```(value?: number, width?: number, height?: number) => void``` | 下拉中回调 | undefined | -| onAnimRefreshing | ```(value?: number, width?: number, height?: number) => void``` | 刷新中回调 | undefined | -| customLoad | ```() => void``` | 自定义上拉加载动画布局 | undefined | -| onAnimPullUp | ```(value?: number, width?: number, height?: number) => void``` | 上拉中回调 | undefined | -| onAnimLoading | ```(value?: number, width?: number, height?: number) => void``` | 加载中回调 | undefined | +| refreshHeight | Length | 触发下拉刷新的偏移量 | undefined | +| refreshOpacity | scale | 下拉刷新背景图的透明度 | undefined | +| loadOpacity | scale | 上拉加载背景图的透明度 | undefined | +| onRefresh | ```() => Promise``` | 下拉刷新回调 | 1秒后结束下拉刷新动画并提示“刷新失败” | +| onLoadMore | ```() => Promise``` | 上拉加载更多回调 | 1秒后结束上拉加载动画 | +| customRefresh | ```() => void ``` | 自定义下拉刷新动画布局 | undefined | +| onAnimPullDown | ```(value?: number, width?: number, height?: number) => void``` | 下拉中回调 | undefined | +| onAnimRefreshing | ```(value?: number, width?: number, height?: number) => void``` | 刷新中回调 | undefined | +| customLoad | ```() => void``` | 自定义上拉加载动画布局 | undefined | +| onRefreshSpringBack | ```(value?: number, height?: number) => void``` | 回弹的回调 | undefined | +| refreshing | boolean | 控制是否进行下拉刷新 | undefined | ### PullToRefreshConfigurator类接口 -| 接口 | 参数类型 | 释义 | 默认值 | -| :------------------------:| :-------------------------: | :-----------------------: | :--------------: | -| setHasRefresh | boolean | 是否具有下拉刷新功能 | true | -| setHasLoadMore | boolean | 是否具有上拉加载功能 | true | -| setRefreshHeight | number | 下拉动画高度 | 30 | -| setRefreshColor | string | 下拉动画颜色 | '#999999' | -| setRefreshBackgroundColor | ResourceColor | 下拉动画区域背景色 | 'rgba(0,0,0,0)' | -| setRefreshTextColor | ResourceColor | 下拉加载完毕后提示文本的字体颜色 | '#999999' | -| setRefreshTextSize | number 或 string 或 Resource | 下拉加载完毕后提示文本的字体大小 | 18 | -| setRefreshAnimDuration | number | 下拉动画执行一次的时间 | 1000 | -| setLoadImageHeight | number | 上拉动画中图片的高度 | 64 | -| setLoadBackgroundColor | ResourceColor | 上拉动画区域背景色 | 'rgba(0,0,0,0)' | -| setLoadTextColor | ResourceColor | 上拉文本的字体颜色 | '#999999' | -| setLoadTextSize | number 或 string 或 Resource | 上拉文本的字体大小 | 18 | -| setSubjectContentBackgroundColor | ResourceColor | 主体内容背景色 | '#eeeeee' | -| setListSpace | number | list组件子组件主轴方向的间隔 | 0 | -| setLoadTextLoading | string | 上拉加载更多中时的文本 | '正在玩命加载中...' | -| setListInitialIndex | number | list组件设置当前List初次加载时视口起始位置显示的item的索引值 | 0 | +| 接口 | 参数类型 | 释义 | 默认值 | +| :------------------------:| :-------------------------: |:------------------------------------:| :--------------: | +| setHasRefresh | boolean | 是否具有下拉刷新功能 | true | +| setHasLoadMore | boolean | 是否具有上拉加载功能 | true | +| setRefreshHeight | number | 下拉动画高度 | 30 | +| setRefreshColor | string | 下拉动画颜色 | '#999999' | +| setRefreshBackgroundColor | ResourceColor | 下拉动画区域背景色 | '' | +| setRefreshBackgroundImage | ResourceColor | 下拉刷新动画部分的背景 | 'rgba(0,0,0,0)' | +| setRefreshTextColor | ResourceColor | 下拉加载完毕后提示文本的字体颜色 | '#999999' | +| setRefreshTextSize | number 或 string 或 Resource | 下拉加载完毕后提示文本的字体大小 | 18 | +| setRefreshAnimDuration | number | 下拉动画执行一次的时间(自定义动画的回调函数才会触发) | 1000 | +| setRefreshOpacity | number | 下拉刷新背景图的透明度 | 0.5 | +| setLoadImageHeight | number | 上拉动画中图片的高度 | 64 | +| setLoadBackgroundColor | ResourceColor | 上拉加载动画部分的背景 | '' | +| setLoadBackgroundImage | ResourceColor | 上拉动画区域背景色 | 'rgba(0,0,0,0)' | +| setLoadTextColor | ResourceColor | 上拉文本的字体颜色 | '#999999' | +| setLoadTextSize | number 或 string 或 Resource | 上拉文本的字体大小 | 18 | +| setLoadOpacity | number | 上拉背景图的透明度 | 0.5 | +| setSubjectContentBackgroundColor | ResourceColor | 主体内容背景色 | '#eeeeee' | +| setListSpace | number | list组件子组件主轴方向的间隔 | 0 | +| setLoadTextLoading | string | 上拉加载更多中时的文本 | '正在玩命加载中...' | +| setFullScreen | boolean | list組件全屏参数 | false | +| setListInitialIndex | number | list组件设置当前List初次加载时视口起始位置显示的item的索引值 | 0 | ## 约束与限制 在下述版本验证通过: - DevEco Studio 5.0 Canary3(5.0.3.300)--SDK:API12 -- DevEco Studio: 4.1 Canary(4.1.3.317), SDK: API11 (4.1.0.36) -- DevEco Studio: 4.0 (4.0.3.512), SDK: API10 (4.0.10.9) -- DevEco Studio: 4.0 Canary2(4.0.3.300), SDK: API10 (4.0.8.6) ## 贡献代码 diff --git a/entry/src/main/ets/pages/customConfig.ets b/entry/src/main/ets/pages/customConfig.ets index 427244fdd9749a0a46d906f290651e73a7a97fb1..c26baff72c1e8fe145cadb491993b0eeb0c8684e 100644 --- a/entry/src/main/ets/pages/customConfig.ets +++ b/entry/src/main/ets/pages/customConfig.ets @@ -39,12 +39,12 @@ struct Index { .setHasRefresh(true)//是否具有下拉刷新功能 .setHasLoadMore(true)// 是否具有上拉加载功能 .setListSpace(20)//list组件子组件主轴方向的间隔 - .setRefreshBackgroundImage($r("app.media.icon_loading_right"))// 下拉刷新动画部分的背景 - .setLoadBackgroundImage($r("app.media.icon_loading_left"))//// 上拉加载动画部分的背景 + .setRefreshBackgroundImage($r("app.media.flower"))// 下拉刷新动画部分的背景 + .setLoadBackgroundImage($r("app.media.flower"))//// 上拉加载动画部分的背景 .setListInitialIndex(0)// list组件设置当前List初次加载时视口起始位置显示的item的索引值 .setRefreshOpacity(0.5)// 下拉刷新背景图的透明度 .setRefreshBackgroundColor('#ffbbfaf5')// 下拉动画区域背景色 - .setSubjectContentBackgroundColor('#ffbbfaf5')// 主体内容背景颜色 + .setSubjectContentBackgroundColor(Color.White)// 主体内容背景颜色 .setLoadBackgroundColor('#ffbbfaf5')//// 上拉动画区域背景色 .setLoadImageHeight(100)// 上拉图片高度 .setLoadTextColor(Color.Blue)// 上拉文本的字体颜色 @@ -61,7 +61,7 @@ struct Index { data: $data, //必传项,控制是否进行下拉刷新 refreshing: $refreshing, - // // 必传项,需绑定传入主体布局内的列表或宫格组件 + // 必传项,需绑定传入主体布局内的列表或宫格组件 customList: () => { // 一个用@Builder修饰过的UI方法 this.getListView(); @@ -89,7 +89,6 @@ struct Index { for (let index = 0; index < 10; index++) { this.data.push("增加的条目" + this.data.length); } - }, 1000); }); }, diff --git a/entry/src/main/ets/pages/customRefreshAnim.ets b/entry/src/main/ets/pages/customRefreshAnim.ets index 0766b248c60cec7de0d38d9e66a81604691aeb90..dd499a5d719e1344ebf93e1d8a21b39dd6d8b1bb 100644 --- a/entry/src/main/ets/pages/customRefreshAnim.ets +++ b/entry/src/main/ets/pages/customRefreshAnim.ets @@ -12,7 +12,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import { RefreshList, PullToRefreshConfigurator } from '@ohos/pulltorefresh' +import { RefreshList } from '@ohos/pulltorefresh' const pointSpace = 30; const pointJitterAmplitude = 10; @@ -31,7 +31,6 @@ struct Index { private dataNumbers: string[] = ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10']; private dataStrings: string[] = ['我的评论', '与我相关', '个人中心1', '个人中心2', '个人中心3', '我的发布', '设置', '退出登录']; @State data: string[] = this.dataStrings; - private refreshConfigurator: PullToRefreshConfigurator = new PullToRefreshConfigurator(); @State modifier: MyListModifier = new MyListModifier(); //自定义动画 private canvasSetting: RenderingContextSettings = new RenderingContextSettings(true); @@ -40,12 +39,6 @@ struct Index { private value2: number[] = []; private timer: null | number = null; - aboutToAppear() { - - this.refreshConfigurator.setRefreshAnimDuration(600) // 下拉动画执行一次的时间 - - } - build() { Column() { RefreshList({ @@ -53,7 +46,6 @@ struct Index { data: $data, //必传项,控制是否进行下拉刷新 refreshing: $refreshing, - // 必传项,需绑定传入主体布局内的列表或宫格组件的item customList: () => { // 一个用@Builder修饰过的UI方法 @@ -61,8 +53,6 @@ struct Index { }, //可选项,属性方法修改时触发 modifier: this.modifier, - // 可选项,组件属性配置,具有默认值 - refreshConfigurator: this.refreshConfigurator, // 可选项,下拉刷新回调 onRefresh: () => { return new Promise((resolve, reject) => { @@ -73,14 +63,10 @@ struct Index { }, 1000); }); }, - //可选项,下拉刷新后回弹的回调 - onRefreshSpringBack: () => { - //回弹后的操作 - }, // 可选项,上拉加载更多回调 onLoadMore: () => { return new Promise((resolve, reject) => { - // 模拟网络请求操作,请求网络2秒后得到数据,通知组件,变更列表数据 + // 模拟网络请求操作,请求网络1秒后得到数据,通知组件,变更列表数据 this.timer = setTimeout(() => { resolve(''); for (let index = 0; index < 10; index++) { diff --git a/entry/src/main/ets/pages/fullScreen.ets b/entry/src/main/ets/pages/fullScreen.ets index 900b859ff916558f830b720db27080252bbf41aa..86a1af34675a8298959646b0ddcdb60b2a560326 100644 --- a/entry/src/main/ets/pages/fullScreen.ets +++ b/entry/src/main/ets/pages/fullScreen.ets @@ -33,6 +33,7 @@ struct Index { private refreshConfigurator: PullToRefreshConfigurator = new PullToRefreshConfigurator(); @State modifier: MyListModifier = new MyListModifier(); private timer: null | number = null; + aboutToAppear() { this.refreshConfigurator.setFullScreen(true) } @@ -65,13 +66,12 @@ struct Index { // 可选项,上拉加载更多回调 onLoadMore: () => { return new Promise((resolve, reject) => { - // 模拟网络请求操作,请求网络2秒后得到数据,通知组件,变更列表数据 + // 模拟网络请求操作,请求网络1秒后得到数据,通知组件,变更列表数据 this.timer = setTimeout(() => { resolve(''); for (let index = 0; index < 10; index++) { this.data.push("增加的条目" + this.data.length); } - }, 1000); }); }, diff --git a/entry/src/main/ets/pages/gridTestPage.ets b/entry/src/main/ets/pages/gridTestPage.ets index 9f826704bc78108d338db0c90c50e7791ff2a393..a04f26e2dc01debec5ea5dc9aa42fc940a08e661 100644 --- a/entry/src/main/ets/pages/gridTestPage.ets +++ b/entry/src/main/ets/pages/gridTestPage.ets @@ -12,7 +12,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import { RefreshGrid, PullToRefreshConfigurator } from '@ohos/pulltorefresh' +import { RefreshGrid } from '@ohos/pulltorefresh' //动态添加list组件的属性 class MyGridModifier implements AttributeModifier { @@ -33,7 +33,6 @@ struct Index { @State data: string[] = this.dataStrings; private modifier: MyGridModifier = new MyGridModifier(); private timer: null | number = null; - private refreshConfigurator: PullToRefreshConfigurator = new PullToRefreshConfigurator(); @State layoutOptions: GridLayoutOptions = { regularSize: [1, 1], irregularIndexes: [0, 6, this.data.length * this.data.length], //索引为0和6的GridItem占用一行 @@ -47,19 +46,17 @@ struct Index { data: $data, //必传项,控制是否进行下拉刷新 refreshing: $refreshing, - // // 必传项,需绑定传入主体布局内的列表或宫格组件 + // 必传项,需绑定传入主体布局内的列表或宫格组件 customList: () => { // 一个用@Builder修饰过的UI方法 this.getListView(); }, - // 可选项,组件属性配置,具有默认值 - refreshConfigurator: this.refreshConfigurator, //可选项,属性方法修改时触发 modifier: this.modifier, //可选项,下拉刷新回调 onRefresh: () => { return new Promise((resolve, reject) => { - // 模拟网络请求操作,请求网络2秒后得到数据,通知组件,变更列表数据 + // 模拟网络请求操作,请求网络1秒后得到数据,通知组件,变更列表数据 setTimeout(() => { resolve('刷新成功'); this.data = [...this.dataNumbers]; @@ -69,13 +66,12 @@ struct Index { // 可选项,上拉加载更多回调 onLoadMore: () => { return new Promise((resolve, reject) => { - // 模拟网络请求操作,请求网络2秒后得到数据,通知组件,变更列表数据 + // 模拟网络请求操作,请求网络1秒后得到数据,通知组件,变更列表数据 setTimeout(() => { resolve(''); for (let index = 0; index < 10; index++) { this.data.push("增加的条目" + this.data.length); } - }, 1000); }); }, diff --git a/entry/src/main/ets/pages/index.ets b/entry/src/main/ets/pages/index.ets index 8d697a3fdc0852df50aaae9f5582202afbbf3168..9699ef978b5bb569a68f3fded4201382af4de26d 100644 --- a/entry/src/main/ets/pages/index.ets +++ b/entry/src/main/ets/pages/index.ets @@ -23,11 +23,6 @@ struct Index { .onClick(() => { router.push({ url: 'pages/quickStart' }) }) - Button('回弹的回调函数') - .margin({ top: 10 }) - .onClick(() => { - router.push({ url: 'pages/testPullCallback' }) - }) Button('设置属性') .margin({ top: 10 }) .onClick(() => { @@ -43,6 +38,11 @@ struct Index { .onClick(() => { router.push({ url: 'pages/fullScreen' }) }) + Button('回弹的回调函数') + .margin({ top: 10 }) + .onClick(() => { + router.push({ url: 'pages/testPullCallback' }) + }) Button('Tab配合PullToRefresh') .margin({ top: 10 }) .onClick(() => { diff --git a/entry/src/main/ets/pages/lazyForEachGuide.ets b/entry/src/main/ets/pages/lazyForEachGuide.ets index 9aec31c80d5007aeef8ef761c90f41c71f0f014b..ae4c5ba8785336f4902e9c4214cd5c4dd50bd27c 100644 --- a/entry/src/main/ets/pages/lazyForEachGuide.ets +++ b/entry/src/main/ets/pages/lazyForEachGuide.ets @@ -12,7 +12,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import { RefreshList, PullToRefreshConfigurator } from '@ohos/pulltorefresh'; +import { RefreshList } from '@ohos/pulltorefresh'; class BasicDataSource implements IDataSource { private listeners: DataChangeListener[] = new Array(); @@ -118,7 +118,6 @@ struct Index { private modifier: MyListModifier = new MyListModifier(); @State data: MyDataSource = new MyDataSource(); private timer: null | number = null; - private refreshConfigurator: PullToRefreshConfigurator = new PullToRefreshConfigurator(); aboutToAppear() { for (let i = 1; i <= 20; i++) { @@ -138,14 +137,12 @@ struct Index { // 一个用@Builder修饰过的UI方法 this.getListView(); }, - //可选项,组件属性配置,具有默认值 - refreshConfigurator: this.refreshConfigurator, //可选项,属性方法修改时触发 modifier: this.modifier, // 可选项,下拉刷新回调 onRefresh: () => { return new Promise((resolve, reject) => { - // 模拟网络请求操作,请求网络2秒后得到数据,通知组件,变更列表数据 + // 模拟网络请求操作,请求网络1秒后得到数据,通知组件,变更列表数据 this.timer = setTimeout(() => { resolve('刷新成功'); this.data.addData(0, 'ADD HEAD 0'); diff --git a/entry/src/main/ets/pages/scrollTestPage.ets b/entry/src/main/ets/pages/scrollTestPage.ets index 089149515e95a641693634adb35862f66bbd0e6f..828092cee946e802f418c0c6f27406d705b4e2de 100644 --- a/entry/src/main/ets/pages/scrollTestPage.ets +++ b/entry/src/main/ets/pages/scrollTestPage.ets @@ -20,6 +20,10 @@ class MyScrollModifier implements AttributeModifier { instance.backgroundColor('#DCDCDC'); instance.friction(0.6); instance.align(Alignment.TopStart); + instance.nestedScroll({ + scrollForward: NestedScrollMode.PARENT_FIRST, + scrollBackward: NestedScrollMode.SELF_FIRST + }) } } @@ -30,7 +34,7 @@ struct TabsExample { @State selectedFontColor: string = '#0070FF'; @State currentIndex: number = 0; private controller: TabsController = new TabsController(); - @State refreshConfigurator: PullToRefreshConfigurator = new PullToRefreshConfigurator() + @Builder TabBuilder(index: number, name: string) { Column() { @@ -46,9 +50,7 @@ struct TabsExample { .opacity(this.currentIndex === index ? 1 : 0) }.width('100%') } - aboutToAppear(): void { - this.refreshConfigurator.setRefreshBackgroundColor('#DCDCDC') - } + build() { Scroll() { Column() { @@ -59,14 +61,14 @@ struct TabsExample { .textAlign(TextAlign.Center) Tabs({ barPosition: BarPosition.Start, controller: this.controller }) { TabContent() { - PullToRefreshDemo({refresh:this.refreshConfigurator}) + PullToRefreshDemo() }.tabBar(this.TabBuilder(0, 'tab1')) TabContent() { Column().width('100%').height('100%').backgroundColor('#007DFF') }.tabBar(this.TabBuilder(1, 'tab2')) } - .height('60%') + .height('100%') .vertical(false) .barMode(BarMode.Fixed) .barWidth(360) @@ -92,8 +94,8 @@ struct PullToRefreshDemo { @State data: string[] = this.dataStrings; private modifier: MyScrollModifier = new MyScrollModifier(); private timer: null | number = null; - private refreshConfigurator: PullToRefreshConfigurator = new PullToRefreshConfigurator(); - @ObjectLink refresh: PullToRefreshConfigurator + @State refreshConfigurator: PullToRefreshConfigurator = new PullToRefreshConfigurator() + @Styles listCard() { .backgroundColor(Color.White) @@ -101,6 +103,9 @@ struct PullToRefreshDemo { .width("100%") .borderRadius(12) } + aboutToAppear(): void { + this.refreshConfigurator.setRefreshBackgroundColor('#DCDCDC') + } build() { Column() { @@ -110,8 +115,7 @@ struct PullToRefreshDemo { //必传项,控制是否进行下拉刷新 refreshing: $refreshing, //可选项,组件属性配置,具有默认值 - refreshConfigurator: this.refresh, - //默认动画 + refreshConfigurator: this.refreshConfigurator, // 必传项,需绑定传入主体布局内的列表或宫格组件的item customList: () => { // 一个用@Builder修饰过的UI方法 @@ -169,7 +173,7 @@ struct PullToRefreshDemo { }) } - aboutToAppear() { + aboutToDisAppear() { clearTimeout(this.timer); } } \ No newline at end of file diff --git a/entry/src/main/ets/pages/tabsTestPage.ets b/entry/src/main/ets/pages/tabsTestPage.ets index 5984927182e3cf49430fe95547c4269ad7d1119c..8770c53b831d52bba6e308341734730a2d1ae9b2 100644 --- a/entry/src/main/ets/pages/tabsTestPage.ets +++ b/entry/src/main/ets/pages/tabsTestPage.ets @@ -12,7 +12,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import { PullToRefreshConfigurator, RefreshList } from '@ohos/pulltorefresh' +import { RefreshList } from '@ohos/pulltorefresh' //动态添加list组件的属性 class MyListModifier implements AttributeModifier { @@ -28,8 +28,8 @@ struct Index { @State selectedFontColor: string = '#007DFF'; @State currentIndex: number = 0; private controller: TabsController = new TabsController(); - @State refreshing: boolean = false; - private refreshConfigurator: PullToRefreshConfigurator = new PullToRefreshConfigurator(); + //是否在切换首次tab的时候,触发下拉刷新 + @State tabRefreshing:boolean = true; @Builder TabBuilder(index: number, name: string) { @@ -51,17 +51,14 @@ struct Index { Column() { Tabs({ barPosition: BarPosition.Start, controller: this.controller }) { TabContent() { - PullToRefreshDemo({ count: this.refreshing }) + PullToRefreshDemo({ refreshing: this.tabRefreshing }) }.tabBar(this.TabBuilder(0, 'green')) - TabContent() { - Column().width('100%').height('100%').backgroundColor('#007DFF') + PullToRefreshDemo({ refreshing: this.tabRefreshing }) }.tabBar(this.TabBuilder(1, 'blue')) - TabContent() { - PullToRefreshDemo({ count: this.refreshing }) + PullToRefreshDemo({ refreshing: this.tabRefreshing }) }.tabBar(this.TabBuilder(2, 'yellow')) - TabContent() { Column().width('100%').height('100%').backgroundColor('#E67C92') }.tabBar(this.TabBuilder(3, 'pink')) @@ -73,7 +70,7 @@ struct Index { .animationDuration(400) .onChange((index: number) => { this.currentIndex = index; - this.refreshing = true; + this.tabRefreshing = true; }) .width('100%') .margin({ top: 52 }) @@ -90,12 +87,6 @@ struct PullToRefreshDemo { @State data: string[] = this.dataStrings; private modifier: MyListModifier = new MyListModifier(); private timer: null | number = null; - @Link count: boolean; - private refreshConfigurator: PullToRefreshConfigurator = new PullToRefreshConfigurator(); - - aboutToAppear() { - this.refreshing = this.count - } build() { Stack() { @@ -104,8 +95,6 @@ struct PullToRefreshDemo { data: $data, //必传项,控制是否进行下拉刷新 refreshing: $refreshing, - //可选项,组件属性配置,具有默认值 - refreshConfigurator: this.refreshConfigurator, // 必传项,需绑定传入主体布局内的列表或宫格组件的item customList: () => { // 一个用@Builder修饰过的UI方法 @@ -116,7 +105,7 @@ struct PullToRefreshDemo { // 可选项,下拉刷新回调 onRefresh: () => { return new Promise((resolve, reject) => { - // 模拟网络请求操作,请求网络2秒后得到数据,通知组件,变更列表数据 + // 模拟网络请求操作,请求网络1秒后得到数据,通知组件,变更列表数据 setTimeout(() => { resolve('刷新成功'); this.data = this.dataNumbers; @@ -126,7 +115,7 @@ struct PullToRefreshDemo { // 可选项,上拉加载更多回调 onLoadMore: () => { return new Promise((resolve, reject) => { - // 模拟网络请求操作,请求网络2秒后得到数据,通知组件,变更列表数据 + // 模拟网络请求操作,请求网络1秒后得到数据,通知组件,变更列表数据 setTimeout(() => { resolve(''); for (let index = 0; index < 10; index++) { diff --git a/entry/src/main/ets/pages/testPullCallback.ets b/entry/src/main/ets/pages/testPullCallback.ets index 718cac72369d3302a629ad9d0cef3712fe183017..f38544cf37bdc3ca21ffb82ee895a90ea56591c4 100644 --- a/entry/src/main/ets/pages/testPullCallback.ets +++ b/entry/src/main/ets/pages/testPullCallback.ets @@ -47,7 +47,7 @@ struct Index { @State imgOpacity: number = 1; @State topPadding: number = 0; private refreshConfigurator: PullToRefreshConfigurator = new PullToRefreshConfigurator(); - + build() { Column() { RefreshList({ @@ -55,8 +55,6 @@ struct Index { data: $data, //必传项,控制是否进行下拉刷新 refreshing: $refreshing, - //可选项,组件属性配置,具有默认值 - refreshConfigurator: this.refreshConfigurator, //必传项,需绑定传入主体局内的列表或宫格组件的item customList: () => { //一个用@Builder修饰过的UI方法 diff --git a/entry/src/main/ets/pages/waterFlowTestPage.ets b/entry/src/main/ets/pages/waterFlowTestPage.ets index d881a9c477d1225814c1d1d73e5b6258b6975626..dd9586939238b7d4e12da0828c893780abeec50c 100644 --- a/entry/src/main/ets/pages/waterFlowTestPage.ets +++ b/entry/src/main/ets/pages/waterFlowTestPage.ets @@ -12,9 +12,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import { RefreshWaterFlow, PullToRefreshConfigurator } from '@ohos/pulltorefresh'; - -const TopImageSize = 15; +import { RefreshWaterFlow } from '@ohos/pulltorefresh'; //实现IDataSource接口的对象,用于瀑布流组件加载数据 class WaterFlowDataSource implements IDataSource { @@ -170,7 +168,6 @@ struct Index { @State scaleOp3: ScaleOptions | null = { x: 1, y: 1 }; @State loadingMarginLeft: number = 20; @State LoadingText: string = '加载中'; - private refreshConfigurator: PullToRefreshConfigurator = new PullToRefreshConfigurator(); //计算FlowItem宽/高 getSize() { @@ -204,8 +201,6 @@ struct Index { data: $dataSource, //必传项,控制是否刷新 refreshing: $refreshing, - //可选项,组件属性配置,具有默认值 - refreshConfigurator: this.refreshConfigurator, //必传项,需绑定传入主体布局内的列表或宫格组件的item customList: () => { //一个用@Builder修饰过的UI方法 diff --git a/entry/src/main/resources/base/media/flower.jpg b/entry/src/main/resources/base/media/flower.jpg new file mode 100644 index 0000000000000000000000000000000000000000..81512f8c5f4dd084f0b4ea79de533427e509277a Binary files /dev/null and b/entry/src/main/resources/base/media/flower.jpg differ diff --git a/entry/src/ohosTest/ets/test/Ability.test.ets b/entry/src/ohosTest/ets/test/Ability.test.ets index ab5bdaa7b1c88e6ba1ec71076deb8bcb4f8e60f5..5baef3c62c775f92cde5ebd29dcd7e8627568759 100644 --- a/entry/src/ohosTest/ets/test/Ability.test.ets +++ b/entry/src/ohosTest/ets/test/Ability.test.ets @@ -44,36 +44,45 @@ export default function abilityTest() { let refreshConfigurator: PullToRefreshConfigurator = new PullToRefreshConfigurator(); // 设置属性 refreshConfigurator - .setHasRefresh(true) // 是否具有下拉刷新功能 - .setHasLoadMore(true) // 是否具有上拉加载功能 - .setRefreshHeight(80) // 下拉动画高度 - .setRefreshColor('#ff0000') // 下拉动画颜色 - .setRefreshBackgroundColor('#ffbbfaf5') // 下拉动画区域背景色 - .setRefreshTextColor('red') // 下拉加载完毕后提示文本的字体颜色 - .setRefreshTextSize(25) // 下拉加载完毕后提示文本的字体大小 - .setRefreshAnimDuration(1000) // 下拉动画执行一次的时间 - .setLoadImageHeight(50) // 上拉图片高度 - .setLoadBackgroundColor('#ffbbfaf5') // 上拉动画区域背景色 - .setLoadTextColor('blue') // 上拉文本的字体颜色 - .setLoadTextSize(25) // 上拉文本的字体大小 - .setLoadTextLoading('加载中...') // 上拉加载更多中时的文本 + .setRefreshHeight(100)//设置触发刷新的下拉的偏移量 + .setHasRefresh(true)//是否具有下拉刷新功能 + .setHasLoadMore(true)// 是否具有上拉加载功能 + .setListSpace(20)//list组件子组件主轴方向的间隔 + .setRefreshBackgroundImage($r("app.media.sanmartino"))// 下拉刷新动画部分的背景 + .setLoadBackgroundImage($r("app.media.sanmartino"))//// 上拉加载动画部分的背景 + .setListInitialIndex(0)// list组件设置当前List初次加载时视口起始位置显示的item的索引值 + .setRefreshOpacity(0.6)// 下拉刷新背景图的透明度 + .setRefreshTextColor(Color.Black) + .setRefreshBackgroundColor('#ffbbfaf5')// 下拉动画区域背景色 + .setSubjectContentBackgroundColor(Color.White)// 主体内容背景颜色 + .setLoadBackgroundColor('#ffbbfaf5')//// 上拉动画区域背景色 + .setLoadImageHeight(100)// 上拉图片高度 + .setLoadTextColor(Color.Blue)// 上拉文本的字体颜色 + .setLoadTextSize(30)// 上拉文本的字体大小 + .setLoadTextLoading('玩命加载中...')// 上拉加载更多中时的文本 + .setRefreshAnimDuration(2000)// 下拉动画执行一次的时间 + .setRefreshColor('#ff0000') // 下拉动画颜色设置 expect(refreshConfigurator.getHasRefresh()).assertTrue(); expect(refreshConfigurator.getHasLoadMore()).assertTrue(); - expect(refreshConfigurator.getRefreshHeight()).assertEqual(80); + expect(refreshConfigurator.getRefreshHeight()).assertEqual(100); + expect(refreshConfigurator.getListSpace()).assertEqual(20); + expect(refreshConfigurator.getRefreshBackgroundImage()).assertEqual($r("app.media.sanmartino")); + expect(refreshConfigurator.getLoadBackgroundImage()).assertEqual($r("app.media.sanmartino")); + expect(refreshConfigurator.getListInitialIndex()).assertEqual(0); + expect(refreshConfigurator.getRefreshOpacity()).assertEqual(0.6); expect(refreshConfigurator.getRefreshColor()).assertEqual('#ff0000'); expect(refreshConfigurator.getRefreshBackgroundColor()).assertEqual('#ffbbfaf5'); - expect(refreshConfigurator.getRefreshTextColor()).assertEqual('red'); + expect(refreshConfigurator.getRefreshTextColor()).assertEqual(Color.Black); + expect(refreshConfigurator.getSubjectContentBackgroundColor()).assertEqual(Color.White); expect(refreshConfigurator.getRefreshTextSize()).assertEqual(25); - expect(refreshConfigurator.getRefreshAnimDuration()).assertEqual(1000); - expect(refreshConfigurator.getLoadImageHeight()).assertEqual(50); + expect(refreshConfigurator.getRefreshAnimDuration()).assertEqual(2000); + expect(refreshConfigurator.getLoadImageHeight()).assertEqual(100); expect(refreshConfigurator.getLoadBackgroundColor()).assertEqual('#ffbbfaf5'); - expect(refreshConfigurator.getLoadTextColor()).assertEqual('blue'); - expect(refreshConfigurator.getLoadTextSize()).assertEqual(25); - expect(refreshConfigurator.getLoadTextLoading()).assertEqual('加载中...'); + expect(refreshConfigurator.getLoadTextColor()).assertEqual(Color.Blue); + expect(refreshConfigurator.getLoadTextSize()).assertEqual(30); + expect(refreshConfigurator.getLoadTextLoading()).assertEqual('玩命加载中...'); }) - // 目前PullToRefresh等自定义组件内容XTS测试用例无法进行测试 - }) } \ No newline at end of file diff --git a/gifs/LoadMore.gif b/gifs/LoadMore.gif index b19a4165ed79cfbe5cce00fe7acefd3da5429c81..ccabe1216f5f2144fdf067f2819d087c41c32bd2 100644 Binary files a/gifs/LoadMore.gif and b/gifs/LoadMore.gif differ diff --git a/gifs/Refresh.gif b/gifs/Refresh.gif index 3e0f0b425d49dc8da8eb0f856878ff25fd4a0555..15b471f0b746e24baa7823d9738d209b85e0b66b 100644 Binary files a/gifs/Refresh.gif and b/gifs/Refresh.gif differ diff --git a/library/src/main/ets/components/PullToRefresh/PullToRefreshConfigurator.ets b/library/src/main/ets/components/PullToRefresh/PullToRefreshConfigurator.ets index a5b55b68b68fdaa40e35230dadd660153c2e6d23..34835336af81078acd8527e5d47c5f4a5ab90917 100644 --- a/library/src/main/ets/components/PullToRefresh/PullToRefreshConfigurator.ets +++ b/library/src/main/ets/components/PullToRefresh/PullToRefreshConfigurator.ets @@ -12,7 +12,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -@Observed + export class PullToRefreshConfigurator { private hasRefresh?: boolean = true; // 是否具有下拉刷新功能 private hasLoadMore?: boolean = true; // 是否具有上拉加载功能 @@ -25,7 +25,7 @@ export class PullToRefreshConfigurator { private refreshBackgroundColor?: ResourceColor = 'rgba(0,0,0,0)'; // 下拉动画区域背景色 private refreshTextColor?: ResourceColor = '#999999'; // 下拉刷新提示文本的字体颜色 private refreshTextSize?: number | string | Resource = 16; // 下拉刷新提示文本的字体大小 - private refreshAnimDuration?: number = 1000; // 下拉动画执行一次的时间 + private refreshAnimDuration?: number = 600; // 下拉动画执行一次的时间 private loadImageHeight?: number = 64; // 上拉加载动画高度 private loadBackgroundColor?: ResourceColor = 'rgba(0,0,0,0)'; // 上拉动画区域背景色 private loadTextColor?: ResourceColor = '#999999'; // 上拉文本的字体颜色 @@ -34,8 +34,9 @@ export class PullToRefreshConfigurator { private subjectContentBackgroundColor?: ResourceColor = '#eeeeee'; // 主题内容背景颜色 //============以下为List组件内自用属性====================================// private listSpace?: number | string; // list组件子组件主轴方向的间隔 - private fullScreen?:boolean = false //list组件全屏参数 + private fullScreen?:boolean = false; //list组件全屏参数 private listInitialIndex?: number; // list组件设置当前List初次加载时视口起始位置显示的item的索引值 + setFullScreen(fullScreen:boolean){ this.fullScreen = fullScreen; return this; diff --git a/library/src/main/ets/components/PullToRefresh/RefreshGrid.ets b/library/src/main/ets/components/PullToRefresh/RefreshGrid.ets index acddb4856352d308e743bcccc0d506dfc6c8d536..809e5fe08aff0464b9ed5d1650226dfe4d88cc25 100644 --- a/library/src/main/ets/components/PullToRefresh/RefreshGrid.ets +++ b/library/src/main/ets/components/PullToRefresh/RefreshGrid.ets @@ -106,6 +106,7 @@ export struct RefreshGrid { this.onAnimRefreshing(this.refreshAnimDurationValue, this.mWidthNumber, rangeHeightValue); } } + //Refresh结束回到顶部阶段 if (this.refreshState == RefreshStatus.Done) { let rangeHeightValue = this.refreshConfigurator?.getRefreshHeight() as number; if (this.rangeValue !== undefined && this.rangeValue > 0) { @@ -115,6 +116,7 @@ export struct RefreshGrid { } } } + //自定义上拉动画 if (this.loadAnimDurationValue !== undefined) { if (this.loadAnimDurationValue >= 1) { this.loadAnimDurationValue -= 1; @@ -138,7 +140,6 @@ export struct RefreshGrid { @Builder refreshBuilder() { Stack({ alignContent: Alignment.Center }) { - if (this.refreshState !== RefreshStatus.Inactive && this.refreshState !== RefreshStatus.Done) { if (this.customRefresh !== undefined && this.customRefresh !== null) { this.customRefresh(); } else { @@ -161,11 +162,9 @@ export struct RefreshGrid { .margin({ left: 20 }) .fontColor(this.refreshConfigurator?.getRefreshTextColor()) } - Image(this.refreshConfigurator?.getRefreshBackgroundImage()) .opacity(this.refreshConfigurator?.getRefreshOpacity()) } - } } .width('100%') .visibility(this.refreshConfigurator?.getHasRefresh() ? Visibility.Visible : Visibility.None) @@ -197,12 +196,10 @@ export struct RefreshGrid { .width(30) .height(30) .margin({ right: 10 }) - Text(this.refreshConfigurator?.getLoadTextLoading()) .fontSize(this.refreshConfigurator?.getLoadTextSize()) .fontColor(this.refreshConfigurator?.getLoadTextColor()) } - Image(this.refreshConfigurator?.getLoadBackgroundImage()) .opacity(this.refreshConfigurator?.getLoadOpacity()) } @@ -246,7 +243,7 @@ export struct RefreshGrid { .height('100%') .refreshOffset(this.refreshConfigurator?.getRefreshHeight()) .pullToRefresh(this.refreshConfigurator?.getHasRefresh()) - .backgroundColor(this.refreshConfigurator?.getRefreshBackgroundColor()) + .backgroundColor(this.refreshConfigurator?.getHasRefresh() ? this.refreshConfigurator?.getRefreshBackgroundColor():'') .onStateChange((state: RefreshStatus) => { this.refreshState = state; if (this.refreshState == RefreshStatus.Done) { diff --git a/library/src/main/ets/components/PullToRefresh/RefreshList.ets b/library/src/main/ets/components/PullToRefresh/RefreshList.ets index a7e7c51a2392d44a523c12127083b876af7c4635..2d1bb3bf1189193376ec4445dc54e544928be8b4 100644 --- a/library/src/main/ets/components/PullToRefresh/RefreshList.ets +++ b/library/src/main/ets/components/PullToRefresh/RefreshList.ets @@ -52,7 +52,7 @@ export struct RefreshList { return new Promise((resolve, reject) => { setTimeout(() => { resolve('刷新失败'); - }, 2000); + }, 1000); }); }; // 上拉刷新回调 @@ -60,7 +60,7 @@ export struct RefreshList { return new Promise((resolve, reject) => { setTimeout(() => { resolve(''); - }, 2000); + }, 1000); }); }; // 回弹的回调 @@ -72,9 +72,7 @@ export struct RefreshList { private mWidthNumber?: number = 0; // 开启自定义上拉动画 private loadAnimDurationValue?: number = 0; - //全屏参数 - @State private fullScreen: boolean = false; - @State index: number = 0; + @State fullScreenScrollIndex: number = 0; aboutToAppear() { if (!this.refreshConfigurator) { @@ -107,6 +105,7 @@ export struct RefreshList { this.onAnimRefreshing(this.refreshAnimDurationValue, this.mWidthNumber, rangeHeightValue); } } + //Refresh结束回到顶部阶段 if (this.refreshState == RefreshStatus.Done) { let rangeHeightValue = this.refreshConfigurator?.getRefreshHeight() as number; if (this.rangeValue !== undefined && this.rangeValue > 0) { @@ -116,6 +115,7 @@ export struct RefreshList { } } } + //自定义上拉动画 if (this.loadAnimDurationValue !== undefined) { if (this.loadAnimDurationValue >= 1) { this.loadAnimDurationValue -= 1; @@ -161,7 +161,6 @@ export struct RefreshList { .margin({ left: 20 }) .fontColor(this.refreshConfigurator?.getRefreshTextColor()) } - Image(this.refreshConfigurator?.getRefreshBackgroundImage()) .opacity(this.refreshConfigurator?.getRefreshOpacity()) } @@ -201,12 +200,10 @@ export struct RefreshList { .width(30) .height(30) .margin({ right: 10 }) - Text(this.refreshConfigurator?.getLoadTextLoading()) .fontSize(this.refreshConfigurator?.getLoadTextSize()) .fontColor(this.refreshConfigurator?.getLoadTextColor()) } - Image(this.refreshConfigurator?.getLoadBackgroundImage()) .opacity(this.refreshConfigurator?.getLoadOpacity()) } @@ -240,7 +237,7 @@ export struct RefreshList { }) .onScrollIndex((start: number) => { if (this.refreshConfigurator?.getFullScreen()) { - this.index = start + this.fullScreenScrollIndex = start } }) } @@ -248,7 +245,7 @@ export struct RefreshList { .height('100%') .refreshOffset(this.refreshConfigurator?.getRefreshHeight()) .pullToRefresh(this.refreshConfigurator?.getHasRefresh()) - .backgroundColor(this.refreshConfigurator?.getRefreshBackgroundColor()) + .backgroundColor(this.refreshConfigurator?.getHasRefresh() ? this.refreshConfigurator?.getRefreshBackgroundColor():'') .onStateChange((state: RefreshStatus) => { this.refreshState = state; if (state == RefreshStatus.Done) { @@ -272,7 +269,7 @@ export struct RefreshList { this.onLoadMore().then(() => { this.isTriggerPullUpLoading = false; if (this.refreshConfigurator?.getFullScreen()) { - this.scroller.scrollToIndex(this.index); + this.scroller.scrollToIndex(this.fullScreenScrollIndex); } }) } diff --git a/library/src/main/ets/components/PullToRefresh/RefreshScroll.ets b/library/src/main/ets/components/PullToRefresh/RefreshScroll.ets index 70f3d23bd09e644668d4701fa83319a9e138487a..7607a9d9d352ac48b4b827e7448878dc5d41aa1b 100644 --- a/library/src/main/ets/components/PullToRefresh/RefreshScroll.ets +++ b/library/src/main/ets/components/PullToRefresh/RefreshScroll.ets @@ -64,11 +64,11 @@ export struct RefreshScroll { onAnimPullDown?: (value?: number, width?: number, height?: number) => void; onAnimRefreshing?: (value?: number, width?: number, height?: number) => void; private refreshAnimDurationValue?: number = 0; - private value?: number = 0; private mWidthNumber?: number = 0; private timer?: number; // 开启自定义上拉动画 private loadAnimDurationValue?: number = 0; + aboutToAppear() { if (!this.refreshConfigurator) { this.refreshConfigurator = new PullToRefreshConfigurator(); @@ -100,6 +100,7 @@ export struct RefreshScroll { this.onAnimRefreshing(this.refreshAnimDurationValue, this.mWidthNumber, rangeHeightValue); } } + //Refresh结束回到顶部阶段 if (this.refreshState == RefreshStatus.Done) { let rangeHeightValue = this.refreshConfigurator?.getRefreshHeight() as number; if (this.rangeValue !== undefined && this.rangeValue > 0) { @@ -109,6 +110,7 @@ export struct RefreshScroll { } } } + //自定义上拉动画 if (this.loadAnimDurationValue !== undefined) { if (this.loadAnimDurationValue >= 1) { this.loadAnimDurationValue -= 1; @@ -132,8 +134,7 @@ export struct RefreshScroll { refreshBuilder() { // 下拉刷新动画部分 Stack({ alignContent: Alignment.Center }) { - if (this.refreshState !== RefreshStatus.Inactive && this.refreshState !== RefreshStatus.Done) { - if (this.customRefresh) { + if (this.customRefresh !== undefined && this.customRefresh !== null) { this.customRefresh(); } else { Row() { @@ -155,11 +156,9 @@ export struct RefreshScroll { .margin({ left: 20 }) .fontColor(this.refreshConfigurator?.getRefreshTextColor()) } - Image(this.refreshConfigurator?.getRefreshBackgroundImage()) .opacity(this.refreshConfigurator?.getRefreshOpacity()) } - } } .width('100%') .visibility(this.refreshConfigurator?.getHasRefresh() ? Visibility.Visible : Visibility.None) @@ -196,7 +195,6 @@ export struct RefreshScroll { .fontSize(this.refreshConfigurator?.getLoadTextSize()) .fontColor(this.refreshConfigurator?.getLoadTextColor()) } - Image(this.refreshConfigurator?.getLoadBackgroundImage()) .opacity(this.refreshConfigurator?.getLoadOpacity()) } @@ -215,6 +213,7 @@ export struct RefreshScroll { } .width('100%') .height('100%') // 不设置100%,在上拉加载的时候空白区域上拉不生效 + .backgroundColor(this.refreshConfigurator?.getSubjectContentBackgroundColor()) .scrollBar(BarState.Off) //滚动条隐藏 .edgeEffect(EdgeEffect.Spring, { alwaysEnabled: true }) .scrollable(ScrollDirection.Vertical) // 滚动方向纵向 @@ -233,7 +232,7 @@ export struct RefreshScroll { .height('100%') .refreshOffset(this.refreshConfigurator?.getRefreshHeight()) .pullToRefresh(this.refreshConfigurator?.getHasRefresh()) - .backgroundColor(this.refreshConfigurator?.getRefreshBackgroundColor()) + .backgroundColor(this.refreshConfigurator?.getHasRefresh() ? this.refreshConfigurator?.getRefreshBackgroundColor():'') .onStateChange((state: RefreshStatus) => { this.refreshState = state; if (state == RefreshStatus.Done) { diff --git a/library/src/main/ets/components/PullToRefresh/RefreshWaterFlow.ets b/library/src/main/ets/components/PullToRefresh/RefreshWaterFlow.ets index afea00ed3defa35911f3bc8cdc1dc1b4dbf7c40e..c3b23c1c98f834bcace632e01a276d6ecb77bb0e 100644 --- a/library/src/main/ets/components/PullToRefresh/RefreshWaterFlow.ets +++ b/library/src/main/ets/components/PullToRefresh/RefreshWaterFlow.ets @@ -64,14 +64,11 @@ export struct RefreshWaterFlow { onAnimPullDown?: (value?: number, width?: number, height?: number) => void; onAnimRefreshing?: (value?: number, width?: number, height?: number) => void; private refreshAnimDurationValue?: number = 0; - private value?: number = 0; private mWidthNumber?: number = 0; - isPullUp: boolean = false; private timer?: number; - // 是否可以上拉加载 - isShow: boolean = true; // 开启自定义上拉动画 private loadAnimDurationValue?: number = 0; + aboutToAppear() { if (!this.refreshConfigurator) { this.refreshConfigurator = new PullToRefreshConfigurator(); @@ -103,6 +100,7 @@ export struct RefreshWaterFlow { this.onAnimRefreshing(this.refreshAnimDurationValue, this.mWidthNumber, rangeHeightValue); } } + //Refresh结束回到顶部阶段 if (this.refreshState == RefreshStatus.Done) { let rangeHeightValue = this.refreshConfigurator?.getRefreshHeight() as number; if (this.rangeValue !== undefined && this.rangeValue > 0) { @@ -112,6 +110,7 @@ export struct RefreshWaterFlow { } } } + //自定义上拉动画 if (this.loadAnimDurationValue !== undefined) { if (this.loadAnimDurationValue >= 1) { this.loadAnimDurationValue -= 1; @@ -135,8 +134,7 @@ export struct RefreshWaterFlow { refreshBuilder() { // 下拉刷新动画部分 Stack({ alignContent: Alignment.Center }) { - if (this.refreshState !== RefreshStatus.Inactive && this.refreshState !== RefreshStatus.Done) { - if (this.customRefresh) { + if (this.customRefresh !== undefined && this.customRefresh !== null) { this.customRefresh(); } else { Row() { @@ -162,7 +160,6 @@ export struct RefreshWaterFlow { Image(this.refreshConfigurator?.getRefreshBackgroundImage()) .opacity(this.refreshConfigurator?.getRefreshOpacity()) } - } } .width('100%') .visibility(this.refreshConfigurator?.getHasRefresh() ? Visibility.Visible : Visibility.None) @@ -172,7 +169,7 @@ export struct RefreshWaterFlow { flowFooter() { // 上拉加载动画 Stack() { - if (this.customLoad) { + if (this.customLoad!== undefined && this.customLoad !== null) { this.customLoad(); } else { Stack() { @@ -195,7 +192,6 @@ export struct RefreshWaterFlow { .fontSize(this.refreshConfigurator?.getLoadTextSize()) .fontColor(this.refreshConfigurator?.getLoadTextColor()) } - Image(this.refreshConfigurator?.getRefreshBackgroundImage()) .opacity(this.refreshConfigurator?.getLoadOpacity()) } @@ -218,10 +214,11 @@ export struct RefreshWaterFlow { this.customList(); } } + .backgroundColor(this.refreshConfigurator?.getSubjectContentBackgroundColor()) .scrollBar(BarState.Off) .edgeEffect(EdgeEffect.Spring, { alwaysEnabled: true }) .onWillScroll((scrollOffset: number) => { - if (!this.isTriggerPullUpLoading && this.isShow && scrollOffset > 0) { + if (!this.isTriggerPullUpLoading && this.refreshConfigurator?.getHasLoadMore() && scrollOffset > 0) { this.isTriggerPullUpLoading = true; } }) @@ -235,7 +232,7 @@ export struct RefreshWaterFlow { .height('100%') .refreshOffset(this.refreshConfigurator?.getRefreshHeight()) .pullToRefresh(this.refreshConfigurator?.getHasRefresh()) - .backgroundColor(this.refreshConfigurator?.getRefreshBackgroundColor()) + .backgroundColor(this.refreshConfigurator?.getHasRefresh() ? this.refreshConfigurator?.getRefreshBackgroundColor():'') .onStateChange((state: RefreshStatus) => { this.refreshState = state; if (state == RefreshStatus.Done) { diff --git a/oh-package-lock.json5 b/oh-package-lock.json5 deleted file mode 100644 index b236cd173f6073e943957b2933e614f3e6d8a574..0000000000000000000000000000000000000000 --- a/oh-package-lock.json5 +++ /dev/null @@ -1,19 +0,0 @@ -{ - "meta": { - "stableOrder": true - }, - "lockfileVersion": 3, - "ATTENTION": "THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.", - "specifiers": { - "@ohos/hypium@1.0.6": "@ohos/hypium@1.0.6" - }, - "packages": { - "@ohos/hypium@1.0.6": { - "name": "@ohos/hypium", - "integrity": "sha512-bb3DWeWhYrFqj9mPFV3yZQpkm36kbcK+YYaeY9g292QKSjOdmhEIQR2ULPvyMsgSR4usOBf5nnYrDmaCCXirgQ==", - "resolved": "https://ohpm.openharmony.cn/ohpm/@ohos/hypium/-/hypium-1.0.6.tgz", - "shasum": "3f5fed65372633233264b3447705b0831dfe7ea1", - "registryType": "ohpm" - } - } -} \ No newline at end of file