PDA

Просмотр полной версии : Если кому интересно, как сделать Zoom c центрированием


Chilly
21.08.2005, 17:33
Я тут на форуме много тем поэтому поводу делал, но никто не знал как такое сделать. Я имею ввиду в ScrollPane. Я сделал сам. Если кому интересно, вот код:myScrollPane.content._xscale = 100;
myScrollPane.content._yscale = 100;
var Const_Koef = 2;
var koef = 1;
var siz = 100;
var PicCentX = myScrollPane.width/2;
var PicCentY = myScrollPane.height/2;
var TmpScrollh = 0;
var TmpScrollv = 0;
var MousePosX = 0;
var MousePosY = 0;
var ContW = myScrollPane.content.width;
var ContH = myScrollPane.content.height;
myScrollPane.vPosition = 0;
myScrollPane.hPosition = 0;
but_inc.onRelease = function() {
koef = Const_Koef;
};
but_dec.onRelease = function() {
koef = 1/Const_Koef;
};
but_res.onRelease = function() {
koef = 1;
};
Delta = function () {
dx = MousePosX+TmpScrollh;
dy = MousePosY+TmpScrollv;
ShP = dx/ContW;
SvP = dy/ContH;
if (ShP<0) {
ShP = 0;
}
if (SvP<0) {
SvP = 0;
}
ShP = ShP*myScrollPane.content.width-PicCentX;
SvP = SvP*myScrollPane.content.height-PicCentY;
myScrollPane.onComplete();
if (ShP>myScrollPane.maxHPosition) {
ShP = myScrollPane.maxHPosition;
}
if (SvP>myScrollPane.maxVPosition) {
SvP = myScrollPane.maxVPosition;
}
myScrollPane.hPosition = ShP;
myScrollPane.vPosition = SvP;
};
_root.myScrollPane.spContentHolder.onRelease = function() {
repaint();
};
function repaint() {
if (!((siz == 100 and koef == 0.5) or (siz >> 2000))) {
siz *= koef;
}
TmpScrollh = myScrollPane.hPosition;
TmpScrollv = myScrollPane.vPosition;
MousePosX = myScrollPane._xmouse;
MousePosY = myScrollPane._ymouse;
ContW = myScrollPane.content.width;
ContH = myScrollPane.content.height;
myScrollPane.refreshPane();
myScrollPane.content._xscale = siz;
myScrollPane.content._yscale = siz;
Delta();
myScrollPane.spContentHolder.onRelease = function() {
repaint();
};
}

alikjan
18.12.2005, 20:29
Меня тоже интересует эта тема
только вот воспользоваться твоим кодом сложновато
Мог бы ты немного прокомментировать свой код ?? ;)

Antares
18.12.2005, 21:29
Я бы оформил функцией то, что выкладываю "во всеобщее пользование". И использовал нормальные имена переменных \ методов, а не а-ля Д. Гурский ;)

St. Father
15.05.2006, 14:40
...все это хорошо.... тока вот как замутить то же самое на колесико мыши?
если есть примеры со ScrollPane zoom MouseWheel - дайте линк плиз.
в аттаче фла с картой. скроллпане. зум. 2 варианта решения...
один глючит, второй не работает))))
код прокомментирован. там же описаны проблемы обоих вариантов. парюсь 2й день. туплю жутко. помогите чем можете плз.
З.Ы.: пробую переделать "описанный" выше вариант... но как-то не могу воткнуть...

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

kurt84
18.05.2006, 11:42
Вот вариант. работает гораздо быстрее. И главное - работает :)


function zoomIn(z){
if(_root.mapf._width<1500){ //максимальный размер
_width+=z*(20); //приращение
_height+=z*(20);
}
}
function zoomOut(z){
if(_root.mapf._width>480){
_root.mapf._width-=z*(20);
_root.mapf._height-=z*(20);
if(_root.mapf._width<480) _root.mapf._width=480; //минимальный размер карты
if(_root.mapf._height<480) _root.mapf._height=480;

var xneed=_root.mapf._width+_root.mapf._x, //если сместилась не так как надо - поправляем.
yneed=_root.mapf._height+_root.mapf._y;

if(xneed<480) _root.mapf._x+=480-xneed;
if(yneed<480) _root.mapf._y+=480-yneed;
}
}

var mouseListener:Object = new Object();
mouseListener.onMouseWheel = function(delta) {
if(delta>0) zoomIn(1);
else zoomOut(1);
}
Mouse.addListener(mouseListener);

St. Father
18.05.2006, 16:08
у меня рабочих вариантов с центрированием около 4х. и они оптимальнее предложенного. НО в них не используется контейнер с прокруткой.
Возможно, я не совсем точно суть проблемы описал...
Повторю. Меня интересует зум колесиком в каком-либо контейнере (типа стандартного ScrollPane). если есть аналог СП в котором это реализовано (см. пример) && аффтару невлом дать свою компоненту - то я буду тока рад. :)

З.Ы. Если кто-то смотрел, во втором моем варианте, похоже, неправильно составлена пропорция. Точнее, она вроде логична, но максимально возможная позиция бегунка меняется абсолютно нелогично, непропорционально :(
А в первом, видимо, нужно позиции бегунков менять по отдельности (т.е. один если 1 +, то другой м.б. -)

St. Father
18.05.2006, 16:42
Попробовал, значит первый вариант чутка переделать. вышло чудо... зацените... пока самый рабочий вариант)
Если есть предложения по оптимизации кода - прошу...

vecalion
18.05.2006, 17:05
Если есть предложения по оптимизации кода - прошу...

Можешь масштаб использовать качестве делителя для дельты при передвижении, тогда при любом зуме передвижение будет одинаковое (то место, в котором нажал кнопку после передвижения и останется под курсором, а не так, как сейчас - при зуме в 50% нажимаешь кнопку, передвигаешь мышку на 10 пикселей, а карта передвигается только на 5 пикселей) :)