我在Android中创建了一个图形库,我知道如果我通过调用invalidate来更新画布,它会导致某些设备出现堆内存问题,尤其是当用户使用Relative Layout
并且有一些视图时加载或有多个图形堆叠在一起。所以我想做的是更改视图的图形,而不必重新绘制相对布局上的所有其他视图。
我遇到的唯一解决方案是在自定义视图的绘图中添加一个布尔系统,以检查相同的视图是否请求绘制,否则它将保持相同的画布。但是,这只会阻止同一视图再次重绘,并且在绘制时也会绘制其他视图。
以上是上述解决方案。
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
if(cropx != 0){
croppedBmp = Bitmap.createBitmap(drawGraph2, 0, 0, (drawGraph2.getWidth()*cropx/100), drawGraph2.getHeight());
canvas.drawBitmap(croppedBmp, 0, 0, new Paint());
croppedBmp.recycle();
System.gc();
Runtime.getRuntime().gc();
}
status = false;
}
public void plotPoints(ArrayList<Double> yvalue, ArrayList<Double> xpoint){
drawpath2 = new Path();
drawCanvas = new Canvas(drawGraph2);
drawCanvas.scale(1, -1);
boolean first = false;
for(int i = 0; i< xpoint.size(); i++){
if(!Double.isNaN(yvalue.get(i))){
if(first == false){
drawpath2.moveTo(xpoint.get(i).floatValue(),yvalue.get(i).floatValue());
first = true;
}else if(i==xpoint.size()-1){
drawCanvas.drawPath(drawpath2, paint);
drawpath2.reset();
}else{
drawpath2.lineTo(xpoint.get(i).floatValue(), yvalue.get(i).floatValue());
}
}
}
Canvas singleUseCanvas = new Canvas(drawGraph2);
singleUseCanvas.drawPath(drawpath, paint);
status = true;
invalidate();
}