gpt4 book ai didi

android - 如何在 Canvas 上绘制大量矩形并且性能良好?

转载 作者:行者123 更新时间:2023-12-02 16:44:50 24 4
gpt4 key购买 nike

我必须渲染一张带有扇区、行和座位的电影院大厅 map 。目前我有大约 1000 个座位(实心矩形)要绘制,我通过调用以下命令为每个座位执行此操作:

canvas.drawRect(seatRect, seatPaint)

我的 View 还必须支持缩放、滚动和滑动。表现很糟糕。我尝试通过显式启用硬件加速来改进它,但没有任何改变,似乎它在我的 Nexus 4 (Api 22) 上默认启用

您能建议一些高速渲染大量矩形的方法吗?所以移动、缩放动画都很流畅。

自定义 View 类代码:

@Override
public void onDraw(Canvas canvas) {
super.onDraw(canvas);

canvas.save();
canvas.scale(mScaleFactor, mScaleFactor); // scaling support
canvas.translate(mTranslateX, mTranslateY); // scrolling support

if (mEventMap != null) {
mEventMap.paint(canvas);
}

canvas.restore();
}

事件映射代码:

public void paint(Canvas canvas) {
for (EventPlace place : places) {
if (place.isSelected())
placePaint.setColor(0xFF00FF00);
else if (place.isAvailable())
placePaint.setColor(place.getColor());
else
placePaint.setColor(0xFF000000);

canvas.drawRect(place.getBounds(), placePaint);
}
}

onDraw 中调用的方法都不会创建任何实例。只有很多矩形...

最佳答案

您现在遇到的主要问题基本上是您执行大量绘图周期(等于您拥有的矩形数量)的事实,最好将所有这些矩形存储在 Path 中对象,以减少绘图周期数。由于您有三种座位状态,我建议创建三个路径。我建议做这样的事情:

private void init() {
mSelectedPath = new Path();
mAvailablePath = new Path();
mUnavalablePath = new Path();

mAvailablePaint = new Paint();
mSelectedPaint = new Paint();
mUnavalablePaint = new Paint();

mUnavalablePaint.setColor(Color.RED);
mSelectedPaint.setColor(Color.YELLOW);
mAvailablePaint.setColor(Color.GREEN);

for (EventPlace place : mData) {
if (place.isSelected())
mSelectedPath.addRect(rectF, Path.Direction.CW);
else if (place.isAvailable())
mAvailablePath.addRect(rectF, Path.Direction.CW);
else
mUnavalablePath.addRect(rectF, Path.Direction.CW);
}
}

然后,当您想将日期与此 View 关联时,您应该执行如下操作:

public void setData(List<EventPlace> data) {
mData = data;
init();
invalidate();
}

实际上你可以随心所欲地做,只要记住你必须调用 init 方法然后使之无效。在 onDraw 中:

@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);

canvas.save();
canvas.scale(mScaleFactor, mScaleFactor); // scaling support
canvas.translate(mTranslateX, mTranslateY); // scrolling support

canvas.drawPath(mAvailablePath, mAvailablePaint);
canvas.drawPath(mUnavalablePath, mUnavalablePaint);
canvas.drawPath(mSelectedPath, mSelectedPaint);

canvas.restore();
}

也许您还想添加一些逻辑来从路径中排除那些目前不可见的矩形,以调整性能。

我尝试在矩形测试集上对我的方法进行动画处理,它在 200 个矩形上运行顺利,但我没有尝试执行严格的基准测试

关于android - 如何在 Canvas 上绘制大量矩形并且性能良好?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31589015/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com