2010-10-12 86 views
40

我在网上冲浪寻找在Android上翻页的好效果,但似乎并没有一个。因为我正在学习平台,所以能够做到这一点似乎是件好事。在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

也许有人可以帮助我在一个公式来简单地折叠在页面右上角诊断内部创建一个类似的效果,我可以稍后应用阴影来更深入地展示它?

回答

29

我刚刚创建了一个开放源代码项目,它使用本地画布在2D中进行页面卷曲模拟:https://github.com/moritz-wundke/android-page-curl 我仍然在努力添加适配器并使其可用作独立视图。

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

非常酷,继续,我认为你可以做得更好 – pengwang 2011-03-03 06:06:45

+0

我将尽快提交一个新的版本,作为一个ListView,所以你将能够添加任何种类的视图! – Moss 2011-04-06 09:01:36

+0

有趣但仍需要是独立的观点。 – Hamid 2011-04-12 08:07:13

0

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

在2D中使用FrameLayout和其中的自定义View来模拟类似的东西是可能的。

+0

那么我在API演示中找到了Bitmapmesh,所以如果我可以创建一个网格,当然我可以以某种方式转换它?该演示没有很好的记录,所以我有困难搞清楚,但它可以在这里找到:http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/ graphics/BitmapMesh.html – Hamid 2010-10-12 09:01:39

+0

我设法弄到了网格,现在的问题是创建数学方程来执行网格上的变换。 – Hamid 2010-10-12 13:10:05

+0

嗨,是否有可能在页面卷曲的动作栏刷卡选项卡? – Steve 2014-11-18 09:06:56

30

我正在使用的OpenGL ES目前在Android网页卷曲效果一些尝试。这实际上是一个草图,但也许给了一些想法如何实现页面卷曲满足您的需求。如果你对3D页面翻转实现感兴趣。

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

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

在写这个,我在决定如何实施“假”软阴影之中 - 以及是否创建一个合适的应用程序来炫耀此页面卷曲效果。这也是我所做过的极少数OpenGL实现之一,不应该被视为一个合适的例子。

+0

谢谢,我来看看。 – Hamid 2011-04-12 08:07:34

+0

无论如何,因为我的代码往往有些不可读,所以我使用的代码与您提供的代码非常相似。有了区别,我正在做一个圆筒而不是一个圆锥体卷曲。这使得计算卷曲位置变得更加容易,从而卷曲的曲面边缘始终跟随指针。最后,我花费了更多的精力来创建一个有效的渲染三角形条带,而不是进行实际的计算。 – harism 2011-04-12 11:24:09

+0

谢谢!你是第一个能够简单地打入“现有资源”新项目并使其运行的代码。 :-) – 2011-04-25 10:12:17