0

我正在使用GraphView 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);

我正在使用以下代码以及计算标记位置的代码来刷新 onTouch 方法中的行。

invalidate(mDrawable.getBounds());

我的问题发生在可绘制对象被移动时。如果手势足够快,刷新往往会有延迟,并且线条会在图形上消失(几分之一秒)。这条线与运动保持一致,但它消失了。如果这有什么意义的话,似乎项目的移动速度快于它的边界。

我听说使整个画布无效是不行的,最好使您想要更改的范围无效(我在上面所做的)。使整个画布无效时,不会出现消失线现象,但应用程序运行缓慢。

我对 SurfaceView 和表面支架做了一些神奇的事情,但在这种情况下使用它们似乎适得其反。据我了解,我基本上会使用 invalidate() 方法,但在不同的线程中。一切仍然会一遍又一遍地重绘,这似乎适得其反。

是否有另一种方法来实现 GraphView 库中描述的效果?

4

1 回答 1

1

我能够通过一个简单的修复来解决这个问题。无论何时更改屏幕,无论是移动(纵向模式)还是触摸(横向模式),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 个对象,因此花费的时间更少,从而提高了性能。

希望这可以帮助!

于 2012-06-19T23:14:59.030 回答