2012-02-29 10 views
1

私は、DrawViewを呼び出すアクティビティを作成しました。私はCanvasをバイナリツリーのように描画します。キャンバスのサイズは画面のサイズよりも大きく、onDraw関数は表示される部分だけでなく、すべてのキャンバスを描画します。私は水平スクロールビューと垂直スクロールビューを追加しました。明らかに、onDrawは何度も呼び出されてビューを更新します。 onDraw関数を呼び出す必要なく、その画像を使ってツリーを表示するためにキャンバスを画像(ビットマップなど)に描画できるかどうかは疑問でした。 私はこれを行うことができない場合、より速い視野を得るために私は何ができますか?Android:より速いonDraw()を得る方法

答えて

1

技術的には、キャンバスはビットマップを描画します。つまり実際は画面よりも大きいビットマップです。なぜビットマップを画面よりも大きくしていますか?より大きなビットマップ=より多くのメモリ使用 - これは少し減速する可能性があります。あなたは本当に画面の切り抜かれた範囲内に描画するだけです - あなたはあなたが画面から外れていると思うかもしれませんが、あなたはそうではありません。別のビットマップに描画することはあなたを助けません - あなたはすでにそれをやっています。あなたのコードを見ずに、あなたは試みることができる:

  • のみだけあなたのバイナリツリーが静的であることを意味するならば、ただ/ PNGを作成
  • を変更したものを再描画invalidate(rect)を呼び出すことにより、バイナリツリーに変更内容を描きますそれのJPG、すべて自分
  • はあなたが
+0

私のツリーは静的なので、2番目のソリューションポイントのようなものを実装するにはどうすればいいですか?つまり、png/jpgを書き出すことはできますが、ユーザーがスクロールしたときにそのビューに表示するにはどうすればいいですか? – Ant4res

+0

静的なpng/jpgイメージを作成したら、canvas.drawBitmap()を呼び出してdocsを呼び出します。または(必要に応じて)ImageViewを使用してイメージを設定することができます。 – dbryson

+0

多くのおかげで、私はあなたが示唆するようにしようとします。 – Ant4res

4

API 11以上を使用している場合は、マニフェストのアプリケーションタグでハードウェアアクセラレーション属性を使用できます。

<application ... android:hardwareAccelerated="true" ...> 

View以外のレンダリングを使用すると考えられる以外は、SurfaceViewもご覧ください。

一般的に、UIコンポーネント(Buttonなど)をビルドしない限り、Viewをオーバーライドしないようにしてください。

+0

私は、Android 2.3.3(そうtargetSdkVersion =「11」)を使用しているに必要以上を無効に呼び出していないことを確認し、それを描く対その画像を表示し、私はそれを使用しようとするとエラーが発生しました: "属性 'hardwareAccelerのリソース識別子が見つかりませんated 'in android' " – Ant4res

+0

2.3.3はAPIレベル10だからです。 – DeeV

+0

残念ながら2.3.3はAPI10だと思います。 – Andreas

関連する問題