HarmonyOS鸿蒙Next中实现阅读器翻页效果示例代码

HarmonyOS鸿蒙Next中实现阅读器翻页效果示例代码

介绍

本示例基于显式动画、List组件、drawing接口实现了阅读器上下翻页、左右覆盖翻页以及仿真翻页效果。

实现阅读器翻页效果源码地址

效果预览

图片名称

使用说明

  1. 进入应用默认为仿真翻页,长按屏幕并滑动可实现翻页效果,点击屏幕中部区域,弹出翻页方式选择栏。
  2. 选择上下翻页,显示上下翻页页面,支持上下滑动翻页。
  3. 选择覆盖翻页,显示覆盖翻页页面。支持左右滑动翻页,以及点击屏幕左右侧后滑动翻页。

实现思路

上下翻页效果

使用List组件实现上下滑动效果,通过添加点击事件,点击屏幕,底部会出现翻页方式选择栏。核心代码如下:

Column() {
  List({ initialIndex: this.currentPageNum - Constants.PAGE_FLIP_PAGE_COUNT }) {
    LazyForEach(this.data, (item: string) => {
      ListItem() {
        Text($r(item))
        ···
      }
    }, (item: string, index: number) => index + JSON.stringify(item))
  }
  .width($r('app.string.pageflip_bottomview_row_text_width'))
  .height($r('app.string.page_flip_full_size'))
  .scrollBar(BarState.Off)
  .cachedCount(Constants.PAGE_FLIP_CACHE_COUNT)
  .onScrollIndex((firstIndex: number) => {
    this.currentPageNum = firstIndex + Constants.PAGE_FLIP_PAGE_COUNT;
  })
}
.width($r('app.string.page_flip_full_size'))
.backgroundColor($r("app.color.page_flip_background_color"))
.expandSafeArea([SafeAreaType.SYSTEM], [SafeAreaEdge.TOP, SafeAreaEdge.BOTTOM])
.onClick((event?: ClickEvent) => {
  if (event) {
    if (this.isMenuViewVisible) {
      this.isMenuViewVisible = false;
    } else {
      this.isMenuViewVisible = true;
    }
  }
})

覆盖翻页效果

使用显式动画animateTo和堆叠容器Stack实现页面覆盖效果,通过触发滑动手势事件PanGesture,左右滑动屏幕或点击屏幕左侧右侧可进行翻页。animateTo中涉及的参数:

  1. duration:动画执行的时长,单位毫秒,项目中固定为300ms。
  2. curve:插值曲线,此处用了EaseOut,表示动画逐渐减速以低速结束。

核心代码如下:

private clickAnimateTo(isClick: boolean, isLeft?: boolean) {
  animateTo({
    duration: Constants.PAGE_FLIP_TO_AST_DURATION,
    curve: Curve.EaseOut,
    onFinish: () => {
      if (this.offsetX > Constants.PAGE_FLIP_RIGHT_FLIP_OFFSETX && 
        this.currentPageNum !== Constants.PAGE_FLIP_PAGE_START) {
        this.currentPageNum -= Constants.PAGE_FLIP_PAGE_COUNT;
      } else if (this.offsetX < Constants.PAGE_FLIP_LEFT_FLIP_OFFSETX && 
        this.currentPageNum !== Constants.PAGE_FLIP_PAGE_END) {
        this.currentPageNum += Constants.PAGE_FLIP_PAGE_COUNT;
      }
      this.offsetX = Constants.PAGE_FLIP_ZERO;
      this.simulatePageContent();
    }
  }, () => {
    if (isClick) {
      if (isLeft) {
        this.offsetX = this.screenW;
      } else {
        this.offsetX = -this.screenW;
      }
    } else {
      if (this.offsetX > Constants.PAGE_FLIP_RIGHT_FLIP_OFFSETX && 
        this.currentPageNum !== Constants.PAGE_FLIP_PAGE_START) {
        this.offsetX = this.screenW;
      } else if (this.offsetX < Constants.PAGE_FLIP_LEFT_FLIP_OFFSETX && 
        this.currentPageNum !== Constants.PAGE_FLIP_PAGE_END) {
        this.offsetX = -this.screenW;
      } else {
        this.offsetX = Constants.PAGE_FLIP_ZERO;
      }
    }
  });
}

