Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 1.0/2.0 (http://www.flasher.ru/forum/forumdisplay.php?f=93)
-   -   Реальные размеры объекта TextField (http://www.flasher.ru/forum/showthread.php?t=97958)

Friday13 05.07.2007 10:12

Какой именно??
http://www.friday13.pisem.net/
у всех прямоугольников верхняя левая точка это TextField[_x, _y]
Зеленый прямоугольник - TextField.getTextFormat().getTextExtent(TextField.text)[width, height]
Красный прямоугольник TextField[_width, _height]
Синий прямоугольник TextField[textWidth, textHeight]

iNils 05.07.2007 10:30

Цитата:

Сообщение от Friday13
Какой именно??

вот этот http://www.flasher.ru/forum/showpost...6&postcount=26
битмапа используется не для того, чтобы передать саму картинку, а чтобы определить истинные размеры

Friday13 05.07.2007 10:37

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

iNils 05.07.2007 10:40

Код киньте :) Аттачи временно не работают.

Friday13 05.07.2007 10:41

Блин.. на ChinaCyr код работает, для Dollar глючит:(((

в Stage нужно создать текстовое поле, обозвать z, внедрить нужные фонты, написать что нибудь в нем, конвертнуть в символ MovieClip и обозвать тоже z

Код:

import flash.display.BitmapData;
import flash.geom.Rectangle;
import flash.geom.Matrix;
import flash.geom.ColorTransform;
trace(getTimer());
z.z.autoSize = "left";
var myBitmapData:BitmapData = new BitmapData(z._width * 1.3, z._height * 1.3, false, 0x00000000);
var mc_1:MovieClip = this.createEmptyMovieClip("mc", this.getNextHighestDepth());
mc_1.attachBitmap(myBitmapData, this.getNextHighestDepth());
mc_1._x = 10;
mc_1._y = 10;
z.autoSize = "left";
var myMatrix:Matrix = new Matrix();
myMatrix.ty = z._width * 0.15;
myMatrix.ty = z._height * 0.15;
myMatrix.scale(z._xscale / 100, z._yscale / 100);
mc.onMouseDown = function() {
        var alpha:String = (myBitmapData.getPixel32(this._xmouse, this._ymouse) >> 24 & 0xFF).toString(16);
        trace(">> alpha: " + alpha);
        // ff
        var red:String = (myBitmapData.getPixel32(this._xmouse, this._ymouse) >> 16 & 0xFF).toString(16);
        trace(">> red: " + red);
        // aa
        var green:String = (myBitmapData.getPixel32(this._xmouse, this._ymouse) >> 8 & 0xFF).toString(16);
        trace(">> green: " + green);
        // cc
        var blue:String = (myBitmapData.getPixel32(this._xmouse, this._ymouse) & 0xFF).toString(16);
        trace(">> blue: " + blue);
        // ee
        trace("0x" + alpha + red + green + blue);
        // 0xffaaccee
};
var myColorTransform:ColorTransform = new ColorTransform(0, 0, 1, 1, 0, 0, 255, 0);
var blendMode:String = "normal";
var myRectangle:Rectangle = new Rectangle(0, 0, z._width * 1.3, z._height * 1.3);
var smooth:Boolean = false;
myBitmapData.draw(z, myMatrix, myColorTransform, blendMode, myRectangle, smooth);
var colorBoundsRect:Rectangle = myBitmapData.getColorBoundsRect(0xff0000FF, 0xFF000000, false);
trace(colorBoundsRect);
var my = this.createEmptyMovieClip("my", this.getNextHighestDepth());
my._x = colorBoundsRect.x + 10;
my._y = colorBoundsRect.y + 10;
my.lineStyle(0.25, 0xffffff);
my.lineTo(colorBoundsRect.width, 0);
my.lineTo(colorBoundsRect.width, colorBoundsRect.height);
my.lineTo(0, colorBoundsRect.height);
my.lineTo(0, 0);
trace(getTimer());

ПАЛУЧИЛАСЬ!

Всем спасибо:)

iNils 05.07.2007 11:41

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

Что-то код слишком громоздкий. Мой вариант:
Код:

function getSize (txt:TextField):Object {
        var bmp:BitmapData = new BitmapData (Math.ceil (txt._width), Math.ceil (txt._height), true, 0x00);
        var bmpW:BitmapData = new BitmapData (1, bmp.height, true, 0x00);
        var bmpH:BitmapData = new BitmapData (bmp.width, 1, true, 0x00);
        bmp.draw (txt);
        var offsetW:Number = 0;
        var offsetH:Number = 0;
        var i:Number = bmp.width;
        while (i > 0 && !bmp.hitTest (new Point (0, 0), 1, bmpW, new Point (i, 0), 0)) {
                i--;
        }
        offsetW = i;
        i = 0;
        while (i < bmp.width && !bmp.hitTest (new Point (0, 0), 1, bmpW, new Point (i, 0), 0)) {
                i++;
        }
        offsetW -= i - 2;
        ////
        i = bmp.height;
        while (i > 0 && !bmp.hitTest (new Point (0, 0), 1, bmpH, new Point (0, i), 0)) {
                i--;
        }
        offsetH = i;
        i = 0;
        while (i < bmp.height && !bmp.hitTest (new Point (0, 0), 1, bmpH, new Point (0, i), 0)) {
                i++;
        }
        offsetH -= i - 2;
        return {w:offsetW, h:offsetH};
}
var o:Object = getSize (txt);
trace (o.w + " " + o.h);


Friday13 05.07.2007 12:04

А координаты текстового поля? верхнего левого пикселя?

У меня в коде много мусора:) Вспомогательного, я не почистил, на радостях бросил все что было в фрейме.

silin 05.07.2007 12:06

можно еще так попробовать
Код:

function getSize (txt:TextField):Object {
        var bmp:BitmapData = new BitmapData (Math.ceil (txt._width), Math.ceil (txt._height), true, 0);
        bmp.draw (txt);
        var rec:Rectangle=bmp.getColorBoundsRect(0xFF000000, 0x00000000,false);
        return {w:rec.width, h:rec.height};
}

если надо с координатами TL угла
Код:

function getSize (txt:TextField):Rectangle {
        var bmp:BitmapData = new BitmapData (Math.ceil (txt._width), Math.ceil (txt._height), true, 0);
        bmp.draw (txt);
        return bmp.getColorBoundsRect(0xFF000000, 0x00000000,false);
}


iNils 05.07.2007 12:21

Еще лучше :) Но у меня получилось, что к ширине и высоте надо по пикселю добавлять.

Friday13 05.07.2007 12:22

Цитата:

Сообщение от silin
bmp.draw (txt);

гы... чего то отказался метод draw рисовать объект TextField

etc 05.07.2007 13:05

У меня тоже не работает draw на текст.

iNils 05.07.2007 14:35

Не знаю почему, но draw может работать с эмбед шрифтом, только, если стоит Anti-alias for animation или BitmapText, иначе надо помещать текстовое поле в мувиклип.

silin 05.07.2007 15:05

странно, что сейчас у меня все рисует..
но в одном проекте был такой затык, решился через blendMode метода draw:
bmp.draw(txt,new Matrix(),null,"layer",null,true);
не все вполне ясно с этими текстфилдами..

iNils 05.07.2007 15:26

blendMode по барабану, антиалисинг какой стоит?

silin 05.07.2007 15:43

дада, blendMode не решает: для ембеденного шрифта и anti-alias for readability не рисует..

etc 05.07.2007 16:46

Я за точность :D
Код:

import flash.geom.*;
import flash.display.BitmapData;
getTextBounds = function(txt) {
        var x = txt._x;
        var y = txt._y;
        var w = txt._width;
        var h = txt._height;
        var xs = txt._xscale;
        var ys = txt._yscale;
        var scale = 20;
        txt._xscale = xs*scale;
        txt._yscale = ys*scale;
        var bmp = new BitmapData(txt._width,txt._height,true,0);
        var mtx = new Matrix();
        mtx.scale(scale,scale);
        bmp.draw(txt, mtx);
        bmp.colorTransform(bmp.rectangle,new ColorTransform(1,1,1,1,0,0,0,255));
        var rect = bmp.getColorBoundsRect(0xFF000000,0x00000000, false);
        bmp.fillRect(rect,0x80FFFF00);
        rect.x /= scale;
        rect.y /= scale;
        rect.width /= scale;
        rect.height /= scale;
        txt._xscale = xs;
        txt._yscale = ys;
        bmp.dispose();
        return rect;
}
rect = getTextBounds(txt);
beginFill(0xFF0000, 30);
trace(rect);
moveTo(txt._x+rect.x+2,txt._y+rect.y+2);
lineTo(txt._x+rect.x+rect.width+2,txt._y+rect.y+2);
lineTo(txt._x+rect.x+rect.width+2,txt._y+rect.y+rect.height+2);
lineTo(txt._x+rect.x+2,txt._y+rect.y+rect.height+2);
endFill();


Friday13 05.07.2007 19:19

Цитата:

Сообщение от __etc
Я за точность :D

неплохо с фонтами разобрались товарищи:)

