2011-03-26 111 views
3

我不確定我是在做這個「正確」的方式,所以我也願意接受其他選項。這是我想要實現的:動態創建/繪製圖像以放置在Android視圖中

我想要一個包含圖的視圖。該圖應該由應用程序本身動態創建。該圖應該是可縮放的,並且可能會比屏幕開始更大(800x600左右)

我正計劃開始使用簡單的散點圖。最終,我想要一個具有擬合線的散點圖和帶有軸的誤差線,並保留在屏幕上,同時圖形放大...所以這可能意味着將三個圖像疊加在一起並放大縮小功能。

我已經構建了一個可以繪製的視圖,可以使用聚焦的縮放和拖動,可以自動縮放圖像,可以動態切換圖像,並且可以使圖像大於屏幕。將圖像綁在一起不應該是一個問題。

但是,我不能弄清楚如何動態地繪製簡單的圖像。

例如:我得到一個BitMap對象並逐個像素地繪製它嗎?我想與一些ShapeDrawables一起工作,但似乎他們只能在畫布上繪製一個形狀......那麼我怎樣才能獲得所有這些形狀的位圖到我的視圖中?或者,我必須在每次移動或縮放時,在我的視圖的「onDraw」例程中動態地重新繪製/想要描繪的所有圖像?

我認爲「完美」的解決方案是使用ShapeDrawable(或類似的東西來繪製線條和標註它們)以使用視圖的onDraw方法繪製軸...將它們保持在當前位置並在右側然後覆蓋可以放大和移動的數據點/擬合曲線/等的預先生成的圖像。這應該是可能的白色設置爲圖形圖像上的alpha。

PS:在視圖上,圖形圖像不應該實際上/改變/。這只是縮放和被拖動。該軸可能實際上隨着運動而改變。因此,在進入視圖之前(或緊接着)預先生成圖形將是最佳的。但我也注意到縮放對於矢量圖像效果非常好......這聽起來也合適(而不是位圖?)。

所以我正在尋找一些一般指導。嘗試閱讀BitMap,ShapeDrawable,Drawable等類,似乎無法找到合適的配合。這讓我覺得我在咆哮錯誤的樹,而有更多經驗的人可以指引我朝着正確的方向發展。希望我沒有浪費時間建立我昨天放在一起的放大視圖:)。

回答

3

首先,如果你從中學到了東西,從不浪費時間編寫代碼。 :-)

不幸的是,仍然不支持在Android中繪製矢量圖像。所以位圖就是你得到的。

我認爲你缺少的一點是,你可以在任何時候想要在位圖上繪製時創建一個Canvas。你不必等待onDraw給你一個。

因此,在某些時候(從onCreate,當數據更改等),創建您自己的任何大小的位圖。

下面是一些僞代碼(未測試)

Bitmap mGraph; 

void init() { 
    // look at Bitmap.Config to determine config type 
    mGraph = new Bitmap(width, height, config); 
    Canvas c = new Canvas(mybits); 
    // use Canvas draw routines to draw your graph 
} 

// Then in onDraw you can draw to the on screen Canvas from your bitmap. 
protected void onDraw(Canvas canvas) { 
    Rect dstRect = new Rect(0,0,viewWidth, viewHeight); 
    Rect sourceRect = new Rect(); 
    // do something creative here to pick the source rect from your graph bitmap 
    // based on zoom and pan 
    sourceRect.set(10,10,100,100); 

    // draw to the screen 
    canvas.drawBitmap(mGraph, sourceRect, dstRect, graphPaint); 
} 

希望有點幫助。

+0

方式很酷。這正是我錯過的一步。使用它,我現在有了一個從底層數據創建BitmapDrawable的類,並將其作爲drawable傳遞給我的touchzoom視圖。 – AndyMac 2011-03-26 15:28:54