DELPHI中使用對象的常用屬性制作動畫
發(fā)表時(shí)間:2023-08-20 來源:明輝站整理相關(guān)軟件相關(guān)文章人氣:
[摘要]林穎 在DELPHI中的所有對象中都有提供了TOP、LEFT、HEIGHT、WIDTH四個(gè)屬性,用以控制對象的位置和大;另外在DELPHI中還提供了一個(gè)TIME的構(gòu)件,利用他們可以方便地實(shí)...
林穎
在DELPHI中的所有對象中都有提供了TOP、LEFT、HEIGHT、WIDTH四個(gè)屬性,用以控制對象的位置和大;另外在DELPHI中還提供了一個(gè)TIME的構(gòu)件,利用他們可以方便地實(shí)現(xiàn)一些動畫。
---- 一. 拉幕
---- 拉幕式即從中間往兩邊慢慢顯示畫面。在此把Dbimage1的CENTER屬性設(shè)成true;把stretch屬性設(shè)成false。把WIDTH屬性設(shè)成0,適當(dāng)設(shè)置LEFT的值,使其顯示在屏幕中間。實(shí)現(xiàn)動畫主要方法是修改LEFT屬性(值逐漸變。┖蚖IDTH屬性(值逐漸變大),要注意的是為了讓幕布從中間均勻地向兩邊拉開,WIDTH的改變值必須是LEFT改變值的兩倍。在DIMEER1的ontime事件中輸入如下語句:
if (dbimage1.left >0) then
begin
dbimage1.left:=dbimage1.left-1;
dbimage1.width:=DBImage1.width+2;
//dbimage1.width的改變值必須是dbimage1.left改變值的2倍
end
else
timer1.enabled:=false;//拉幕結(jié)束。
---- 把上面程序中的LEFT改為TOP,WIDTH改為HEIGHT就可以實(shí)現(xiàn)豎直方向的拉幕。如果把拉幕這種效果運(yùn)用于文本類型的對象,就可以實(shí)現(xiàn)一行一行地顯示文本的效果。
---- 二. 手風(fēng)琴
---- 在拉幕式的動畫中,當(dāng)畫面整個(gè)顯示后,再把畫面從兩邊往中間慢慢遮住,如此不斷循環(huán),象拉手風(fēng)琴一樣。實(shí)現(xiàn)時(shí),需加入一個(gè)變量STATE,用以表明此時(shí)的狀態(tài)。具體程序如下:
procedure TForm1.Timer1Timer(Sender: TObject);
begin
if state=1 then
if (dbimage1.left >0) then
begin
dbimage1.left:=dbimage1.left-1;
dbimage1.width:=DBImage1.width+2;
end
else
//當(dāng)幕完全拉開后,改變狀態(tài)變量
state:=2
else
//從兩邊往中間拉
if dbimage1.left< form1.width div 2 then
begin
dbimage1.left:=dbimage1.left+1;
dbimage1.width:=dbimage1.width-2;
end
else
//當(dāng)幕合上后,改變狀態(tài)變量
state:=1;
end;
---- 三. 柵欄式
---- 畫面初始被豎直柵欄遮住,然后各條柵欄逐漸變窄,被柵欄分割的畫面逐漸完整起來。在這種動畫中,柵欄的角色由STATICTEXT類型的對象來充當(dāng)(畫面呈現(xiàn)幾條柵欄就需要幾個(gè)STATICTEXT對象)。只需改變STATICTEXT類型對象的LEFT 和 WIDTH屬性即可(LEFT逐漸變大,WIDTH逐漸變小),在TIMER1的ONCLICK事件上,對每一個(gè)STATICTEXT對象如下處理:
if st1.width >0 then //ST1是STACTICTEXT類型的一個(gè)對象
begin
st1.width:=st1.width-2;
st1.left:=st1.left+1 ;
end
else
//再一次循環(huán)
begin
st1.width:=40; //WIDTH和LEFT由實(shí)際情況決定
st1.left:=40;
end;
---- 如果把上面的柵欄水平排列,把LEFT改成TOP,把WIDTH改成HEIGHT,則成為百頁窗的效果,大家有興趣的話可以試試。
---- 四. 翻頁
---- 這是一種旋轉(zhuǎn)的效果,實(shí)際上是把TOP的值固定,改變HEIGHT的值,并把STRETCH的值設(shè)為TRUE。在TIMER1的ONTIME事件中鍵入以下程序可以實(shí)現(xiàn)向上翻頁:
if dbimage1.height >0 then
dbimage1.height:=dbimage1.height-4;
---- 若把上面程序中的HEIGHT的屬性值從小變到大,則實(shí)現(xiàn)向下翻頁的效果。若把TOP改成LEFT,把HEIGHT改成WIDTH,則實(shí)現(xiàn)左右翻頁的效果。如果把LEFT和WIDTH一起同時(shí)改變,則可以使圖片以的某一條通過圖片的豎直線為軸進(jìn)行旋轉(zhuǎn),在TIMER1的ONTIMER事件中,程序如下:
procedure TForm1.Timer1Timer(Sender: TObject);
begin
if state=1 then
if dbimage1.width >0 then
begin
//畫面逐漸變小
dbimage1.left:=dbimage1.left+1;
dbimage1.width:=dbimage1.width-2;
//width的改變值必須是left改變值的兩倍
end
else
state:=2
else
if dbimage1.width< 250 then
begin
dbimage1.left:=dbimage1.left-1;
dbimage1.width:=dbimage1.width+2;
end
else
state:=1
end;
---- 從以上程序可以看出,這是把畫面變小后再慢慢變大,變小是一個(gè)狀態(tài)(STATE=1),變在是另一個(gè)狀態(tài)(STATE=2),這兩種狀態(tài)交替出現(xiàn),即可出現(xiàn)動畫。
---- 五. 從畫面外逐漸移(飛)過
---- 在設(shè)計(jì)封面的時(shí)候,經(jīng)常需要把某標(biāo)題從某個(gè)畫面上飛過。 要實(shí)現(xiàn)該類型的動畫實(shí)際上只需改變標(biāo)題的TOP(垂直方向飛過)或LEFT屬性(水平方向飛過)。
---- 例如實(shí)現(xiàn)一個(gè)標(biāo)題在一幅畫上從左往右飛過。先在FORM1里建立一個(gè)圖形對象DBIMAGE1和文字對象STATICTEXT1(注意TEXT類型的對象無法顯示在圖片上),把位置和大小大小尺寸設(shè)好。然后在FORM1里建立一個(gè)TIME對象TIME1,把其ENABLED屬性設(shè)為TRUE,INTERVAL屬性設(shè)為10;并在事件ONTIME里鍵入如下語句:
procedure TForm1.Timer1Timer(Sender: TObject);
begin
if statictext1.left< dbimage1.width+dbimage1.left then
statictext1..left:=statictext1.left+3
else
statictext1.left:=dbimage1.left;
//當(dāng)標(biāo)題飛出圖片后,使標(biāo)題重新位于圖片的左邊,
再一次從左向右入屏幕
end;
---- 說明:
如果只想使標(biāo)題從左向右移動一次,ELSE語句改為Timer1.enabled:=false;
數(shù)值3是標(biāo)題移動的速度值,可以隨意更改
若標(biāo)題只移到圖片的某一位置,則把“statictext1.left< dbimage1.width+dbimage1.left”改為“statictext1.left< 位置值”,并把ELSE語句改為Timer1.enabled:=false;
只需把LEFT的值從大變到小,則實(shí)現(xiàn)從右往左飛過
把上面的LEFT改為TOP,把WIDTH改為HEIGHT,即可實(shí)現(xiàn)垂直方向的動畫。
---- 六. 逐漸顯示(即把圖片從某一個(gè)邊界逐漸拉出來)
---- 實(shí)現(xiàn)這一類型的動畫不但要改變TOP、LEFT屬性,還要改變HEIGHT和WIDTH屬性。 例:把一幅畫從右邊往左邊拉(右切入)。在上例中以DBIMAGE1為例。這時(shí)要把Dbimage1的center和stretch屬性設(shè)為FALSE。圖片的左邊界放在FORM1的右邊界處,WIDTH設(shè)為0。
procedure TForm1.timer1Timer(Sender: TObject);
begin
if dbimage1.left >0then
begin
dbimage1.left:=dbimage1.left-3;
dbimage1.width:=dbimage1.width+3;
//LEFT的改變值與WIDTH的改變值必須一樣
end
else
begin
dbimage1.left:=form1.width;
dbimage1.width:=0;
end;
end;
---- 說明:
把上面的LEFT改為TOP,WIDTH改為HEIGHT即可實(shí)現(xiàn)從下往上拉(下切入)。
若只切入到某一點(diǎn),可以把“Dbimage1.left >0”中的0改為設(shè)定點(diǎn)的坐標(biāo),并把ELSE 語句改為 Timer1.enabled:=false;
---- 盡管DELPHI提供了不少關(guān)于動畫方面的開發(fā)工具,但是只要稍稍修改一下屬性即可輕輕松松地實(shí)現(xiàn)常見的一些特技顯示,你愿意試一下嗎?