7

描画ライブラリがあり、それを使用してカスタム ビューを作成しています。更新を行う必要がある場合、ライブラリはビューのinvalidate()メソッドを呼び出します。そして、onDraw()メソッドが呼び出され、すべてが正常に機能します。

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

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

4

3 に答える 3

6

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

つまり、B の上に A という 2 つのビューがあり、 を呼び出すとB.invalidateB.onDrawが呼び出されて GPU に記録されますが、A.onDraw既に記録されているため呼び出されません!

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

于 2012-07-22T06:58:14.333 に答える
2

Androidのバグのようです。invalidate()の代わりに、4 つのパラメーターを持つ同じ名前のメソッドを使用してみてください。

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

ちなみに、変化しているその領域のみを無効にすることをお勧めします。無効化された領域の左、上、右、下の座標を渡します。

于 2015-05-24T11:20:02.813 に答える
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);

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

于 2013-12-11T13:43:12.730 に答える