Android 使用invalidate(Rect dirtyRect)实现交互式画布时造成的延迟

Android 使用invalidate(Rect dirtyRect)实现交互式画布时造成的延迟,android,graph,plot,invalidation,Android,Graph,Plot,Invalidation,我使用的是API,我实现的图表很难处理。当用户触摸图形时,会出现一条从数据点延伸到图形底部的垂直线 我用onDraw方法创建行,如下所示: mDrawable = new ShapeDrawable(new RectShape()); mDrawable.getPaint().setColor(0xFF363636); mDrawable.setBounds((int)markerX,(int) (markerY) , (int)markerX+1, (int) height); mDrawa

我使用的是API,我实现的图表很难处理。当用户触摸图形时,会出现一条从数据点延伸到图形底部的垂直线

我用onDraw方法创建行,如下所示:

mDrawable = new ShapeDrawable(new RectShape());
mDrawable.getPaint().setColor(0xFF363636);
mDrawable.setBounds((int)markerX,(int) (markerY) , (int)markerX+1,  (int) height);
mDrawable.draw(canvas);
Iam使用以下代码以及用于计算标记位置的代码,在onTouch方法中刷新线

invalidate(mDrawable.getBounds());
我的问题发生在移动可牵引电缆时。如果手势足够快,刷新时往往会有延迟,图形上的线条会消失(几秒钟)。直线与运动保持一致,但它消失了。如果这有意义的话,看起来物品的移动速度几乎超过了它的边界

我听说使整个画布无效是一个否定,而使您想要的更改的边界无效是首选(我在上面所做的)。当使整个画布无效时,不会出现消失线现象,但应用程序确实运行缓慢

我用SurfaceView和SurfaceHolder做了一些神奇的事情,但在这种情况下使用它们似乎适得其反。根据我的理解,我基本上是在另一个线程中使用invalidate()方法。一切都会被一遍又一遍地重画,这似乎适得其反


是否有其他方法可以实现GraphView库中描述的效果?

我可以通过简单的修复来解决此问题。无论何时更改屏幕,移动(portait模式)或触摸(横向模式),都会调用
onDraw()
方法。虽然使用了脏Rect方法(横向模式),但仍然有明显的滞后。在滚动视图中滚动图形时也有明显的延迟。解决方案是(在第一次调用时)将画布保存为位图,存储位图,然后仅在位图顶部绘制标记。无论何时更改视口或添加不同的数据集,位图都会被置空以绘制所有数据。代码

    protected void onDraw(Canvas sysCanvas) {
         canvas = new Canvas(); 

         if (bitmap != null) { 
                sysCanvas.drawBitmap(bitmap, 0,0, null); 
                drawMarker(sysCanvas); //draw whatever you want to the system canvas in a different method
                return; 
         } 


        bitmap = Bitmap.createBitmap(sysCanvas.getWidth(), sysCanvas.getHeight(), Bitmap.Config.ARGB_8888); 
        canvas.setBitmap(bitmap); 

        ///more code, draw whatever you want to canvas.
        sysCanvas.drawBitmap(bitmap,0, 0,null);
    } 
第一次运行后,画布将绘制图形。在第一次遍历之后,画布只绘制位图,然后转到一个方法来绘制对象。这些对象具有在
onTouch()
方法中设置的x和y参数

此方法大大提高了性能。在我的例子中,我有一个滚动视图(纵向模式)中的图形。每当滚动视图沿任一方向移动时,画布都会被重新绘制。这种不断的重画确实消耗了资源。同样的道理也适用于绘制我已经实现的标记(沿着手指的圆圈)。由于CPU只需重新绘制2个对象,因此所需的时间更少,从而产生更高的性能

希望这有帮助