2012-05-02 3 views
2

invalidate (Rect)가 전체 영역을 무효화하는 이유를 알지 못합니다. 영역은 5 개의 섹션으로 나누어지고 각 섹션에서 선 그래프가 그려집니다. 각 섹션에는 100 점이 포함되어 있습니다. 데이터가 tn에서 tn + 100까지 도착할 때 invalid (새로운 Rect (왼쪽, 위쪽, 오른쪽 아래))를 호출합니다. 여기서 top은 높이의 스크린 상단입니다 (그러나 bottom보다 낮은 숫자 값). 그러면 onDraw() 메서드에 대한 호출이 호출됩니다. tn에서 tn + 100까지의 영역이 그려지지만 영역 tn-100에서 tn까지 이전에 그려진 세그먼트가 지워집니다. 그 길은 영원히 계속됩니다. 각 무효화는 그 지역 (오직 내가 가지고있는 유일한 데이터이기 때문에)에서 올바른 것으로 그려지지만 이전에 그려진 모든 데이터는 지워집니다. 그래서 저는 행진하는 세그먼트를 얻습니다!Android invalidate (Rect)가 전체 영역을 무효화합니다.

즉, invalidate() 또는 invalidate (Rect)를 호출하면 동일한 동작을 얻습니다.

저는 Rect()의 매개 변수가 픽셀이고 이것이 그려지는 AlertDialog 창의 높이와 너비를 기반으로하는 값을 얻고 있다고 가정합니다.

결국 'Rect()'영역을 줄이면 실시간 그리기를 시뮬레이션하고 시간 단계 t 만 영역 대신 t + 1로 무효화 할 수 있습니다.

나는 바보 같은 짓을하고있을거야.

AlertDialog에서 수행되고 있다는 사실이 문제가되지 않기를 바랍니다.

이 부분은 'android developer'의 도움을 받아 맘에 들어요. 첫 번째 이벤트 시퀀스 :
1. 데이터가 블루투스를 통해
으로 수신됩니다. 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; 
} 

I합니다 (에서 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 메서드를 재정의 한 것과 동일한 뷰에서 무효화를 호출합니까? 그렇다면 작동 할 것입니다. 그렇지 않은 경우 작동하지 않는 이유를 설명합니다. –

+0

나는 그렇게 생각할 것이다. WaveFormView 클래스를 확장했습니다. –

관련 문제