Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   почему не работает lineStyle? (http://www.flasher.ru/forum/showthread.php?t=161163)

Light 21.07.2011 13:48

почему не работает lineStyle?
 
Друзья, может кто-нибудь объяснить мне с чего actionscript меняет толщину отрисовываемых линий? Привожу пример:

Код AS3:

graphicWidth = getAllDays(startDateSeconds, nowDateSeconds)*(Graphic.oneDayWidthPixels/resolution);
 
                        grayRect.graphics.lineStyle(1);
                        grayRect.graphics.beginFill(0xc0c0c0, 1);
                        grayRect.graphics.moveTo(0, 0);
                        grayRect.graphics.lineTo(graphicWidth, 0);
                        grayRect.graphics.lineTo(graphicWidth, calendarHeigth);
                        grayRect.graphics.lineTo(0, calendarHeigth);
                        grayRect.graphics.lineTo(0, 0);

Поясняю. Переменная oneDayWidthPixels в классе Graphic типа Number отвечает за длину grayRect'а;
Если oneDayWidthPixels в классе Graphic равна 3 или меньше, то толщина линий grayRect'а получается нормальная - 1. А если больше 3 - то произвольная, выбранная, очевидно, по воле богов.

Не понимаю, почему lineStyle(1) не работает если oneDayWidthPixels > 3. Может я что-то забыл импортнуть, чтобы lineStyle работал корректно? я импортнул
Код AS3:

import flash.display.*;
        import flash.geom.*;

У кого-нибудь вообще такое было? Как решили?

ЗЫ. Да, и причем всегда меняется толщина только верхней и нижней линии, боковые остаются нормальными.

КорДум 21.07.2011 13:56

Переопределяйте сеттеры width и height, где отрисовывайте прямоугольник заново с бордюром. Из-за масштабирования толщина линии меняется. Или используйте так называемую волосяную линию, толщина которой 0. В таком случае тодщина будет ровно 1 пиксель при любом масштабе.

GBee 21.07.2011 13:58

есть метод drawRect ;о)

А какие значения у graphicWidth и calendarHeigth?


P.S. heigHT

Wolsh 21.07.2011 14:03

Ищите ошибку в другом месте. По этому обрывку ничего не понять. И конечно же здесь никакой роли не играет Graphic.oneDayWidthPixels, толщина линии задано хардом (1), а не переменной. Ищите скейл или изменение width хозяина графикса или его контейнеров, повторную отрисовку прямоугольника ( можно в начале отрисовки поставить grayRect.graphics.clear() ). И рассмотрите возможность вообще не пользоваться линейной обводкой, заменяя ее на заливку (два наслоенных прямоугольника).

Aquahawk 21.07.2011 14:04

Читайте доку, особое внимание обратите на параметр scaleMode

Light 21.07.2011 14:24

КорДум, да этот прямоугольник не масштабируется, пока что просто отрисовывается единожды с тем параметрами, которые заданы в приведенном коде. Попробовал поставить lineStyle(0) - никаких изменений в поведении, что еще более странно. Если lineStyle(0), то почему линия видна?

GBee, да, я знаю про drawRect:)
Просто когда увидел этот глюк, попробовал нарисовать прямоугольник по линиям - вдруг поможет? Не помогло.
calendarHeigth = 30
graphicWidth высчитывается и зависит от многих параметров. При oneDayWidthPixels = 4, graphicWidth = 60704, при oneDayWidthPixels = 3, graphicWidth = 45528

Wolsh, grayRect.graphics.clear() не помог. Прямоугольник у меня не отрисовывается повторно, только единожды. Да и если бы отрисовывался, логично было бы предположить, что увеличение толщины верхней и нижней линии прямоугольника происходит из-за растяжения прямоугольника по высоте, но height-то у него всегда фиксированный - 30, в отличие от width и ни в каком месте кода он не растягивается... Загадка...

Чувствую я, что вся загвоздка в том, что не работает lineStyle, а он не работает получается, раз на lineStyle(0) - ноль реакции. Почему может быть такое что задавая lineStyle(0) все равно рисуется видимая обводка?

Aquahawk 21.07.2011 14:27

Вы рисуете векторную шутку, она масштабируется в зависимости от настроек лайнстайла, их там много, проверьте scaleMode линиям какой вы задаёте. lineStyle(0) - особый случай, это однопиксельная линия которая при масштабировании остаётся однопиксельной.

Light 21.07.2011 14:30

Aquahawk, не помогло, сделал так:
Код AS3:

grayRect.graphics.lineStyle(0, 0x000000, 1.0, true, LineScaleMode.NONE);
                        grayRect.graphics.beginFill(0xc0c0c0, 1);
                        grayRect.graphics.moveTo(0, 0);
                        grayRect.graphics.lineTo(graphicWidth, 0);
                        grayRect.graphics.lineTo(graphicWidth, calendarHeigth);
                        grayRect.graphics.lineTo(0, calendarHeigth);
                        grayRect.graphics.lineTo(0, 0);

