在 Android 个图块上创建图形
Creating Graphics on Android Tiles
我正在创建一个 Android Tile 用于显示自定义和动态创建的图形,即图表。
但是,由于一些限制,我还没有找到这样做的方法。 Tiles 的工作方式似乎与 Activity 根本不同,Tiles 的 API 只允许创建几个预定义的 UI 元素。对我来说唯一可用的似乎是 Image LayoutElement.
可以通过传递资源或字节数组来创建图像。在处理动态创建的图形时,前者是不可能的。
因此,我唯一的希望(我认为)是自己创建一个 ByteArray 形式的图像。
我怎样才能做到这一点?有没有Java直接画图的框架?
我考虑了以下几点:
- 使用提供的 UI 元素:将无法工作,因为放置不精确并且无法控制元素的确切位置。此外,这些元素不适合绘图。
- 使用 AWT:不适用于 Android。因此,几乎所有绘图 and/or 图表库都已退出游戏。
- JavaFX:可能会工作,但现在似乎有直接在 ByteArrays/BufferedImages 上绘制的方法,因为需要先渲染应用程序。 Tiles 似乎无法渲染 JavaFX。
- 使用 Android's Canvas:再次需要 Activity。
事实证明我错了:您可以很好地在 Tile 中使用 Canvas。然而,将其转换为资源有点棘手,所以这里有一些代码:
final Bitmap bitmap = Bitmap.createBitmap(chart.getWidth(), chart.getHeight(),
Bitmap.Config.RGB_565);
final Canvas canvas = new Canvas(bitmap);
// Sets the background color
final Color background = Color.valueOf(chart.getBackgroundColor());
canvas.drawRGB(
Math.round(background.red() * 255),
Math.round(background.green() * 255),
Math.round(background.blue() * 255)
);
// YOUR DRAWING OPERATIONS: e.g. canvas.drawRect
final ByteBuffer byteBuffer = ByteBuffer.allocate(bitmap.getByteCount());
bitmap.copyPixelsToBuffer(byteBuffer);
final byte[] bytes = byteBuffer.array();
return new ResourceBuilders.ImageResource.Builder()
.setInlineResource(
new ResourceBuilders.InlineImageResource.Builder()
.setData(bytes)
.setWidthPx(chart.getWidth())
.setHeightPx(chart.getHeight())
.setFormat(ResourceBuilders.IMAGE_FORMAT_RGB_565)
.build()
)
.build();
我正在创建一个 Android Tile 用于显示自定义和动态创建的图形,即图表。
但是,由于一些限制,我还没有找到这样做的方法。 Tiles 的工作方式似乎与 Activity 根本不同,Tiles 的 API 只允许创建几个预定义的 UI 元素。对我来说唯一可用的似乎是 Image LayoutElement.
可以通过传递资源或字节数组来创建图像。在处理动态创建的图形时,前者是不可能的。
因此,我唯一的希望(我认为)是自己创建一个 ByteArray 形式的图像。 我怎样才能做到这一点?有没有Java直接画图的框架?
我考虑了以下几点:
- 使用提供的 UI 元素:将无法工作,因为放置不精确并且无法控制元素的确切位置。此外,这些元素不适合绘图。
- 使用 AWT:不适用于 Android。因此,几乎所有绘图 and/or 图表库都已退出游戏。
- JavaFX:可能会工作,但现在似乎有直接在 ByteArrays/BufferedImages 上绘制的方法,因为需要先渲染应用程序。 Tiles 似乎无法渲染 JavaFX。
- 使用 Android's Canvas:再次需要 Activity。
事实证明我错了:您可以很好地在 Tile 中使用 Canvas。然而,将其转换为资源有点棘手,所以这里有一些代码:
final Bitmap bitmap = Bitmap.createBitmap(chart.getWidth(), chart.getHeight(),
Bitmap.Config.RGB_565);
final Canvas canvas = new Canvas(bitmap);
// Sets the background color
final Color background = Color.valueOf(chart.getBackgroundColor());
canvas.drawRGB(
Math.round(background.red() * 255),
Math.round(background.green() * 255),
Math.round(background.blue() * 255)
);
// YOUR DRAWING OPERATIONS: e.g. canvas.drawRect
final ByteBuffer byteBuffer = ByteBuffer.allocate(bitmap.getByteCount());
bitmap.copyPixelsToBuffer(byteBuffer);
final byte[] bytes = byteBuffer.array();
return new ResourceBuilders.ImageResource.Builder()
.setInlineResource(
new ResourceBuilders.InlineImageResource.Builder()
.setData(bytes)
.setWidthPx(chart.getWidth())
.setHeightPx(chart.getHeight())
.setFormat(ResourceBuilders.IMAGE_FORMAT_RGB_565)
.build()
)
.build();