2012-04-13 3 views
6

私は図面ライブラリを持っており、それに私はカスタムビューを持っています。更新が必要な場合、ライブラリはビューのinvalidate()メソッドを呼び出します。そして、onDraw()メソッドが呼び出され、すべて正常に動作します。View.invalidate()はView.onDraw()を呼び出すようではありません

ただし、usesSdkVersion="14"の属性をAndroidManifest.xml fileに追加すると、これは機能しなくなります。もう私のビューのonDraw()メソッドがもう呼び出されなくなりました。

詳細情報: invalidate()を私のアプリケーションのボタンプッシュの結果として呼び出すと、Viewは期待どおりに更新されるようです。また、正しく動作しているライブラリ内にアニメーションが1つあります。だから、明らかに正しく動作していることがあります。しかしほとんどの時間、それは再描画されていません。 invalidate()が呼び出された後にOSが再描画をスキップする原因となるカスタムビューが存在する可能性のある状態はありますか?

+0

あなたはまだUIスレッドから呼び出していますか?それ以外の場合は、postInvalidate()を使用する必要があります。 – Heinrisch

+0

postInvalidateを無効にするだけでそれをチェックしようとしましたが、問題はまだ残っています。 – Rickster

+0

ハードウェアアクセラレーションのオン/オフはありますか? –

答えて

5

ハードウェアアクセラレーションを使用すると、ビューの描画が記録され、GPUに保存されます。

したがって、上記のAとB.invalidateを呼び出すと、B.onDrawが呼び出され、GPUに記録されますが、既に記録されているため、A.onDrawは呼び出されません。

これは、すべてのビューonDrawが呼び出されたときの非ハードウェアアクセラレーションモードとは異なります。公式文書による

2

しかし、ハードウェアアクセラレーションは、カスタムビューや描画コールを使用するアプリケーションのいくつかに影響を与える可能性がある、それをオンにする、2D描画操作のすべてのサポートされていませんので。問題は通常、目に見えない要素、例外、または間違ってレンダリングされたピクセルとして現れます。この問題を解決するには

、Androidはあなたの次のレベルでハードウェアアクセラレーションを有効または無効にするオプションを提供します:

アプリケーション

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

活動

<application android:hardwareAccelerated="true"> 
    <activity ... /> 
    <activity android:hardwareAccelerated="false" /> 
</application> 

ウィンドウ

は、GetWindow()でsetFlags(WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED、WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED)。

表示

myView.setLayerType(View.LAYER_TYPE_SOFTWARE、NULL);

私は私の見解でテストします。

1

Androidのバグのようです。代わりに無効の()は、次の4つのパラメータと同じ名前のメソッドを使用しよう:ところで

view.invalidate(0,0,view.getWidth(), view.getHeight()); 

は、変化しているだけでその領域を、無効にするために、より良い習慣です。無効化された領域の左、上、右、下の座標を渡します。

関連する問題