PDA

Просмотр полной версии : Подскажите пожалуйста, как это можно реализовать?


mr.oizo
03.12.2009, 16:46
Есть такой проект - scribd.com (http://scribd.com), это онлайновый просмотрщик и хранилище документов любого формата. Сначала документ конвертится в pdf, потом с помощью swftools: pdf->swf. Эта свф-ка представляет собой movieclip с фреймами, в каждом из которых содержится одна страница из pdf. Потом этот мувик прогружается во вьювер и показывается в нескольких модах (book, scroll, slideshow)

Есть задача, реализовать режим scroll из этого вьювера (т.е режим как в adobe reader-е):

http://image-board.appspot.com/agtpbWFnZS1ib2FyZHINCxIFSW1hZ2UYqY4CDA

Но оказывается, в классе MovieClip невозможно вырезать отдельные фреймы, чтобы в проследствии раскидать их по контейнерам в скролл-панели своего вьювера. И как к этой задаче подойти, я не знаю. Была мысль делать копии этого MovieClip-a и при добавлении в нужный контейнер перематывать до нужного кадра, однако когда будет 500 кадров в мувике (и соответственно нужно будет 500 контейнеров для страниц и 500 копий этого мувика), при весе его в 5 метров - это по-моему плохая идея.

Кто что может подсказать для решения этой задачи? Заранее спасибо.

iflamberg
03.12.2009, 16:53
на экране-то умещаются только две-три страницы. Т.е. вам нужно всего две-три копии мувика.

mr.oizo
03.12.2009, 17:09
А если делать функцию preview (tile-list с 16-25-36 кадрами) - как в scribd viewer? Как быть в этом случае, что посоветуете?

Jewelz
03.12.2009, 17:22
отрисуйте тумбы с каждого кадра в BitmapData

mr.oizo
03.12.2009, 17:28
2Jewelz: А не подскажете код, чет не соображу (еще почти новичек во флеше), как фрейм из мувика перегнать в BitmapData посредством as3?

Вот сижу, и не вижу в классе MovieClip ни одного подходящего для этой задачи метода...

xpymbl4
03.12.2009, 17:31
BitmapData 500 раз? Вам не кажется это плохой идеей?

Добавлено через 5 минут
А вообще:
mcForBitmap.gotoAndStop(499);
var jpgSource:BitmapData = new BitmapData (mcForBitmap.width, mcForBitmap.height);
jpgSource.draw(mcForBitmap);

iflamberg
03.12.2009, 17:37
нормально все будет. только не в цикле, чтобы комп завис, а на enterFrame по, скажем, 50 битмап за раз. Вообще, опять же можно отрисовывать битмапы по мере надобности.

Автор, вам нужна функция BitmapData.draw();

mr.oizo
03.12.2009, 17:40
Все понял, спасибо большое. Попробую.

Jewelz
03.12.2009, 17:43
BitmapData 500 раз? Вам не кажется это плохой идеей?


вроде как человек хочет 16-25-36 страниц отобразить.. 500 сразу думаю никому не надо

+ не в полном размере делать, а именно тумбы, вобщем думаю так:

private function getFrame(index:uint):Bitmap
{
if ((index != 0) && (index <= mc.totalFrames))
{
mc.gotoAndStop(index);

var m:Matrix = new Matrix();
var size:Number = 0.2; // на сколько уменьшаем
m.scale(size, size);

var bmpd:BitmapData = new BitmapData(mc.width * size, mc.height * size);
bmpd.draw(mc, m, null, null, null, true);

return new Bitmap(bmpd, PixelSnapping.AUTO, true);
}else {
return null;
}
}

CrazyFlasher
03.12.2009, 17:49
с BitmapData у вас не прокатит сделать поиск и выделение по тексту ;-)

создавали что-то подобное (даже покруче scribda получилось :) )

iflamberg
03.12.2009, 17:54
ну, там, скорее всего уже потеряна возможность поиска на этапе "произвольный документ=>pdf=>swf"

CrazyFlasher
03.12.2009, 18:13
ну, там, скорее всего уже потеряна возможность поиска на этапе "произвольный документ=>pdf=>swf"

нет...swftools может делать статик тексты, чего вполне достаточно для создания фичи выделения и поиска.

Правда мы чутка меняли тему с конвертацией из пдф в свф, чтоб все страницы были в 1 фрейме как мувики, чтоб потом брать из source компонента нужные и т.д, т.к. bitmapdata не катит

mr.oizo
03.12.2009, 18:19
2CrazyFlasher: а если не секрет, поделитесь решением, если не жалко?

UPD: Недочитал, понял как вы сделали, спасибо за намек.