在安卓上实现页面翻页效果?

40

我在浏览网页,寻找一种在Android上实现翻页效果的方法,但似乎并没有。由于我正在学习这个平台,能够做到这一点似乎是一件很好的事情。

我找到了这个页面:http://wdnuon.blogspot.com/2010/05/implementing-ibooks-page-curling-using.html

- (void)deform
{
  Vertex2f  vi;   // Current input vertex
  Vertex3f  v1;   // First stage of the deformation
  Vertex3f *vo;   // Pointer to the finished vertex
CGFloat R, r, beta;
  for (ushort ii = 0; ii < numVertices_; ii++)
  {
    // Get the current input vertex.
    vi    = inputMesh_[ii];                       
    // Radius of the circle circumscribed by vertex (vi.x, vi.y) around A on the x-y plane
    R     = sqrt(vi.x * vi.x + pow(vi.y - A, 2)); 
    // Now get the radius of the cone cross section intersected by our vertex in 3D space.
    r     = R * sin(theta);                       
    // Angle subtended by arc |ST| on the cone cross section.
    beta  = asin(vi.x / R) / sin(theta);       

// *** MAGIC!!! ***
v1.x  = r * sin(beta);
v1.y  = R + A - r * (1 - cos(beta)) * sin(theta); 
v1.z  = r * (1 - cos(beta)) * cos(theta);
// Apply a basic rotation transform around the y axis to rotate the curled page.


 // These two steps could be combined through simple substitution, but are left
    // separate to keep the math simple for debugging and illustrative purposes.
    vo    = &outputMesh_[ii];
    vo->x = (v1.x * cos(rho) - v1.z * sin(rho));
    vo->y =  v1.y;
    vo->z = (v1.x * sin(rho) + v1.z * cos(rho));
  }  
}

这篇文章提供了一个iPhone的示例代码,但我不知道如何在Android上实现它。有没有数学大神可以帮我解决,在Android Java中该如何实现这个效果。

是否可以使用本地绘图API来实现,还是必须使用openGL?我能否以某种方式模仿其行为?

非常感谢任何帮助。谢谢。

****************编辑**********************************************

我在Android API示例中找到了一个位图网格示例:http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/graphics/BitmapMesh.html

也许有人可以帮我设计一个方程,将右上角的纸角斜向折叠到页面上,从而创建类似的效果,我稍后可以应用阴影来增加深度?

3个回答

31

我目前正在进行关于在Android上使用OpenGL ES实现页面翻页效果的实验。这个实验还很粗糙,但或许可以给你一些如何为你的需要实现页面翻页的想法。如果你对实现3D页面翻转感兴趣的话。

至于你提到的公式 - 我尝试了一下,但并不是很喜欢结果。我会说它在小屏幕上并不是很适合,并开始尝试更简单的解决方案。

代码可以在这里找到: https://github.com/harism/android_page_curl/

在写这篇文章的时候,我正在考虑如何实现“假”软阴影 - 以及是否创建一个适合展示这种页面翻页效果的正确应用程序。此外,这几乎是我所做过的为数不多的OpenGL实现之一,不应该被视为一个恰当的例子。


无论如何,由于我的代码往往难以阅读,我正在使用与您提供的代码非常相似的想法。不同之处在于,我是在圆柱体周围进行卷曲,而不是锥体。这使得计算卷曲位置变得更加容易,以便卷曲表面边缘始终跟随指针。最后,我花费了更多的精力来创建有效的三角形带以进行渲染,而不是进行实际计算。 - harism
谢谢!你的代码是我第一个能够轻松地添加到“现有源”新项目中并运行的。 :-) - Thunder Rabbit
@harism 不错..我想要一些修改,使图像在横屏和竖屏模式下都能适应全屏。请问我需要在你的代码中进行哪些修改? - vnshetty
嗨,哈里斯姆,我看了你的代码,对我非常有用,但是我有一个小问题,在我的应用程序中,我想像一本书一样显示页面,当页面翻页到背面时,我想添加新的页面(图像),而不是前一页(图像)的阴影效果。我不知道该怎么做。期待您的回复。提前感谢。 - user370305
2
@harism 有计划添加对Views的支持吗?今天的示例只显示了图像。谢谢。 - Thiago
@harism 我看了你的代码,非常不错,但是当它从右下角被卷起一半时该如何停止这个curl页面?请指导我。 - Vishesh Chandra

29

我刚刚创建了一个开源项目,它使用本地画布提供2D页面翻转模拟:https://github.com/moritz-wundke/android-page-curl

我仍在努力添加适配器等功能,以使其能够作为独立视图使用。

  • 编辑:链接已更新。
  • 编辑:缺少的文件已推送至代码库。

@AdilMalik 感谢您指出这一点,似乎该应用程序的维护者已将其从商店中删除。 - Moss
@Moss,我在epub图书的翻页动画中遇到了问题,其中翻页动画变得透明。我不知道为什么会这样?你能否就此提供任何解决方案? - Sanat Pandey
@SanatPandey 整个画布都变成透明的了吗? - Moss
@SanatPandey 你能验证一下它的颜色是否在alpha组件中以某种方式设置为0吗? - Moss
我们可以自动播放这些Curl页面吗? - Riddhi Shah
显示剩余12条评论

0

我相信,如果你想要一个好的效果,你需要使用OpenGL。基本的UI框架能力非常有限,你只能使用动画在视图上进行基本的变换(alpha、translate、rotate)。

虽然可能可以使用FrameLayout和其中的自定义视图来模拟类似于2D的效果。


我在API演示中找到了Bitmapmesh,所以如果我可以创建一个网格,那么我肯定可以以某种方式对其进行转换?这个演示文稿没有很好的文档说明,所以我很难弄清楚,但是它可以在这里找到:http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/graphics/BitmapMesh.html - Hamid
我已经得到了网格,现在的问题是创建数学方程来对网格执行变换。 - Hamid
你好,在页面翻页中是否可以使用操作栏滑动选项卡? - Stephen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接