Реализовать скручивание страницы на андроиде? - PullRequest
40 голосов
/ 12 октября 2010

Я занимался серфингом в сети в поисках приятного эффекта перелистывания страниц на 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 ****************************** ****************

Я нашел пример Bitmap Mesh в демоверсиях API Android: http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/graphics/BitmapMesh.html

Может быть, кто-то мог бы помочь мне с уравнением, чтобы просто с помощью диагонально согнуть верхний правый угол внутрь страницы, чтобы создать аналогичный эффект, к которому я позже смогу применить тени, чтобы получить большую глубину?

Ответы [ 3 ]

31 голосов
/ 12 апреля 2011

Я сейчас экспериментирую с эффектом скручивания страницы на Android, используя OpenGL ES.На самом деле это довольно набросок, но, возможно, дает представление о том, как реализовать скручивание страниц для ваших нужд.Если вы заинтересованы в реализации трехмерного перелистывания страниц.

Что касается формулы, на которую вы ссылаетесь - я попробовал ее, и результат мне не очень понравился.Я бы сказал, что он не очень хорошо подходит для маленького экрана и начал взламывать более простое решение.

Код можно найти здесь: https://github.com/harism/android_page_curl/

Во время написания этого яв разгар принятия решения о том, как реализовать «искусственные» мягкие тени, и о том, создавать ли правильное приложение для демонстрации эффекта скручивания страницы.Кроме того, это в значительной степени одна из очень немногих реализаций OpenGL, которую я когда-либо делал, и не стоит воспринимать ее как хороший пример.

29 голосов
/ 28 февраля 2011

Я только что создал проект с открытым исходным кодом, в котором реализована симуляция скручивания страницы в 2D с использованием собственного холста: https://github.com/moritz-wundke/android-page-curl Я все еще работаю над этим, чтобы добавить адаптеры и тому подобное, чтобы сделать его пригодным для использования в качестве автономного представления.

  • РЕДАКТИРОВАТЬ: ссылки обновлены.
  • РЕДАКТИРОВАТЬ: отсутствующие файлы были отправлены в репо.
0 голосов
/ 12 октября 2010

Я почти уверен, что вам придется использовать OpenGL для хорошего эффекта.Возможности базовой инфраструктуры пользовательского интерфейса весьма ограничены, вы можете выполнять только базовые преобразования (альфа, переводить, вращать) в представлениях с использованием анимации.

То есть возможно воспроизвести что-то подобное в 2D с помощью FrameLayout и пользовательского просмотра в нем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...