动态创建/绘制图像以放置在Android视图中

3

我不确定我是否以“正确”的方式进行操作,因此我也愿意接受其他选项。这是我想要实现的内容:

我想要一个包含图形的视图。图形应该由应用程序本身动态创建。图形应该可以缩放,并且可能比屏幕更大(大约800x600)

我计划从简单开始,只有散点图。最终,我希望散点图具有拟合线和误差条,并且轴在图形缩放时保持在屏幕上……所以这可能意味着三个叠加的带有缩放功能的图像。

我已经构建了一个可以使用可绘制对象的视图,可以使用聚焦的捏合缩放和拖动,可以自动缩放图像,可以动态切换图像,并且可以接受大于屏幕的图像。将图像绑定在一起不应该是问题。

但是,我无法弄清楚如何动态绘制简单的图像。

例如:我需要获取一个BitMap对象并逐像素地绘制吗?我想使用一些ShapeDrawables,但似乎它们只能在画布上绘制形状……那么我怎样才能将所有这些形状的位图放入我的视图中?或者,是否必须在每次移动或缩放时在我的视图的“onDraw”例程中动态重新绘制/所有/我想要描绘的图像?

我认为“完美”的解决方案是使用ShapeDrawable(或类似它的东西来绘制线条并对其进行标记)使用视图的onDraw方法绘制轴……使它们保持最新并处于正确的级别……然后叠加数据点/拟合曲线/等的预先生成的图像,可以进行缩放和移动。这应该可以通过将白色设置为图形图像上的alpha来实现。

附:图形图像在视图上实际上不应该/更改。它只是缩放和被拖动。轴可能会随着移动而实际更改。因此,在进入视图之前(或立即进入视图时)预先生成图形将是最佳选择。但是,我还注意到矢量图像的缩放效果非常好……这也听起来很合适(而不是位图?)。

因此,我正在寻找一些一般性的指导。尝试阅读BitMap、ShapeDrawable、Drawable等类,但似乎找不到正确的解决方案。这使我认为我正在走错路,需要有更多经验的人指点方向。希望我没有浪费昨天组合的可缩放视图的时间:)。

1个回答

4

首先,如果你从编写代码中学到了东西,那么它就不是浪费时间。 :-)

很遗憾,在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);
}

希望这能有所帮助。

太酷了。这正是我缺少的步骤。使用它,我现在有一个类,可以从底层数据创建BitmapDrawable,并将其作为可绘制对象传递给我的触摸缩放视图。 - AndyMac

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接