Canvas->DrawBitmap android 無法顯示的問題 |
答題得分者是:aftcast
|
etjon
一般會員 發表:14 回覆:12 積分:5 註冊:2002-03-12 發送簡訊給我 |
使用FMX 開啟一個簡單的AP,先在FORM 上放一個 TImage 為Image1 並載入一張.bmp 的圖檔,然後撰寫以下的 code ,
顯示特效,但不知為何原因,編譯在Windows 下執行OK,但Android 完全沒有有反應也沒有出錯. void __fastcall TForm7::Button1Click(TObject *Sender) { TRect Dest,Source; int x = 10; int y = 150; int v = (int)Image1->Width; int width = (int)Image1->Width/2 v%2; for(int i=0;i<=width;i =1) { Dest = Rect(x width-i,y,x width i,y Image1->Height); Source = Rect(width-i,0,width i,Image1->Height); Canvas->BeginScene(); Canvas->DrawBitmap(Image1->Bitmap,Source,Dest,100.0,false); Canvas->EndScene(); } } |
Main Chen
高階會員 發表:29 回覆:135 積分:127 註冊:2002-10-07 發送簡訊給我 |
試著把繪圖程式寫在 OnPaint 事件裡.
===================引 用 etjon 文 章=================== 使用FMX 開啟一個簡單的AP,先在FORM 上放一個 TImage 為Image1 並載入一張.bmp 的圖檔,然後撰寫以下的 code , 顯示特效,但不知為何原因,編譯在Windows 下執行OK,但Android 完全沒有有反應也沒有出錯. void __fastcall TForm7::Button1Click(TObject *Sender) { TRect Dest,Source; int x = 10; int y = 150; int v = (int)Image1->Width; int width = (int)Image1->Width/2 v%2; for(int i=0;i<=width;i =1) { Dest = Rect(x width-i,y,x width i,y Image1->Height); Source = Rect(width-i,0,width i,Image1->Height); Canvas->BeginScene(); Canvas->DrawBitmap(Image1->Bitmap,Source,Dest,100.0,false); Canvas->EndScene(); } } |
etjon
一般會員 發表:14 回覆:12 積分:5 註冊:2002-03-12 發送簡訊給我 |
|
Main Chen
高階會員 發表:29 回覆:135 積分:127 註冊:2002-10-07 發送簡訊給我 |
|
etjon
一般會員 發表:14 回覆:12 積分:5 註冊:2002-03-12 發送簡訊給我 |
Main Chen您好:
void __fastcall TForm7::FormPaint(TObject *Sender, TCanvas *Canvas, const TRectF &ARect) { if(Form7->Canvas==Canvas) <<加了這一段程式碼,發現是相同的,但如您說的是不是不用 Paint 這個不行 { int a; a = 10; } TRect Dest,Source; // Canvas->Scale = Canvas->Scale * Form7->Canvas->Scale; << 本來想依您說的方式去試但發現 Scale 好像也都是相同,其值是 2 因 Canvas->Scale 也不能做設定 int x = 10; int y = 120; int v = (int)Image1->Width; int width = (int)Image1->Width/2 v%2; for(int i=0;i<=width;i =1) { Dest = Rect(x width-i,y,x width i,y Image1->Height); Source = Rect(width-i,0,width i,Image1->Height); Canvas->BeginScene(); Canvas->DrawBitmap(Image1->Bitmap,Source,Dest,1.0,false); Canvas->EndScene(); Sleep(20); } } 請問您因以VCL 的觀念來實作,在Windows 是正常但Android 確要使用您所提的方式,不知道您是從那些文件學習到的,想了解研讀 而且真的很怪,這樣在開發上即要小心,因Windows 可運行不一 |
aftcast
站務副站長 發表:81 回覆:1485 積分:1763 註冊:2002-11-21 發送簡訊給我 |
在button click裡的
EndScene(); 後面加 repaint(); 試看看。 至於show 圖是否正確,因沒時間去理解你的for到底在幹嘛,所以…是否你說明哪樣才是正確? windows上的那圖? 先在button中能show圖再來說。不過,話說回來,我個人覺得畫在form上是不好的選擇。畫在 timage之類的,或是tpaintbox的onpaint事件上不會更好嗎? 但無所謂囉…還是先讓button可立即show再說
------
蕭沖 --All ideas are worthless unless implemented-- C++ Builder Delphi Taiwan G+ 社群 http://bit.ly/cbtaiwan |
aftcast
站務副站長 發表:81 回覆:1485 積分:1763 註冊:2002-11-21 發送簡訊給我 |
剛發現你有po 專案,試了一下,不行…
待我發現可行後再來po了… 請忽略我寫的。 ===================引 用 aftcast 文 章=================== 在button click裡的 EndScene(); 後面加 repaint(); 試看看。 至於show 圖是否正確,因沒時間去理解你的for到底在幹嘛,所以…是否你說明哪樣才是正確? windows上的那圖? 先在button中能show圖再來說。不過,話說回來,我個人覺得畫在form上是不好的選擇。畫在 timage之類的,或是tpaintbox的onpaint事件上不會更好嗎? 但無所謂囉…還是先讓button可立即show再說
------
蕭沖 --All ideas are worthless unless implemented-- C++ Builder Delphi Taiwan G+ 社群 http://bit.ly/cbtaiwan |
etjon
一般會員 發表:14 回覆:12 積分:5 註冊:2002-03-12 發送簡訊給我 |
|
etjon
一般會員 發表:14 回覆:12 積分:5 註冊:2002-03-12 發送簡訊給我 |
|
aftcast
站務副站長 發表:81 回覆:1485 積分:1763 註冊:2002-11-21 發送簡訊給我 |
你好,經過一番理解,google,實驗發現:
1/ 可行的方式是畫在timage上,因你的for畫的東西,實不了解是做什麼,所以我改了一個我自己很簡單了解的寫法來測,是可行的 __fastcall TForm7::TForm7(TComponent* Owner) : TForm(Owner) { Image2->Bitmap = new TBitmap; Image2->Width = Image1->Bitmap->Width; Image2->Height = Image1->Bitmap->Height; Image2->Bitmap->Width = Image2->Width; Image2->Bitmap->Height = Image2->Height; Image2->Position->X = 84; Image2->Position->Y = 184; Image2->Visible = false; } //--------------------------------------------------------------------------- void __fastcall TForm7::Button1Click(TObject *Sender) { Image2->Visible = true; TRect Dest,Source; int x = 0; int y = 0; int v = (int)Image1->Bitmap->Width; int width = v;//(int)Image1->Width/2 v%2; Dest = Rect(0,0,width,Image1->Bitmap->Height); //Source = Rect(width-i,0,width,Image1->Height); Image2->Bitmap->Canvas->BeginScene(); Image2->Bitmap->Canvas->DrawBitmap(Image1->Bitmap,Dest,Dest,100.0,false); Image2->Bitmap->Canvas->EndScene(); } 2/ 為何「直接」畫 form上的canvas不行? 我也不了解為何,但經google後發現,在fmx上,好像完全不能直接畫canvas,只能畫在bitmap上,然後由主ui thread來render出來。比如說,tpaitbox 在 windows上也是ok,但到了android,如同form一樣,也是沒法直畫,也查到有人曾報說是bug,但官方回,只能在onpaint上畫東西… 請參照: http://qc.embarcadero.com/wc/qcmain.aspx?d=125770 所以,我看了一時間也是很想 fxxk 罵出來,因為windows上的行為與mobile上的行為變很大。只能接受囉… 對了,至於你說的 圖 正確否,我很粗的看… 應該是你的for 裡畫的"怪怪的",再加上你的 timage裡的bitmap大小與 timage的大小不一樣 (事實上這是二件不同的事),bitmap比較小,但放到 "大的"timage "裡",會自動放大,但事實上 bitmap沒變化,他就是那麼小。 這方面你自己再研究研究。 ===================引 用 etjon 文 章=================== 蕭沖兄您好: 沒想到會遇見您,最近看Xe7 FMX 有點穩定,才剛在試一些小功能,沒想到即遇到問題,因我本來都是在TImage 或您說的元件畫沒錯,但因只是做個小測試即有問題, 所以想再了解,才趕使用在專案上,FXM 真是好東西但資料太少了~~~唉~
------
蕭沖 --All ideas are worthless unless implemented-- C++ Builder Delphi Taiwan G+ 社群 http://bit.ly/cbtaiwan |
etjon
一般會員 發表:14 回覆:12 積分:5 註冊:2002-03-12 發送簡訊給我 |
Dear 蕭沖兄您好:
實在是被 FXM 打敗了,看起來目前的專案要轉到FXM還需測試很多東西,因有些圖片特效無法轉過去,文件真很少只能找 google 大神, 看起來真的是只能這樣做,照您所提供的資料 QC 來看都是這樣的問題,謝謝您了,其它我再找時間試一下. ===================引 用 aftcast 文 章=================== 你好,經過一番理解,google,實驗發現: 1/ 可行的方式是畫在timage上,因你的for畫的東西,實不了解是做什麼,所以我改了一個我自己很簡單了解的寫法來測,是可行的 __fastcall TForm7::TForm7(TComponent* Owner) : TForm(Owner) { Image2->Bitmap = new TBitmap; Image2->Width = Image1->Bitmap->Width; Image2->Height = Image1->Bitmap->Height; Image2->Bitmap->Width = Image2->Width; Image2->Bitmap->Height = Image2->Height; Image2->Position->X = 84; Image2->Position->Y = 184; Image2->Visible = false; } //--------------------------------------------------------------------------- void __fastcall TForm7::Button1Click(TObject *Sender) { Image2->Visible = true; TRect Dest,Source; int x = 0; int y = 0; int v = (int)Image1->Bitmap->Width; int width = v;//(int)Image1->Width/2 v%2; Dest = Rect(0,0,width,Image1->Bitmap->Height); //Source = Rect(width-i,0,width,Image1->Height); Image2->Bitmap->Canvas->BeginScene(); Image2->Bitmap->Canvas->DrawBitmap(Image1->Bitmap,Dest,Dest,100.0,false); Image2->Bitmap->Canvas->EndScene(); } 2/ 為何「直接」畫 form上的canvas不行? 我也不了解為何,但經google後發現,在fmx上,好像完全不能直接畫canvas,只能畫在bitmap上,然後由主ui thread來render出來。比如說,tpaitbox 在 windows上也是ok,但到了android,如同form一樣,也是沒法直畫,也查到有人曾報說是bug,但官方回,只能在onpaint上畫東西… 請參照: http://qc.embarcadero.com/wc/qcmain.aspx?d=125770 所以,我看了一時間也是很想 fxxk 罵出來,因為windows上的行為與mobile上的行為變很大。只能接受囉… 對了,至於你說的 圖 正確否,我很粗的看… 應該是你的for 裡畫的"怪怪的",再加上你的 timage裡的bitmap大小與 timage的大小不一樣 (事實上這是二件不同的事),bitmap比較小,但放到 "大的"timage "裡",會自動放大,但事實上 bitmap沒變化,他就是那麼小。 這方面你自己再研究研究。 ===================引 用 etjon 文 章=================== 蕭沖兄您好: 沒想到會遇見您,最近看Xe7 FMX 有點穩定,才剛在試一些小功能,沒想到即遇到問題,因我本來都是在TImage 或您說的元件畫沒錯,但因只是做個小測試即有問題, 所以想再了解,才趕使用在專案上,FXM‚ 真是好東西但資料太少了~~~唉~ |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |