![]() |
|
||||||||||
|
|||||||
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | Опции просмотра |
|
![]() |
![]() |
|
|||||
|
Регистрация: Dec 2006
Сообщений: 230
|
Как создать кодом скругленный прямоугольнег? Заодно и с градиентной заливкой. Юзаю сейчас какой-то левый класс.
|
|
|||||
|
Регистрация: Oct 2006
Адрес: spb.ru
Сообщений: 3,221
|
вам потребуются следующие заклинания:
Цитата:
Последний раз редактировалось Kikasso; 31.08.2007 в 04:58. |
|
|||||
|
Регистрация: Dec 2006
Сообщений: 230
|
эхзампель эсть?
|
|
|||||
|
вот, as2 класс
правда я на скорую руку удалил лишнее... после приличного количества мартини экстра драй :~) надеюсь не в ущерб работоспособности класса... экземпляры прямоугольников нужно создавать при помощи функции createRect, надеюсь вы разберётесь :~) class zh.Rect extends MovieClip{
private var _w:Number;
private var _h:Number;
private var _color;
private var _borderColor:Number;
private var _r:Array;
private var _border:Number;
public function set w (val:Number):Void{_w=val; draw();}
public function get w ():Number{return(_w);}
public function set h (val:Number):Void{_h=val; draw();}
public function get h ():Number{return(_h);}
public function set color(val):Void{_color=val; draw();}
public static function createRect(
parent:MovieClip, name:String, depth:Number,
w:Number, h:Number, r, color, border:Number, borderColor:Number
):MovieClip{
var params = [w, h, r, color, border, borderColor];
var mc:MovieClip = parent.createEmptyMovieClip(name, depth);
mc.__proto__ = Rect.prototype;
mc.constructor = Rect;
mc.constructor.apply(mc, params);
return(mc);
}
function Rect(wVal:Number, hVal:Number, rVal, colorVal, borderVal:Number, borderColorVal:Number){
if(wVal){_w=wVal}else{_w=100;}
if(hVal){_h=hVal}else{_h=30;}
if(typeof(rVal)=='object'){_r=rVal;}else if(typeof(rVal)=='number'){_r=[rVal,rVal,rVal,rVal];}else{_r=[0,0,0,0];}
if(colorVal){_color=colorVal}else{_color=0xCC3300;}
if(borderVal){_border=borderVal}else{_border=0;}
if(borderColorVal){_borderColor=borderColorVal}else{_borderColor=0x333333;}
draw();
}
public function move(x,y):Rect{
_x=x;
_y=y;
return(this);
}
private function draw():Void{
clear();
if(_border==0){
drawNoborderRect(0, 0, _w, _h, _r, _color);
}else{
drawNoborderRect(0, 0, _w, _h, _r, _borderColor);
var border:Number=_border;
if(border>Math.min(_w, _h)/2-.5){border=Math.min(_w, _h)/2-.5;}
var rr:Array=[];
for (var i:Number = 0; i<4; i++){
rr[i]=_r[i]-border;
if(rr[i]<0){rr[i]=0;}
}
drawNoborderRect(border, border, _w-2*border, _h-2*border, rr, _color);
}
}
private function drawNoborderRect(x:Number, y:Number, w:Number, h:Number, r:Array, c:Number):Void{
var theta:Number, angle:Number, cx:Number, cy:Number, px:Number, py:Number;
beginFill(c);
// theta = 45 degrees in radians
theta = Math.PI/4;
// draw top line
moveTo(x+r[0], y);
lineTo(x+w-r[1], y);
//angle is currently 90 degrees
angle = -Math.PI/2;
// draw tr corner in two parts
cx = x+w-r[1]+(Math.cos(angle+(theta/2))*r[1]/Math.cos(theta/2));
cy = y+r[1]+(Math.sin(angle+(theta/2))*r[1]/Math.cos(theta/2));
px = x+w-r[1]+(Math.cos(angle+theta)*r[1]);
py = y+r[1]+(Math.sin(angle+theta)*r[1]);
curveTo(cx, cy, px, py);
angle += theta;
cx = x+w-r[1]+(Math.cos(angle+(theta/2))*r[1]/Math.cos(theta/2));
cy = y+r[1]+(Math.sin(angle+(theta/2))*r[1]/Math.cos(theta/2));
px = x+w-r[1]+(Math.cos(angle+theta)*r[1]);
py = y+r[1]+(Math.sin(angle+theta)*r[1]);
curveTo(cx, cy, px, py);
// draw right line
lineTo(x+w, y+h-r[2]);
// draw br corner
angle += theta;
cx = x+w-r[2]+(Math.cos(angle+(theta/2))*r[2]/Math.cos(theta/2));
cy = y+h-r[2]+(Math.sin(angle+(theta/2))*r[2]/Math.cos(theta/2));
px = x+w-r[2]+(Math.cos(angle+theta)*r[2]);
py = y+h-r[2]+(Math.sin(angle+theta)*r[2]);
curveTo(cx, cy, px, py);
angle += theta;
cx = x+w-r[2]+(Math.cos(angle+(theta/2))*r[2]/Math.cos(theta/2));
cy = y+h-r[2]+(Math.sin(angle+(theta/2))*r[2]/Math.cos(theta/2));
px = x+w-r[2]+(Math.cos(angle+theta)*r[2]);
py = y+h-r[2]+(Math.sin(angle+theta)*r[2]);
curveTo(cx, cy, px, py);
// draw bottom line
lineTo(y+r[3], x+h);
// draw bl corner
angle += theta;
cx = x+r[3]+(Math.cos(angle+(theta/2))*r[3]/Math.cos(theta/2));
cy = y+h-r[3]+(Math.sin(angle+(theta/2))*r[3]/Math.cos(theta/2));
px = x+r[3]+(Math.cos(angle+theta)*r[3]);
py = y+h-r[3]+(Math.sin(angle+theta)*r[3]);
curveTo(cx, cy, px, py);
angle += theta;
cx = x+r[3]+(Math.cos(angle+(theta/2))*r[3]/Math.cos(theta/2));
cy = y+h-r[3]+(Math.sin(angle+(theta/2))*r[3]/Math.cos(theta/2));
px = y+r[3]+(Math.cos(angle+theta)*r[3]);
py = y+h-r[3]+(Math.sin(angle+theta)*r[3]);
curveTo(cx, cy, px, py);
// draw left line
lineTo(x, y+r[0]);
// draw tl corner
angle += theta;
cx = x+r[0]+(Math.cos(angle+(theta/2))*r[0]/Math.cos(theta/2));
cy = y+r[0]+(Math.sin(angle+(theta/2))*r[0]/Math.cos(theta/2));
px = x+r[0]+(Math.cos(angle+theta)*r[0]);
py = y+r[0]+(Math.sin(angle+theta)*r[0]);
curveTo(cx, cy, px, py);
angle += theta;
cx = x+r[0]+(Math.cos(angle+(theta/2))*r[0]/Math.cos(theta/2));
cy = y+r[0]+(Math.sin(angle+(theta/2))*r[0]/Math.cos(theta/2));
px = x+r[0]+(Math.cos(angle+theta)*r[0]);
py = y+r[0]+(Math.sin(angle+theta)*r[0]);
curveTo(cx, cy, px, py);
endFill();
}
}
p.s. я улетел в Швейцарию, чао :~) p.p.s. терпеть не могу тех кто пишет з.з.ы.
__________________
Хороший отдых - половина работы. |
|
|||||
|
Регистрация: Dec 2006
Сообщений: 230
|
Вот спасибочки!! Реально удружили! Потащил разбираться!! Йес! Удачи в Швейцарии!
Хотя вообще странно, что к 8-ой версии Макромедия до сих пор не предоставила стандарного класса в коллекции draw для рисования скругленных прямоугольнегов. Последний раз редактировалось etc; 31.08.2007 в 09:47. |
![]() |
![]() |
Часовой пояс GMT +4, время: 15:40. |
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | |
| Опции просмотра | |
|
|