線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:3267
推到 Plurk!
推到 Facebook!

Canvas->DrawBitmap android 無法顯示的問題

答題得分者是:aftcast
etjon
一般會員


發表:14
回覆:12
積分:5
註冊:2002-03-12

發送簡訊給我
#1 引用回覆 回覆 發表時間:2014-10-20 22:14:19 IP:220.143.xxx.xxx 訂閱
使用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();
}
}
附加檔案:544518bb6a134_android.rar
Main Chen
高階會員


發表:29
回覆:135
積分:127
註冊:2002-10-07

發送簡訊給我
#2 引用回覆 回覆 發表時間:2014-10-21 12:47:00 IP:220.134.xxx.xxx 訂閱
試著把繪圖程式寫在 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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2014-10-21 22:45:16 IP:220.143.xxx.xxx 訂閱
謝謝您的幫忙,經測試後放在OnPaint 可以顯示,但顯示的結果很奇怪如下圖
在Android 中顯示的圖檔,下圖本來一個變4個
在windows 的顥示如下
windows 顯示是正常的
相同的程式碼,另外如果放在 Button 都無法顯示,因想寫個特效的Library 到了某種狀況才會呼叫,可以不寫在OnPaint 中嗎?
另外測試的結果在OnPaint中也不對.
Main Chen
高階會員


發表:29
回覆:135
積分:127
註冊:2002-10-07

發送簡訊給我
#4 引用回覆 回覆 發表時間:2014-10-22 09:04:23 IP:175.181.xxx.xxx 訂閱
1. 可以不寫在 OnPaint 但需用 OnPaint 裡的 Canvas 傳給其它的函數去畫才行.

2. 顯示不同是因為螢幕比例 Scale 不同關係, 需要乘以 Form1.Canvas.Scale


etjon
一般會員


發表:14
回覆:12
積分:5
註冊:2002-03-12

發送簡訊給我
#5 引用回覆 回覆 發表時間:2014-10-22 23:29:59 IP:220.143.xxx.xxx 訂閱
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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2014-10-23 11:44:06 IP:114.32.xxx.xxx 訂閱
在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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2014-10-23 12:29:21 IP:114.32.xxx.xxx 訂閱
剛發現你有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

發送簡訊給我
#8 引用回覆 回覆 發表時間:2014-10-23 12:58:26 IP:59.120.xxx.xxx 訂閱
蕭沖兄您好:


etjon
一般會員


發表:14
回覆:12
積分:5
註冊:2002-03-12

發送簡訊給我
#9 引用回覆 回覆 發表時間:2014-10-23 13:01:14 IP:59.120.xxx.xxx 訂閱
蕭沖兄您好:


沒想到會遇見您,最近看Xe7 FMX 有點穩定,才剛在試一些小功能,沒想到即遇到問題,因我本來都是在TImage 或您說的元件畫沒錯,但因只是做個小測試即有問題,
所以想再了解,才趕使用在專案上,FXM 真是好東西但資料太少了~~~唉~
aftcast
站務副站長


發表:81
回覆:1485
積分:1763
註冊:2002-11-21

發送簡訊給我
#10 引用回覆 回覆 發表時間:2014-10-23 14:13:54 IP:114.32.xxx.xxx 訂閱
你好,經過一番理解,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

發送簡訊給我
#11 引用回覆 回覆 發表時間:2014-10-24 07:51:03 IP:59.120.xxx.xxx 訂閱
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‚ 真是好東西但資料太少了~~~唉~
系統時間:2024-04-19 5:27:10
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!