2011-03-26 116 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