DELPHI盒子
!实时搜索: 盒子论坛 | 注册用户 | 修改信息 | 退出
检举帖 | 全文检索 | 关闭广告 | 捐赠
技术论坛
 用户名
 密  码
自动登陆(30天有效)
忘了密码
≡技术区≡
DELPHI技术
lazarus/fpc/Free Pascal
移动应用开发
Web应用开发
数据库专区
报表专区
网络通讯
开源项目
论坛精华贴
≡发布区≡
发布代码
发布控件
文档资料
经典工具
≡事务区≡
网站意见
盒子之家
招聘应聘
信息交换
论坛信息
最新加入: tkzcol
今日帖子: 4
在线用户: 2
导航: 论坛 -> DELPHI技术 斑竹:liumazi,sephil  
作者:
男 jingzu (123456) ★☆☆☆☆ -
盒子活跃会员
2024/2/18 14:29:13
标题:
android 翻页动画 浏览:652
加入我的收藏
楼主: 用TMemo想做一个TXT文件android阅读器,怎么实现android 翻页动画?
----------------------------------------------
永远是DELPHI初学者。
作者:
男 tuao (tuao) ★☆☆☆☆ -
盒子活跃会员
2024/2/19 10:12:17
1楼: 做阅读器应该自绘才会好。
----------------------------------------------
tuao
作者:
男 qq81709989 (战石电子) ▲▲△△△ -
普通会员
2024/2/19 10:28:12
2楼: Delphi 10.4.2 轻松实现Android/IOS txt小说电子书阅读器应用APP翻页效果
https://download.csdn.net/download/xyzhan/15647843
----------------------------------------------
《Z-Gantt战石智慧时间管理进度计划甘特图软件》:WWW.Z-SHi.NET
作者:
男 pcplayer (pcplayer) ★☆☆☆☆ -
普通会员
2024/2/19 17:23:52
3楼: 翻页这种动画效果好说。

阅读器用什么来呈现文字?自己把文字画上去,还是用一个类似 RichEdit 或者 WebBrowser 之类的?有高人说一下吗?
----------------------------------------------
-
作者:
男 qq81709989 (战石电子) ▲▲△△△ -
普通会员
2024/2/19 22:19:34
4楼: //伪代码 
private
    { Private declarations }
    TextList: TStringList; //存储TXT文本的内容
    PageList: TArray<TStringList>; //存储TXT文本分割后的页面
    PageWidth, PageHeight: Integer; //每一页的宽度和高度
    PageLines, PageChars: Integer; //每一页可以显示的文本行数和字符数
    CurrentPage, TotalPage: Integer; //当前的页码和总页数
    procedure LoadTextFile(const FileName: string); //加载TXT文本文件
    procedure SplitPages; //将TXT文本分割成多个页面
    procedure ShowPage(PageIndex: Integer); //显示指定的页面
    procedure NextPage; //显示下一页
    procedure PrevPage; //显示上一页
  public
    { Public declarations }
  end;
procedure TForm1.FormCreate(Sender: TObject);
begin
  TextList := TStringList.Create;
  Image1.WrapMode := TImageWrapMode.iwStretch; //设置图片控件的缩放模式为拉伸
end;

procedure TForm1.FormResize(Sender: TObject);
begin
  PageWidth := Image1.Width; //根据图片控件的宽度设置每一页的宽度
  PageHeight := Image1.Height; //根据图片控件的高度设置每一页的高度
  PageLines := PageHeight div 20; //假设每行文本占20像素,计算每一页可以显示的文本行数
  PageChars := PageWidth div 10; //假设每个字符占10像素,计算每一页可以显示的字符数
  if TextList.Count > 0 then //如果已经加载了TXT文本文件,则重新分割页面并显示当前页
  begin
    SplitPages;
    ShowPage(CurrentPage);
  end;
end;

procedure TForm1.LoadTextFile(const FileName: string);
var
  Reader: TStreamReader;
begin
  TextList.Clear; //清空原有的文本内容
  Reader := TStreamReader.Create(FileName, TEncoding.UTF8); //创建一个TStreamReader对象,使用UTF8编码打开TXT文本文件
  try
    TextList.LoadFromStream(Reader.BaseStream); //从流中读取文本内容到TStringList对象中
  finally
    Reader.Free; //释放TStreamReader对象
  end;
  SplitPages; //将TXT文本分割成多个页面
end;

procedure TForm1.ShowPage(PageIndex: Integer);
var
  Canvas: TCanvas;
begin
  if (PageIndex > 0) and (PageIndex <= Length(PageList)) then //如果页码有效,则显示对应的页面
  begin
    CurrentPage := PageIndex; //更新当前页码
    TotalPage := Length(PageList); //更新总页数
    Canvas := Image1.Bitmap.Canvas; //获取图片控件的画布对象
    Canvas.BeginScene; //开始绘制场景
    try
      Canvas.Clear(TAlphaColors.White); //清空画布为白色背景
      Canvas.Fill.Color := TAlphaColors.Black; //设置画笔颜色为黑色
      Canvas.Font.Size := 16; //设置字体大小为16像素
      Canvas.FillText(RectF(0, 0, PageWidth, PageHeight), PageList[CurrentPage - 1].Text, False, 1, [], TTextAlign.Leading); //在指定的矩形区域内绘制当前页面的文本,使用左对齐方式
    finally
      Canvas.EndScene; //结束绘制场景
    end;
    Image1.Repaint; //重绘图片控件
    Caption := Format('第%d页/共%d页', [CurrentPage, TotalPage]); //更新表单的标题为当前页码和总页数
  end;
end;

procedure TForm1.NextPage;
begin
好的,这是继续的示例代码:

