怎么控制動畫的切換﹖(100分)

  • 主题发起人 主题发起人 fancy105
  • 开始时间 开始时间
F

fancy105

Unregistered / Unconfirmed
GUEST, unregistred user!
要做多個動畫(圖片的切換實現)﹐并要連接到別的程序中使用﹐試過几個方法﹕
1.直接用for循環﹐形同死機﹐循環進無法接受控制﹔
2.用時鐘控件﹐可以接受控制﹐但代碼不通用﹐拿到別的窗體用時要定義一堆變量﹔
3.用線程﹐以上問題都解決了﹐不過無法控制時間間隔﹐用sleep也是形同死機。
我該怎么辦﹖
 
用timer, 写一个组件封装起来.
 
好主意﹐不過能不能具體點﹐不太懂耶﹗
 
用Thread吧,时间间隔可以自己写个延时函数;
但是要注意线程的同步,但好在Tcanvas是Thread Safe的,只要访问时Lock,
完了Unlock
 
用線程的話﹐那個延時函數要自己寫﹐這不是又要用線程﹖
否則也會在延時時像死機一般﹐雖然只是零點几秒。如果
又寫線程﹐那就無窮循環了﹐這要遞歸下去﹐何時了呀﹗
 
同意xwings的做法﹐效果不錯。
不過﹐還有一個問題﹕
我用Timer控件控制圖像的切換(做法是在不同時刻將不同的圖像
貼(BitBlt)到同一個窗體上。但不管何時(Show,Paint事件)激
活Timer,其第一個圖像都是差不多兩個Interval后才貼出來﹐這
是什么緣故﹖
 
这种组件我写过. 不太懂楼上的说的是什么问题.

我是这样解决的. 采用paintbox
1.产生一个动态bmp数组.
2.一个记录当前要显示哪一个图的变量Pos.
3.在paint事件中把要Pos指向的位图blt到paintbox的canvas上去.
4.如果timer启动之后. 每次ontimer 就把Pos指向下一个图.然后触发 onpaint
就是这样.
 
我也是這樣做的﹐不過我是在設計時將Timer激活的。
由于窗體的顯示需要一個時間﹐不一定正好是窗體顯示出
來的時候激發Timer﹐故無法做到立刻顯示圖片。
另外﹐由于運算和繪圖都比較耗時間﹐但動畫的每一幀容量
也比較大﹐所以不能生成一幀﹐繪制一幀(速度慢﹐閃爍)﹐
也不能把所有幀都裝入內存再繪制(耗內存)。有沒有緩沖
的方法﹐比如堆棧﹐怎么用﹖
 
可以用控件数组啊,用多个Image好了.
排好顺序啊,
用队列,先进先出,
一边播放,一边绘制.
 
给组件设个update方法。在窗体 oncreate的时候 直接调用它就画第一帧出来了。

如果图片多的话,不能一次性全调入, 如果用paintbox的话,不会闪烁的。
在ontimer事件中做2件事情
1。showImage
2。LoadNextImage
 
我個奇怪的問題﹐不論是用Image控件還是用PaintBox控件﹐
我是按順序將不同的圖像貼上它的Canvas的﹐用Draw方法或
是CopyRect方法﹐但都不是實時顯示的﹐而是貼完最后一幅
時才全部顯示出來﹐不是時間短的問題﹐我已經Sleep(100)
了﹐或是放到Interval=1000的Timer的OnTimer事件中﹐都
是這樣﹐這到底是怎么回事呀﹖是不是這些控件有緩沖功能﹐
而同樣的代碼對Form的Canvas卻達到預定的效果。為什么﹖﹖﹖
 
每次你拷贝一张图到canvas上去之后。要调用invalited 强制刷新的。 因为GDI函数的优先级很低。
如果你用循环贴图的话,GDI函数都是等到循环完了才执行,这时候只有最后一张图了。
 
好像還是不行呀﹐我的代碼是這樣的﹕
procedure TForm1.Button1Click(Sender: TObject);
var
i:integer;
begin
for i:=0 to 5 do
begin
Image1.Canvas.Draw(i*10,100,Image2.Picture.Bitmap);
Image1.Invalidate;
sleep(500);
end;
end;
但結果還是到最后才全部顯示出來。
 
修改如下:
var
i:integer;
begin
for i:=0 to 5 do
begin
Image1.Canvas.Draw(i*10,100,Image2.Picture.Bitmap);
Image1.Update;
//Image1.Invalidate;
Sleep(100);
end;
end;
建议用paintbox 如果用paintbox的话,不用update了。
因为画到canvas上的话,image内部要和bitmap同步一下才能显示出来的.
而paintbox直接就把canvas的内容显示到form上了.
 
用Image控件﹐再UpDate的結果正確﹐用PaintBox果然可以得出正確結果。
真是見鬼了。我當初怎么就不行﹖我Image和PaintBox都試過了﹐都沒有
得到現在的結果﹐我上面也有說過的。怎么現在。。。
不過我的方案已經改了。太晚了﹗﹗﹗
 
再問個問題﹐哪里有Socket傳送文件數據的例子
 
多人接受答案了。
 
后退
顶部