0

私はGraphViewAPIを使用しており、チャートを扱いにくいように実装しました。ユーザーがグラフに触れると、データポイントからグラフの下部に伸びる垂直線が表示されます。

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());

ドローアブルを移動しているときに問題が発生します。ジェスチャが十分に速い場合、更新が遅れる傾向があり、グラフ上で線が消えます(数分の1秒)。線は動きを維持しますが、消えます。それが理にかなっているなら、アイテムはその境界よりも速く動いているように見えます。

キャンバス全体を無効にすることはノーノーであり、変更したいものの境界を無効にすることが望ましいと聞きました(私が上で行ったこと)。キャンバス全体を無効にすると、線が消える現象は発生しませんが、アプリの動作が遅くなります。

私はSurfaceViewとサーフェスホルダーで魔法のようなことをしましたが、この場合、それらを使用することは逆効果のようです。私の理解では、私は基本的にinvalidate()メソッドを使用していますが、別のスレッドで使用しています。それでもすべてが何度も再描画され、逆効果のようです。

GraphViewライブラリ内で説明されている効果を実現する別の方法はありますか?

4

1 に答える 1

1

簡単な修正でこの問題を解決することができました。画面が移動(ポートレートモード)またはタッチ(ランドスケープモード)のいずれかで変更されるたびに、onDraw()メソッドが呼び出されます。ダーティレク法(ランドスケープモード)を使用しましたが、それでもかなりの遅れがありました。スクロールビューでグラフをスクロールするときにも、顕著なラグがありました。解決策は、キャンバスをビットマップに保存し(最初の呼び出しで)、ビットマップを保存し、その後、ビットマップの上にマーカーを描画することだけでした。ビューポートが変更された場合、または別のデータセットが追加された場合は常に、すべてのデータを描画するためにビットマップが無効になりました。コード

    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パラメーターがあります。

この方法により、パフォーマンスが大幅に向上します。私の場合、scrollView(ポートレートモード)でグラフを作成しました。スクロールビューがどちらかの方向に移動するたびに、キャンバスが再描画されました。この絶え間ない再描画は本当にリソースを消費しました。私が実装したマーカー(指に続く円)の描画についても同じことが言えます。CPUは2つのオブジェクトを再描画するだけでよいので、かかる時間は短くなり、パフォーマンスが向上します。

お役に立てれば!

于 2012-06-19T23:14:59.030 に答える