Как будто компилятор в упор не видит заданного lineStyle'а

t4arty 21.07.2011 14:37

в коде выше указано: grayRect.graphics.lineStyle(0, 0x000000, 1.0, true, LineScaleMode.NONE); - размер линии = 0.

в итоге: может Вы не видите ее (линию) ? (сливается с фоном, в альфе спрятана).

в дополнение: если меняется контейнер(размеры), где рисуется, то изменяется вся картинка в контейнере, отсюда вопрос, возможно у Вас меняется размер контейнера и от этого и линия рисуется другая?

DaFive 21.07.2011 14:41

Не пойму что не работает:
http://*************/s/14hoW - lineStyle 5.
http://*************/s/14hpw - 3.
http://*************/s/14hpK - 1.
Все меняет как надо (вне зависимости от width, height). Код взят ваш.

Light 21.07.2011 14:44

вот сделал скрины:
Это, если Graphic.oneDayWidthPixels = 3 [IMG]http://s2.************/uploads/20110721/0ugAWoSA.jpg[/IMG]
Это, если Graphic.oneDayWidthPixels = 4 [IMG]http://s2.************/uploads/20110721/9W6gVRzJ.jpg[/IMG]

вот код:
Код AS3:

graphicWidth = getAllDays(startDateSeconds, nowDateSeconds)*(Graphic.oneDayWidthPixels/resolution);
 
                        grayRect.graphics.lineStyle(1, 0x000000, 1.0, true, LineScaleMode.NONE);
                        grayRect.graphics.beginFill(0xc0c0c0, 1);
                        grayRect.graphics.drawRect(0, 0, graphicWidth, calendarHeigth);
                        grayRect.x = 0;
                        grayRect.y = 0;
                        this.addChild(grayRect);

grayRect - это фон для верхней полосы календаря. Как видите, тут та же проблема еще и у whiteRect на этой картинке...

Добавлено через 20 минут
t4arty, размеры контейнеров не меняются

DaFive, да у вас работает, а у меня видимо что-то влияет на толщину линий помимо lineStyle'а...

Добавлено через 28 минут
зы. абсолютно те же самые скрины получаются и при grayRect.graphics.lineStyle(0, 0x000000, 1.0, true, LineScaleMode.NONE);

КорДум 21.07.2011 15:13

На скринах толщина линий одна и та же.

Light 21.07.2011 15:16

КорДум, как одна и та же? На втором скрине нижние и верхние линии значительно толще чем на первом.

Добавлено через 4 минуты
вот, для наглядности, что выдает при Graphic.oneDayWidthPixels = 10
[IMG]http://s2.************/uploads/20110721/eWw1rzK1.jpg[/IMG]

DaFive 21.07.2011 15:25

Протрейсите ради спортивного интереса что там такого в graphicWidth и calendarHeigth.

Добавлено через 5 минут
Вооо. Таки поймал :)))
Скрин

Добавлено через 6 минут
То есть получается, что длина прямоугольника большая слишком. Ну я так подразумеваю.

GBee 21.07.2011 15:33

Цитата:

calendarHeigth = 30
graphicWidth высчитывается и зависит от многих параметров. При oneDayWidthPixels = 4, graphicWidth = 60704, при oneDayWidthPixels = 3, graphicWidth = 45528
Древний баг, слишком большие размеры, как я и думал :о)).

Добавлено через 2 минуты
Не надо рисовать, то что не видно или не скролится. Вам эту рамку как раз надо в пределах видимой части.

DaFive 21.07.2011 15:38

Правильно GBee говорит. Если на то пошло, то скроллить чисто цифры да буквы. Причем тоже плохо их все сразу в зависимости от присланных параметров размещать за областью видимости.

Light 21.07.2011 15:38

потрейсил.
вот ширина и высота при oneDayWidthPixels =3
45528
30

а вот при oneDayWidthPixels = 4
60704
30

DaFive 21.07.2011 15:39

Осталось поменять логику скролла, а с проблемой, вроде как разобрались.

Light 21.07.2011 15:39

оо, не думал, что слишком большие размеры могут создавать баги, ладно, тогда буду переделывать, спасибо!

GBee 21.07.2011 15:40

угу а максимум, вроде, 2500 с чем-то.

DaFive 21.07.2011 15:43

Цитата:

In AIR 1.5 and Flash Player 10, the maximum size for a bitmap image is 8,191 pixels in width or height, and the total number of pixels cannot exceed 16,777,215 pixels. (So, if a bitmap image is 8,191 pixels wide, it can only be 2,048 pixels high.) In Flash Player 9 and earlier, the limitation is is 2880 pixels in height and 2,880 pixels in width.
Взято из мануала по дисплейобжекту.
DisplayObject

Light 21.07.2011 16:00

Спасибо всем:) Теперь я умудрен опытом)

КорДум 21.07.2011 16:28

Цитата:

КорДум, как одна и та же? На втором скрине нижние и верхние линии значительно толще чем на первом.
А, ширина линии, а не толщина.


Часовой пояс GMT +4, время: 04:03.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.