iNils 06.07.2007 03:20

У меня пишется undefined и ничего не рисуется.

Kikasso 06.07.2007 03:36

У меня рисует раз через пять, причем непонятно от чего зависит. Ставил input, dynamic, разные параметры сглаживания и разный размер шрифта. Не стоит отрисовывать битмапой тектовое поле, нет в это веры.
Стало быть...
Код:

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

function getSize (mc:MovieClip):Rectangle {
        var bmp:BitmapData = new BitmapData (Math.ceil(mc._width), Math.ceil(mc._height), true, 0);
        bmp.draw (mc);
        var rect:Rectangle = bmp.getColorBoundsRect(0xFF000000, 0x00000000,false);
        bmp.dispose();
        drawBounds(mc, rect);
        return rect;
}
getTextBounds = function(txt) {
        var x = txt._x;
        var y = txt._y;
        var w = txt._width;
        var h = txt._height;
        var temp_mc:MovieClip = createEmptyMovieClip('temp_mc', getNextHighestDepth());
        var temp_txt:TextField = temp_mc.createTextField('txt',1,0,0,w+5,h+5);
        temp_txt.embedFonts = txt.embedFonts;
        temp_txt.text = txt.text;       
        temp_txt.setTextFormat(txt.getTextFormat());

        var rect:Rectangle = getSize(temp_mc);
//        temp_mc.removeMovieClip();
        rect.offset(x,y);
        return rect;
}

