在不调用OnDraw的情况下编辑自定义视图的画布?

时间:2014-01-05 07:16:11

标签: android android-widget android-canvas ondraw invalidation

我在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();
}

0 个答案:

没有答案