在android上实现页面卷曲?

Posted

技术标签:

【中文标题】在android上实现页面卷曲?【英文标题】:Implement page curl on android? 【发布时间】:2011-04-24 04:38:58 【问题描述】:

我正在网上冲浪,寻找在 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 演示中找到了一个 Bitmap Mesh 示例:http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/graphics/BitmapMesh.html

也许有人可以帮助我解决一个方程式,只需将右上角向内折叠穿过页面以创建类似的效果,然后我可以应用阴影以使其更深入?

【问题讨论】:

【参考方案1】:

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

编辑:链接已更新。 编辑:丢失的文件已被推送到 repo。

【讨论】:

我将尽快提交一个新版本,它充当 ListView,因此您可以在其中添加任何类型的视图! 很有趣,但仍然需要一个独立的视图。 我在做 :D 当我有空的时候,一个不错的新版本会发布! 谢谢,可以添加很多图片,图片的反面不是白色的吗? @Moss,我检查了您的项目,但缺少 R.styleable.PageCurlView 和 R.layout.list_item。【参考方案2】:

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

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

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

在撰写本文时,我正在决定如何实现“假”软阴影 - 以及是否创建适当的应用程序来展示这种卷页效果。此外,这几乎是我做过的为数不多的 OpenGL 实现之一,不应过多地作为一个恰当的例子。

【讨论】:

无论如何,由于我的代码有些难以阅读,我使用的想法与您提供的代码非常相似。不同的是,我正在围绕圆柱体而不是圆锥体进行卷曲。这使得计算卷曲位置变得更加容易,以便卷曲的表面边缘始终跟随指针。最后,与实际计算相比,我在创建有效的三角带进行渲染方面花费了更多的精力。 谢谢!你的代码是我能够简单地放入“现有源”新项目并让它运行的第一个代码。 :-) @harism 好一个..我想要一些修改,图像应该适合横屏和竖屏的全屏。我到底需要在哪里修改你的代码? 嗨,harism,我查看了你的代码,这对我来说非常有用,但我有一个小问题,在我的应用程序中,我想像一本书一样显示页面,当页面卷曲时它的背面我想添加新页面(图像)而不是首页(图像)的阴影效果。我不知道该怎么做。等待您的答复。提前谢谢。 @harism 有计划增加对 Views 的支持吗?今天的示例仅显示图像。谢谢【参考方案3】:

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

虽然有可能使用 FrameLayout 和其中的自定义视图在 2D 中模拟类似的东西。

【讨论】:

好吧,我在 API 演示中找到了 Bitmapmesh,所以如果我可以创建一个网格,我肯定可以以某种方式对其进行转换吗?演示没有很好的记录,所以我很难弄清楚,但可以在这里找到:developer.android.com/resources/samples/ApiDemos/src/com/… 我设法掌握了网格,现在的问题是创建数学方程来对网格执行变换。 您好,是否可以在页面卷曲中使用操作栏滑动标签?

以上是关于在android上实现页面卷曲?的主要内容,如果未能解决你的问题,请参考以下文章

在 Android 上实现后台位置跟踪

如何在 Android 1.5 上实现推送?

如何使用 Cordova 在 Android 上实现打印?

在 Android 上实现推送通知的简单方法

在 Android 上实现 facebook 登录的最佳方法是啥?

在 Android 上实现推送通知时出错