```delphi
  if CurrentPage < TotalPage then //如果当前不是最后一页,则显示下一页
  begin
    Inc(CurrentPage); //增加当前页码
    ShowPage(CurrentPage); //显示当前页
    FloatAnimation1.StartValue := PageWidth; //设置动画的起始值为页面的宽度
    FloatAnimation1.StopValue := 0; //设置动画的结束值为0
    FloatAnimation1.Start; //启动动画
  end;
end;

procedure TForm1.PrevPage;
begin
  if CurrentPage > 1 then //如果当前不是第一页,则显示上一页
  begin
    Dec(CurrentPage); //减少当前页码
    ShowPage(CurrentPage); //显示当前页
    FloatAnimation1.StartValue := -PageWidth; //设置动画的起始值为页面的负宽度
    FloatAnimation1.StopValue := 0; //设置动画的结束值为0
    FloatAnimation1.Start; //启动动画
  end;
end;

end.
----------------------------------------------
《Z-Gantt战石智慧时间管理进度计划甘特图软件》:WWW.Z-SHi.NET
作者:
男 abcjingtong (jingtong) ★☆☆☆☆ -
普通会员
2024/2/20 18:06:12
5楼: @pcplayer
基本上就是你说的那样,如果是纯文本会简单很多,基本上根据字体中的宽度高度信息和页面高度宽度,计算出共多少页,每一页开始行和结束度序号,然后显示对应页时就绘制该页的文本内容。图文汇排的复杂一些,有兴趣可以参考我开源的排版软件
gitee.com/HCView或https://github.com/abcjingtong,找delphi版本的源码。如果觉得看代码麻烦这里也有我录制的介绍排版原理的视频
HC排版原理介绍视频
链接:pan.baidu.com/s/1hx32otmVl768_SP8Y6p2iQ 密码:y6nr
HCView和外部交互介绍
链接:pan.baidu.com/s/1yYyGDnFQGMGWzowKXOLzLQ 密码:iklh

如果链接打不开,自己在最前面补充https://
----------------------------------------------
18114532@qq.com
作者:
男 pcplayer (pcplayer) ★☆☆☆☆ -
普通会员
2024/2/20 23:37:54
6楼: 多谢 4楼,关键的就是这句了:Canvas.FillText(RectF(0, 0, PageWidth, PageHeight), PageList[CurrentPage - 1].Text, False, 1, [], TTextAlign.Leading); //在指定的矩形区域内绘制当前页面的文本,使用左对齐方式

赞5楼,给出的资源,我要仔细去学一下。
----------------------------------------------
-
作者:
男 jingzu (123456) ★☆☆☆☆ -
盒子活跃会员
2024/2/21 8:29:10
7楼: SplitPages  请给出这个分页代码
----------------------------------------------
永远是DELPHI初学者。
作者:
男 qq81709989 (战石电子) ▲▲△△△ -
普通会员
2024/2/21 21:08:48
8楼: 注意:伪代码,提供思路,仅供参考
procedure TForm1.GestureManager1Gesture(Sender: TObject;
  const EventInfo: TGestureEventInfo; var Handled: Boolean);
begin
  case EventInfo.GestureID of //根据手势ID判断滑动方向,并执行相应的翻页操作
    sgiLeft:
      NextPage;
    sgiRight:
      PrevPage;
  end;
end;

procedure TForm1.SplitPages;
var
  I, J, K, L: Integer;
  Line, PageText: string;
begin
  SetLength(PageList, 0); //清空原有的页面
  I := 0; //当前的文本行索引
  J := 0; //当前的页面索引
  while I < TextList.Count do //遍历所有的文本行
  begin
    PageText := ''; //初始化当前页面的字符串为空
    K := 0; //当前页面的文本行数
    while (I < TextList.Count) and (K < PageLines) do //如果没有达到文本行数限制或者文本结束,则继续添加文本行到当前页面
    begin
      Line := TextList[I]; //获取当前的文本行
      if Line = '' then //如果是空行,则直接换页
      begin
        Inc(I);
        Break;
      end;
      L := Length(Line); //获取当前文本行的字符数
      if L <= PageChars then //如果当前文本行的字符数小于等于每一页的字符数限制,则直接添加到当前页面,并换行
      begin
        PageText := PageText + Line + sLineBreak;
        Inc(I);
        Inc(K);
      end
      else //如果当前文本行的字符数大于每一页的字符数限制,则分割成多个子串,并添加到当前页面,并换行
      begin
        while L > PageChars do
        begin
          PageText := PageText + Copy(Line, 1, PageChars) + sLineBreak;
          Delete(Line, 1, PageChars);
          Dec(L, PageChars);
          Inc(K);
          if K >= PageLines then //如果达到了文本行数限制,则换页,并退出循环
          begin
          Inc(I);
          Break;
          end;
        end;
        if L > 0 then //如果还有剩余的字符,则添加到当前页面,并换行
        begin
          PageText := PageText + Line + sLineBreak;
          Inc(I);
          Inc(K);
        end;
      end;
    end;
    SetLength(PageList, J + 1); //增加一个页面到TStringList数组中
    PageList[J] := TStringList.Create; //创建一个TStringList对象,用于存储当前页面的字符串
    PageList[J].Text := PageText; //将当前页面的字符串赋值给TStringList对象
    Inc(J); //增加当前页面的索引
  end;
end;
----------------------------------------------
《Z-Gantt战石智慧时间管理进度计划甘特图软件》:WWW.Z-SHi.NET
信息
登陆以后才能回复
Copyright © 2CCC.Com 盒子论坛 v3.0.1 版权所有 页面执行320.3125毫秒 RSS