在Android上实现页面卷曲?

时间:2010-10-12 08:39:16

标签: android math transition

我在网上冲浪寻找在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?我能以某种方式模仿这种行为吗?

任何帮助将不胜感激。感谢。

**************** EDIT ****************************** ****************

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

也许有人可以帮我解决一个方程式,简单地在页面上向内折叠右上角以创建一个类似的效果,我可以在以后应用阴影来更深入地了解它?

3 个答案:

答案 0 :(得分:31)

我正在使用OpenGL ES对Android上的页面卷曲效果进行一些实验。它实际上是一个草图,但可能会给出一些如何根据您的需求实现页面卷曲的想法。如果您对3D页面翻转实现感兴趣,那就是。

至于你所指的公式 - 我试了一下,并不喜欢结果太多。我说它根本不适合小屏幕而且开始破解更简单的解决方案。

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

写这篇文章的时候,我正在决定如何实现'假'软阴影 - 以及是否创建一个合适的应用程序来炫耀这个页面的卷曲效果。这也是我做过的极少数OpenGL实现中的一个,不应该被视为一个恰当的例子。

答案 1 :(得分:29)

我刚创建了一个开源项目,该项目使用原生画布在2D中进行页面卷曲模拟:https://github.com/moritz-wundke/android-page-curl 我还在努力添加适配器,以使其可用作独立视图。

  • 编辑:链接已更新。
  • 编辑:缺少文件已被推送回购。

答案 2 :(得分:0)

我很确定,你必须使用OpenGL才能获得很好的效果。基本UI框架的功能非常有限,您只能使用动画对视图进行基本转换(alpha,translate,rotate)。

可以使用FrameLayout在其中模仿类似的东西,并在其中使用自定义视图。