你现在遇到的主要问题基本上就是你执行了大量的绘图周期(等于你拥有的Rect数),最好将所有这些rects存储在
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);
}
}
然后,当您想要将日期与此视图关联时,您应该执行以下操作:
public void setData(List 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();
}
也许您还想添加一些逻辑来排除那些目前在路径中不可见的Rect,以便调整性能.
我尝试在Rects的测试集上动画我的方法,并且它运行顺利,200个rects,我没有尝试执行严重的基准测试