Название: Эффект перелистывания страниц Отправлено: virtual_root от Август 06, 2012, 10:16 Добрый день ребята! Пишу простенькую программку "контакты". Вопрос касается внешнего вида. Форма программы представляет собой развернутую книгу. Где на левой стороне книги отображается список контактов, разбитых по группам, а с правой стороны книги отображается информация о выбранном контакте. Нужно сделать такой эффект: При выборе контакта с лева на правой стороне должна перелистываться страница книги, как будто мы открыли выбранный контакт.
Не знаю с чего начать работу над таким эффектом... Хотелось бы обойтись без openGL. Может у кого есть идеи реализации такого эффекта? Ребята подскажите пожалуйста, как такого добиться! P.S. Нравится эффект как на iPad - контакты. Хочу такое же сделать. Название: Re: Эффект перелистывания страниц Отправлено: Bepec от Август 06, 2012, 10:19 Подари мне ipad - я посмотрю как там сделано и тебе сделаю :D
PS GraphicsView позволяет делать всё что угодно. Название: Re: Эффект перелистывания страниц Отправлено: virtual_root от Август 06, 2012, 10:20 :D спасибо) А по подробней можно ?)
Вот картинка что примерно хочется. Название: Re: Эффект перелистывания страниц Отправлено: kambala от Август 06, 2012, 10:56 на хабре писали как сделать такую анимацию: приводились формулы и реализация под iOS
Название: Re: Эффект перелистывания страниц Отправлено: DmitryM от Август 06, 2012, 10:59 Если без OpenGL, то у объекта QPainter есть метод setTransform, с помощью которого устанавливается объект QTransform, который отвечает за повороты, масштабирование и др. преобразования.
Здесь самое сложное написать матрицу преобразования, т. к. все это в 2D. В OpenGL можно было бы использовать стандартную матрицу поворота. Название: Re: Эффект перелистывания страниц Отправлено: lighting от Август 06, 2012, 11:02 или QML. Фоном используешь раскрытую книгу, а для страницы задаешь анимацию поворота. Только центр поворота сместить надо - по умолчанию поворачиваться будет вокруг центра изображения.
Название: Re: Эффект перелистывания страниц Отправлено: Странник от Август 06, 2012, 12:29 Google в помощь - как-то мне попадалась анимация перелистывания страниц книги с использованием QML, но искать, простите, недосуг.
Название: Re: Эффект перелистывания страниц Отправлено: Igors от Август 06, 2012, 13:34 Анимация что Вы привели - жульничество, изображение не перспективное и не изометрическое :) Если это устраивает, то просто масштабируете по оси X, масштаб = cos(rotate_angle), а потом сдвигаете имедж по столбцам, заполняя краешки прозрачным цветом
Edit: хотя в принципе такой сдвиг тоже описывается матрицей. Попробуем сконструировать. Система координат: центр в левой верхней точке, Y идет вниз, значит с осью Y все ясно (0, 1). X смасштабирован да еще чуть повернут Код Ну и крутить QImage::transformed Название: Re: Эффект перелистывания страниц Отправлено: virtual_root от Август 06, 2012, 14:26 Спасибо вам ребята! Картинку что я привела, это примерно. Из ваших ответов решила всё таки с openGL повозиться, так как хочу потом и для iPad применить тот же эффект, а насколько мне известно openGL кроссплатформенен. В google нашла похожую статью: habrahabr.ru/post/132053/ (http://habrahabr.ru/post/132053/)
Название: Re: Эффект перелистывания страниц Отправлено: Bepec от Август 06, 2012, 14:28 ы. Вообще то и Qt кроссплатформенен :)
Название: Re: Эффект перелистывания страниц Отправлено: Igors от Август 06, 2012, 14:50 Спасибо вам ребята! Картинку что я привела, это примерно. Из ваших ответов решила всё таки с openGL повозиться, так как хочу потом и для iPad применить тот же эффект, а насколько мне известно openGL кроссплатформенен. В google нашла похожую статью: habrahabr.ru/post/132053/ (http://habrahabr.ru/post/132053/) Я стараюсь избегать OpenGL насколько возможно, но увы, это не всегда удается. Штука неплохая но очень много надо запоминать. Впрочем если много молодой памяти и силы - то почему нет, кому что нравится. Вот если надо гнуть страницы (bend), тогда использование OpenGL имеет смысл Название: Re: Эффект перелистывания страниц Отправлено: virtual_root от Август 06, 2012, 15:11 Да, странички должны сгибаться. На приведенной картинке немного по другому, проще изображено. Вот у меня тут вопрос всплыл. Если я openGL отрисую книгу и эффект этот сделаю, то потом возможно будет на странице отрисованной книги разместить стандартные компоненты Qt? Наверное многие уже пользовались openGL в Qt и смогут пояснить как это делается?
Я просто рисовала на openGL только в консольном проекте. Создавала форму средствами openGL и на ней рисовала, поэтому наверное чего-то не до понимаю. Название: Re: Эффект перелистывания страниц Отправлено: DmitryM от Август 06, 2012, 16:00 ы. Вообще то и Qt кроссплатформенен :) OpenGL платформонезависимый, а Qt кроссплатформенен только на наборе платформ.Название: Re: Эффект перелистывания страниц Отправлено: Igors от Август 06, 2012, 16:07 Да, странички должны сгибаться. На приведенной картинке немного по другому, проще изображено. Вот у меня тут вопрос всплыл. Если я openGL отрисую книгу и эффект этот сделаю, то потом возможно будет на странице отрисованной книги разместить стандартные компоненты Qt? Наверное многие уже пользовались openGL в Qt и смогут пояснить как это делается? Для OpenGL страница книги - просто 3D модель, которая, как обычно, состоит из полигонов - маленьких квадратиков, поэтому страница может гнуться. На модель наложена "текстура", т..е. картинка которая привязана к полигонам и гнется вместе с ними. Таким образом для OpenGL нужна картинка, все "компоненты Qt" ему до лампочки. Ну Вы можете отренедерить в картинку и подсунуть. Я просто рисовала на openGL только в консольном проекте. Создавала форму средствами openGL и на ней рисовала, поэтому наверное чего-то не до понимаю. OpenGL платформонезависимый, а Qt кроссплатформенен только на наборе платформ. Если уж умничать то надо сказать OpenGL карто/железо - зависимый что бывает куда больнее :)Название: Re: Эффект перелистывания страниц Отправлено: DmitryM от Август 06, 2012, 17:08 Если уж умничать то надо сказать OpenGL карто/железо - зависимый что бывает куда больнее :) Если в GPU нет поддержки соответствующей версии OpenGL, то расчеты идут через CPU.Название: Re: Эффект перелистывания страниц Отправлено: Bepec от Август 06, 2012, 17:31 ДмитрийМ - Qt настолько же кроссплатформенна как и OpenGl. Уж на военном тактическом компе, ни она, ни он не пойдут.
PS зуб даю :) Название: Re: Эффект перелистывания страниц Отправлено: virtual_root от Август 06, 2012, 17:33 Ребят, получается можно вообще свой компонент такой сделать - перелистываемая книга. А потом в qt его добавить и пользоваться им, так ?
только как вот сделать чтоб я на своем компоненте могла разместить другие компоненты, ну что-то наподобие Qwidget сделать. Я наверное чего-то не до понимаю... Название: Re: Эффект перелистывания страниц Отправлено: DmitryM от Август 06, 2012, 22:07 ДмитрийМ - Qt настолько же кроссплатформенна как и OpenGl. Уж на военном тактическом компе, ни она, ни он не пойдут. Проверено, на МСВС все идет ;)PS зуб даю :) OpenGL под Android,iOS есть, а Qt нормального под них нет. Название: Re: Эффект перелистывания страниц Отправлено: DmitryM от Август 06, 2012, 22:19 Ребят, получается можно вообще свой компонент такой сделать - перелистываемая книга. А потом в qt его добавить и пользоваться им, так ? Наверное стоит посмотреть сюда (http://www.prog.org.ru/index.php?topic=19458.msg131442#msg131442)только как вот сделать чтоб я на своем компоненте могла разместить другие компоненты, ну что-то наподобие Qwidget сделать. Я наверное чего-то не до понимаю... Название: Re: Эффект перелистывания страниц Отправлено: Bepec от Август 07, 2012, 06:56 Значит есть ненормальный :D Но есть.
А рассуждать так, что OpenGl пойдёт везде - это надеяться на бога. Ибо нет и никогда не будет всеобщих кроссплатформенных решений :) Название: Re: Эффект перелистывания страниц Отправлено: DmitryM от Август 07, 2012, 10:07 А рассуждать так, что OpenGl пойдёт везде - это надеяться на бога. Ибо нет и никогда не будет всеобщих кроссплатформенных решений :) Скажи, где нет OpenGL?Название: Re: Эффект перелистывания страниц Отправлено: Bepec от Август 07, 2012, 10:21 OpenGl - открытая графическая библиотека. Тебя устроит этот ответ? :)
Название: Re: Эффект перелистывания страниц Отправлено: virtual_root от Август 07, 2012, 10:25 Ребят, а можно же по идеи внешний вид формы перерисовать ? Переопределить какое-то событие в котором можно на opengl внешний вид формы отрисовать. Я тогда в виде своей книги и хочу форму прорисовать.
Название: Re: Эффект перелистывания страниц Отправлено: virtual_root от Август 07, 2012, 10:28 Мне всё-таки не понятно по вопросу с компонентом. Если я сделаю свой opengl проект в qt как мне его потом сделать компонентом для qt дизайнера ? Мне хочется чтоб можно было его потом на форму как компонент перетащить, а на него сверху другие компоненты положить. Запустить и всё работает)
Название: Re: Эффект перелистывания страниц Отправлено: DmitryM от Август 07, 2012, 10:34 OpenGl - открытая графическая библиотека. Тебя устроит этот ответ? :) Конечно нет, т. к. opengl по существу набор спецификаций, и является промышленным стандартом.Название: Re: Эффект перелистывания страниц Отправлено: Bepec от Август 07, 2012, 10:47 Увы и ах, но это спецификации направлены на железо. Если карточка старая(новая китайская) не поддерживает его, то нужно будет 3-4 самосвала с лесом, чтобы костылями его приляпать.
Да, он сейчас принят и поддерживается большинством производителей. Но большинство это не всё, как ни печально. PS и да, не путай МСВС и военный тактический комп :) Первое это ОС для военных нужд, ставящаяся на обычный комп. А второе это хрень, которая не выйдет никогда в широкую продажу и поддерживать opengl будет так-сяк скорее всего :) Самосвалы понадобятся. Название: Re: Эффект перелистывания страниц Отправлено: DmitryM от Август 07, 2012, 11:10 Увы и ах, но это спецификации направлены на железо. Если карточка старая(новая китайская) не поддерживает его, то нужно будет 3-4 самосвала с лесом, чтобы костылями его приляпать. Если не поддерживается GPU, вычисления идут через CPU.Да, он сейчас принят и поддерживается большинством производителей. Но большинство это не всё, как ни печально. Название: Re: Эффект перелистывания страниц Отправлено: virtual_root от Август 07, 2012, 11:54 Ребят, ответьте мне, пожалуйста.
У меня ещё вопрос по реализации на opengl: как мне так отрисовать страницу которая должна изгибаться и перелистываться но вместе с текстом который я на ней разместила(а размещать я планирую так: компонент qtextedit поверх правой страницы книги отрисовать). Может кто подскажет идею реализации ? Ведь если я буду пустую страницу перелистывать это будет сразу заметно... Название: Re: Эффект перелистывания страниц Отправлено: Bepec от Август 07, 2012, 11:58 Вам видимо надо будет брать изображение текущего содержимого страницы, тырить изображение в картинку и передавать в opengl. Как то так.
PS Платформонезависимого 100% решения нет. Есть решения, решающие задачи на определённом количестве платформ, но на всех увы. ДмитрийМ я больше не буду с тобой спорить :) Что по тебе горох, что по лбу тебе :) Печально когда стоят только на одной стороне дороги и кричат - я с левом стороны дороги! А ему в ответ - Нет, я с левой стороны дороги! :D Название: Re: Эффект перелистывания страниц Отправлено: virtual_root от Август 07, 2012, 12:17 нашла что хочу сделать на OpenGL! http://www.cecilfox.de/content.htm (http://www.cecilfox.de/content.htm)
Мне похоже нужна текстура динамической левой страницы, я правая меняться и не будет, просто надо поверх неё рисовть перелистывание. Название: Re: Эффект перелистывания страниц Отправлено: virtual_root от Август 07, 2012, 12:19 только вот вопрос с внедрением виджетов в страницу остаются... что-то до меня не доходит как мне так хитро с виджетами поступить..
Название: Re: Эффект перелистывания страниц Отправлено: Igors от Август 07, 2012, 15:21 нашла что хочу сделать на OpenGL! http://www.cecilfox.de/content.htm (http://www.cecilfox.de/content.htm) Конечно это Ваше дело чем заниматься. Но заметим что начинать изучение такой мощности как OpenGL просто для того чтобы "листать страницы" - скажем так, не очень практично. Ну даже если в конце-концов сделаете то листание - кого Вы этим удивите? Быстро найдется деятель который заявит что на XML (или др цацке) это делается "элементарно". Чего Вы лезете в кучу где и так много народа? Мне похоже нужна текстура динамической левой страницы, я правая меняться и не будет, просто надо поверх неё рисовть перелистывание. А творческие задачи есть, можно сказать, под носом. Ваша ссылка напомнила мне старую тему http://www.prog.org.ru/index.php?topic=14281.msg93215#msg93215 (http://www.prog.org.ru/index.php?topic=14281.msg93215#msg93215) И то уже не в UI керосин заливать и не по либам бегать - серьезная разработка Название: Re: Эффект перелистывания страниц Отправлено: virtual_root от Август 07, 2012, 15:28 меня попросили помочь такое сделать, и мне стало интересно. Хочу спросить, а можно как-то отобразить в сцене(QGraphicsScene) нарисованные на opengl фигуры? Или может рисовть средствами opengl прямо на сцене ?
Название: Re: Эффект перелистывания страниц Отправлено: DmitryM от Август 07, 2012, 17:54 меня попросили помочь такое сделать, и мне стало интересно. Хочу спросить, а можно как-то отобразить в сцене(QGraphicsScene) нарисованные на opengl фигуры? Или может рисовть средствами opengl прямо на сцене ? QPainter все равно, где рисовать виджет. Можешь посмотреть исходный код всяких fb читалок, имеющих ядро и куча разных интерфейсов. Там не используются стандартные виджеты, для отображения текста. Возможно самый простой способ использовать стек виджетов, на одной странице отображается нормальный виджет, а на второй странице виджет с анимацией, и переключаться между ними. Получить картинку с первого виджета можно при помощи QWidget::render. Название: Re: Эффект перелистывания страниц Отправлено: DmitryM от Август 07, 2012, 19:41 PS Платформонезависимого 100% решения нет. Есть решения, решающие задачи на определённом количестве платформ, но на всех увы. Open GL | ES есть на всех современных операционных системах с графическим пользовательским интерфейсом, поэтому код использующий opengl более переносим, чем qt.ДмитрийМ я больше не буду с тобой спорить :) Что по тебе горох, что по лбу тебе :) Печально когда стоят только на одной стороне дороги и кричат - я с левом стороны дороги! А ему в ответ - Нет, я с левой стороны дороги! :D |