2012-02-29 67 views
1

次のコードでは、各点に異なる色のグラフを描画します(ここでは重要な色の選択は(...)です)。
これは、変数x、y、zを保持するVectorを変更するonTouchListenerに添付されています。 1つの "onTouch"変更点がupdateView()でビューを更新します。 xを保持するベクトルの大きさは約300要素です。 yを保持する配列は約200です。これにより、onTouchイベントごとにupdateView()メソッド内に200 * 300ループが作成されます。 次のonTouchがトリガーされる前にwaitメソッドを実装しようとしましたが、まだ遅くなっています。Android ImageViewの速度が遅い、簡単な方法はありますか?

アイデア?

public updateView(){ 

     bitmap = Bitmap.createBitmap((int) width, height - nextToCurve.getHeight(), 
       Bitmap.Config.ARGB_8888); 
     canvas = new Canvas(bitmap); 
     paint = new Paint(); 
     paint.setColor(Color.GREEN); 
     imageView.setImageBitmap(bitmap); 
     canvas.drawColor(Color.BLACK); 
     (...) 
     //x 
     for(int i5=start;i5<stop;i++){ 
     //y 
     for(int i=blockSizeSmall-minBlockSize;i>minBlockSize;i--){ 
        //change color for z 
        (...) 
        canvas.drawLine(oldX, oldY, temp3, temp4, paint); 
        canvas.drawPoint(x,y, paint); 
     } 
     imageView.postInvalidate(); 
} 
+1

ARGB_8888は遅いです。各updateViewでやり直す作業量を最小限に抑えてください。たぶん透明なレイヤーで作業して、毎回少ししか変更しないかもしれません。 – njzk2

+0

であり、このアルゴリズムは複雑さO(n^2)を有する。ループのために1つだけを使うようにしてください –

+0

@njzk:不幸にも私はこれをやりません。なぜならそれはgabeを変えるからです。私はそれがO(n^2)であることを認識しています。私が今しようとしているのは10と20ポイントをスキップしてxを10に、yを20に正規化することですが、これは良く見えません。 – user1222353

答えて

1

あり、パフォーマンスの問題を引き起こして、あなたのコード内の3つの事のように見える:

1)あなたのonTouchリスナーはシングルタッチのイベントの多くを受け取ります。表示されている動き/タッチ/非タッチのみが動作するようにイベントをフィルタリングするように注意してください。 0.2ピクセルの動きは典型的であり、多くの時間を無駄にする。

2)アップデートルーチンでビットマップを作成すると、時間がかかります。また、ビットマップがスコープ外に出たときに自動的に解放されることもないため、すぐにメモリ不足になります。明示的にリサイクルする必要があります。 updateViewメソッドの外で(単一の)ビットマップを作成し、それを再利用します。

3)ImageViewに新しいビットマップを設定すると、イメージを頻繁に更新するため、減速の原因になることもあります。ビットマップをImageViewに設定すると、ビットマップを更新してImageViewを更新します。

関連する問題