仿真翻页效果

使用@ohos.graphics.drawing接口及NodeContainer组件,实现仿真翻页效果的绘制。根据手指滑动触摸位置,计算仿真页的边缘节点,填充区域后实现。核心代码如下:

NodeContainer(this.myNodeController)
  .onAppear(() => {
    AppStorage.setOrCreate('colorFlag', true);
    this.newRectNode();
  })
  .width(px2vp(this.windowWidth))
  .height(px2vp(this.windowHeight))
  .gesture(
    PanGesture()
      .onActionUpdate((event: GestureEvent) => {
        AppStorage.setOrCreate('drawState', DrawState.DS_MOVING);
        clearInterval(this.timeID);
        for (let i = 0; i < event.fingerList.length; i++) {
          if (event.fingerList[i] == undefined || 
            event.fingerList[i].localX < 0 || 
            event.fingerList[i].localY < 0 || 
            event.fingerList[i].localX > px2vp(this.windowWidth) || 
            event.fingerList[i].localY > px2vp(this.windowHeight)) {
            return;
          }
          ···
          this.newRectNode();
        }
      })
      .onActionEnd(() => {
        ···
      })
  )
2 回复

在HarmonyOS鸿蒙Next中实现阅读器翻页效果,可以通过使用PageSlider组件来实现。PageSlider是鸿蒙系统提供的一个用于页面滑动的组件,支持左右滑动切换页面。以下是一个简单的示例代码,展示如何使用PageSlider实现翻页效果。

import { PageSlider, PageSliderController } from '@ohos.arkui';
import { Text } from '@ohos.arkui';

@Entry
@Component
struct ReaderPage {
  private pageSliderController: PageSliderController = new PageSliderController();

  build() {
    Column() {
      PageSlider({
        controller: this.pageSliderController,
        loop: false,
        index: 0
      }) {
        Text('Page 1').fontSize(30).textAlign(TextAlign.Center)
        Text('Page 2').fontSize(30).textAlign(TextAlign.Center)
        Text('Page 3').fontSize(30).textAlign(TextAlign.Center)
      }
      .width('100%')
      .height('80%')
      .onPageChange((index) => {
        console.info(`Current page index: ${index}`);
      })
    }
    .width('100%')
    .height('100%')
  }
}

在这个示例中,PageSlider组件包含了三个Text组件,分别表示三页内容。PageSliderController用于控制页面的滑动行为。loop属性设置为false,表示不循环滑动。index属性设置为0,表示初始显示第一页。onPageChange事件监听页面切换,并在控制台输出当前页面的索引。

更多关于HarmonyOS鸿蒙Next中实现阅读器翻页效果示例代码的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS鸿蒙Next中实现阅读器翻页效果,可以通过PageSlider组件实现。以下是一个简单的示例代码:

import ohos.agp.components.PageSlider;
import ohos.agp.components.Text;
import ohos.agp.components.PageSliderProvider;
import ohos.app.Context;

public class ReaderPageAdapter extends PageSliderProvider {
    private Context context;
    private String[] pages;

    public ReaderPageAdapter(Context context, String[] pages) {
        this.context = context;
        this.pages = pages;
    }

    @Override
    public int getCount() {
        return pages.length;
    }

    @Override
    public Object createPageInContainer(PageSlider pageSlider, int position) {
        Text text = new Text(context);
        text.setText(pages[position]);
        pageSlider.addComponent(text);
        return text;
    }

    @Override
    public void destroyPageFromContainer(PageSlider pageSlider, int position, Object object) {
        pageSlider.removeComponent((Text) object);
    }

    @Override
    public boolean isPageMatchToObject(PageSlider pageSlider, Object o, int i) {
        return o instanceof Text && ((Text) o).getText().equals(pages[i]);
    }
}

使用示例:

PageSlider pageSlider = (PageSlider) findComponentById(ResourceTable.Id_page_slider);
String[] pages = {"Page 1", "Page 2", "Page 3"};
ReaderPageAdapter adapter = new ReaderPageAdapter(this, pages);
pageSlider.setProvider(adapter);

这段代码创建了一个简单的阅读器翻页效果,用户可以通过滑动切换页面内容。

回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!