0

漠然とした質問を許してください。しかし、私はandroidとjavaに不慣れであり、この主題について読んだすべてのものは、プログラムですべてを行っているので、私には役に立たないxmlコードサンプルしか提供していません。

だから私は楽譜を描くアプリを持っていて、音楽が再生されるときに、現在再生中の音符、カラオケスタイルの上にある種のカーソル(長方形のボックスOK)をオーバーレイする必要があります。

このようなビューを作成します

Globals.mMainView = new MainView(context);
            Globals.mMainView.setLayoutParams(new LinearLayout.LayoutParams(0, LinearLayout.LayoutParams.WRAP_CONTENT, 60));
            layout.addView(Globals.mMainView);

ビュー参照をグローバルに保存して、後で見つけることができるようにします(はい、この時点でJavaポリスが来ることはわかっていますが、後でより洗練された解決策を見つけることができます)。ビューの横に別の無関係なビューがあるため、ビューは線形レイアウトになっていることに注意してください。

メインスレッドでの描画onDrawは、楽譜をレンダリングするのに問題なく機能します。

だから、再生ボタンを押すと、これらのいずれかを開始します

class Play1Activity extends AsyncTask<String, Integer, Boolean> 

doInBackgroundでオーディオを再生し、再生位置を指定してpublishProgressを定期的に呼び出します。これにより、描画を安全に実行できると思われるUIスレッドでonProgressUpdateが実行されます。

ここで、CPUを節約し、アニメーションの見栄えを良くするためにビュー全体を再描画することなく、メインビュー(参照Globals.mMainViewがあります)の上に何かを描画したいと思います。ウィンドウでは、XORフラグを使用して長方形を描画し、関心のあるスコアの部分を反転させてから、同じ操作を再度実行して描画を解除し、次の位置に描画します。

この時点で、私はアンドロイドについて無知です。おそらく誰かが私がたどる最良の道を提案するかもしれません。ありがとう

4

1 に答える 1

0

メイン ビューのどの部分を再描画する必要があるかがわかっている場合は、invalidate (Rect dirty)またはinvalidate (int l, int t, int r, int b)ビューで呼び出すことができます。この場合、ダーティ エリアのみが再描画されます。

于 2013-01-07T06:46:10.573 に答える