invalidate(Rect)が領域全体を無効にする理由はわかりません。 領域は5つのセクションに分割され、それぞれに折れ線グラフが描画されます。各セクションには100ポイントが含まれています。データが時刻tnからtn + 100までに到着すると、invalidate(新しいRect(left、top、right bottom))が呼び出されます。topは画面の上部が高さです(ただしbottomよりも数値は小さい)。これにより、onDraw()メソッドの呼び出しが呼び出されます。 tnからtn + 100までの領域が描かれるが、領域tn-100〜tnの以前に描かれたセグメントは消去される。それは永遠にその方法を続けます。各無効化はその領域のみを描画します(これは私の持つ唯一のデータなので)。しかし、以前に描画されたデータはすべて消去されます。だから私は行進するセグメントを得る!Android invalidate(Rect)は領域全体を無効にします
つまり、invalidate()またはinvalidate(Rect)を呼び出すと、同じ動作が発生します。
私は、Rect()のパラメータがピクセルで、これが描画されているAlertDialogウィンドウの高さと幅に基づいて値を取得していると仮定しています。
最終的に 'Rect()'の領域を減らすことで、リアルタイム描画をシミュレートし、時間ステップtを領域の代わりにt + 1に無効化することができます。
私は何か愚かなことをする必要があります。
AlertDialogで行われていることが問題ではないことを願っています。
この部分は、私のように 'アンドロイドデベロッパー'の助けを借りて助けようとしています。 最初のイベントシーケンス:
1.データはBluetooth経由でコールバックで受信されます。
2.正しいタイプのデータであれば、メインアクティビティ(UIスレッド)のBroadcastReceiverが通知され、ルーチンからWaveFormViewのViewクラスのパラメータを設定し、mainアクティビティのonCreateDialog(id)コールバックを呼び出すShowDialog(id)が呼び出されます。
3.次にinvalidate()を呼び出します。
4.ダイアログがポップアップし、グラフが描画されます。
5.その後のShowDialog(id)の呼び出しはすべてonCreateDialog(id)をバイパスします。
これは機能しますが、パラメータに関係なく常に領域全体が無効になります。ユーザーイベントもありません。あなたの例から私が思い付くことができる最高はonShow()が呼び出されません。しかし
@Override
protected Dialog onCreateDialog(int id)
{
Log.d(TAG, "Alert Dialog 'onCreateDialog' method has been called with id " + id);
Builder bldr = new AlertDialog.Builder(this);
AlertDialog alert = bldr.setView(waveForm).setNegativeButton("Dismiss " + id,
new DialogInterface.OnClickListener()
{
public void onClick(DialogInterface dialog, int id)
{
dialog.cancel();
}
}).create();
// I tried adding this and invalidating here worked only first pass
alert.setOnShowListener(
new DialogInterface.OnShowListener()
{
@Override
public void onShow(DialogInterface dialog)
{
// call to invalidate
waveForm.drawArea();
}
});
//alert.getWindow().setLayout(alert.getWindow().getAttributes().width, alert.getWindow().getAttributes().height/2);
alert.getWindow().setLayout(waveForm.getCurrentWidth(), waveForm.getCurrentHeight());
return alert;
}
私は(onShowで無効に置く場所を以下)の代わりにShowDialog(ID)の後に自分自身を呼び出すことです。
にShowDialogを呼び出す主な活動での方法は、これはおそらく完全に間違ったアプローチである
private void displayRtsa(int[] rtsaReceived)
{
// rtsaReceived[0] has the agentsink hash code
int agent = rtsaReceived[0];
// rtsaReceived[1] has the index of the RtsaData object updated
int index = rtsaReceived[1];
TreeMap<Integer, RtsaData[]> agentRtsa = BluetoothPanService.getAgentRtsaMap();
RtsaData[] rtsaDataValues = agentRtsa.get(agent);
int dialogId = 0;
synchronized(dialogIds)
{
int i = 0;
if(dialogIds.containsKey(agent + index) == false)
{
for(i = 0; i < dialogIds.size(); i++)
{
if(dialogIds.containsValue(i) == false)
{
break;
}
}
dialogIds.put(agent + index, i);
}
dialogId = dialogIds.get(agent + index);
}
final int id = dialogId;
Log.d(TAG, "Dialog id being shown = " + dialogId);
waveForm.setPeriod(rtsaDataValues[index].getPeriod());
waveForm.setMaxMin(rtsaDataValues[index].getMinValue(), rtsaDataValues[index].getMaxValue());
waveForm.setColor(Color.argb(255, 255, 200, 0));
waveForm.setData(rtsaDataValues[index].getData());
waveForm.setTitle(rtsaDataValues[index].getType());
showDialog(id);
// invalidate
// waveForm.drawArea(); (try to do in onCreateDialog callback)
}
です。おそらくopenGlが唯一の方法です。
ところで、私を入れてくれてありがとう!
を私はonDraw()ルーチンでこのメソッドを呼び出し、それが(返された値が毎回同じであることが判明全領域)、設定は無視されます。この動作を変更するにはどうすればよいですか?それはAlertDialogの設定ですか、何らかのタイプのカスタマイズされたダイアログボックスを作る必要がありますか? –
私は全体の画像を取得するか分からない。 onDrawメソッドをオーバーライドしたのと全く同じビューでinvalidateを呼び出しますか?もしそうなら、それはうまくいくはずです。そうでない場合は、なぜそれがうまくいかないかを説明します。 –
私はそう思います。私はWaveFormViewのクラスを持っています –