function drawBounds( mc:MovieClip, rect:Rectangle ){
        mc.clear();
        mc.beginFill(0xFF0000, 30);
        mc.moveTo(rect.left, rect.top);
        mc.lineTo(rect.left, rect.bottom);
        mc.lineTo(rect.right, rect.bottom);
        mc.lineTo(rect.right, rect.top);
        mc.lineTo(rect.left, rect.top);
        mc.endFill();
}
       
rect = getTextBounds(txt);
drawBounds(this, rect);
trace(rect);

Все равно косячит, но программный клон нормально обводит.

etc 06.07.2007 07:47

Код:

import flash.geom.*;
import flash.display.BitmapData;
getTextBounds = function(txt) {
        var mc = txt._parent.createEmptyMovieClip('__textBounds_mc',-3288);
        var t = mc.createTextField('txt',0,0,0,100,100);
        t.setNewTextFormat(txt.getTextFormat());
        t.embedFonts = txt.embedFonts;
        t.html = txt.html;
        t.htmlText = txt.htmlText;
        t._width = txt._width;
        t._height = txt._height;
        txt = t;
        var xs = txt._xscale;
        var ys = txt._yscale;
        var scale = 20;
        var maxXScale = 2800/txt._width;
        var maxYScale = 2800/txt._height;
        if (maxXScale < scale) {
                scale = maxXScale;
        }
        if (maxYScale < scale) {
                scale = maxYScale;
        }
        txt._xscale = xs*scale;
        txt._yscale = ys*scale;
        var bmp = new BitmapData(mc._width,mc._height,true,0);
        bmp.draw(mc);
        bmp.colorTransform(bmp.rectangle,new ColorTransform(1,1,1,1,0,0,0,255));
        var rect = bmp.getColorBoundsRect(0xFF000000,0x00000000, false);
        bmp.fillRect(rect,0x80FFFF00);
        rect.x /= scale;
        rect.y /= scale;
        rect.width /= scale;
        rect.height /= scale;
        txt._xscale = xs;
        txt._yscale = ys;
        bmp.dispose();
        mc.swapDepths(6550);
        mc.removeMovieClip();
        return rect;
}
rect = getTextBounds(txt);
beginFill(0xFF0000, 30);
moveTo(txt._x+rect.x,txt._y+rect.y);
lineTo(txt._x+rect.x+rect.width,txt._y+rect.y);
lineTo(txt._x+rect.x+rect.width,txt._y+rect.y+rect.height);
lineTo(txt._x+rect.x,txt._y+rect.y+rect.height);
endFill();



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

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