2012-05-02 15 views
2

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が唯一の方法です。

ところで、私を入れてくれてありがとう!

答えて

0

私はそれがあなたが無効化を正確に何をするかによって異なると思う。無効化を呼び出すビューが長方形の無効化を処理しなかった場合、デフォルトの無効化が行われます。

いずれの場合も、動作を変更したい場合は、自分で変更することができます。「onDraw」方式のため、無効化された長方形をフェッチするために、次のコードを使用します。

public class InvalidateTestActivity extends Activity 
{ 
    static class CustomView extends ImageView 

    { 

     public CustomView(Context context) 
     { 
      super(context); 
     } 

     @Override 
     protected void onDraw(Canvas canvas) 
     { 
      final Rect r = canvas.getClipBounds(); 
      Log.d("DEBUG", "rectangle of invalidation:" + r); 
      super.onDraw(canvas); 
     } 

    } 

    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     CustomView customView = new CustomView(this); 
     customView.setLayoutParams(new FrameLayout.LayoutParams(200, 200)); 
     customView.setBackgroundColor(0xffff0000); 
     customView.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View v) 
      { 
       v.invalidate(new Rect(0, 0, 49, 49)); 
      } 
     }); 
     setContentView(customView); 
    } 
} 
+1

を私はonDraw()ルーチンでこのメソッドを呼び出し、それが(返された値が毎回同じであることが判明全領域)、設定は無視されます。この動作を変更するにはどうすればよいですか?それはAlertDialogの設定ですか、何らかのタイプのカスタマイズされたダイアログボックスを作る必要がありますか? –

+0

私は全体の画像を取得するか分からない。 onDrawメソッドをオーバーライドしたのと全く同じビューでinvalidateを呼び出しますか?もしそうなら、それはうまくいくはずです。そうでない場合は、なぜそれがうまくいかないかを説明します。 –

+0

私はそう思います。私はWaveFormViewのクラスを持っています –

関連する問題