2013-01-08 13 views
7

W mojej aplikacji mam wyświetlacz czasu, który aktualizuje się co sekundę. Za każdym razem, gdy zmieniany jest tekstView dla pola sekund, narzędzie Opcje deweloperskie-> Pokaż narzędzia aktualizacji powierzchni miga na całym ekranie. Rozejrzałem się i naprawdę mogę znaleźć tylko this question, co całkiem dobrze wyjaśnia, że ​​nie ma sposobu, aby zapobiec powodowaniu przez TextView przekazywania na co najmniej części okna. Tak więc na pewno zweryfikuję, że moje TextView są zapakowane w swój własny kontener, ale wciąż mam ten sam problem. Każde wywołanie setText() powoduje miganie całego widoku.Wywołanie TextView.setText() przerysowuje cały ekran pomimo hierarchii widoku

Moja hierarchia jest następująca:

  • Fragment
    • RelativeLayout (Fragment głównej Widok)
      • LinearLayout
        • RelativeLayout
          • Mój Czas TextView
      • Różne inne składniki, które zmieniają widok rzadko

Chciałbym, aby to naprawić, jeśli to możliwe. Jeśli to możliwe, staram się zmniejszyć liczbę wyświetleń i planuję nad nią pracować, ale nadal jest to problem, który chciałbym usunąć z aplikacji.

Odpowiedz

10

Pokaż aktualizacje powierzchni miga cały ekran, gdy akceleracja sprzętowa jest włączona, ale to nie znaczy, że całe okno zostało przerysowane. Jest jeszcze jedna opcja, która pozwoli ci dokładnie określić, która część ekranu została przerysowana, gdy akceleracja sprzętowa jest włączona ("Pokaż aktualizacje widoku GPU").

+0

Ok, to ma dużo więcej sensu, dziękuję. Teraz wystarczy zmniejszyć liczbę wyświetleń. – Jared

1

Napotkałem podobny problem, gdy aktualizowałem zegar, który powodował, że miara przechodzi za każdym razem. Jeśli masz coś, co jest kosztowne do zmierzenia, takie jak ListView, wpływa to na wydajność. W moim przypadku miałem ListView, który nie musiał zmieniać rozmiaru, gdy timer był aktualizowany, więc zrobiłem niestandardowego właściciela ListView, aby zatrzymać działanie kaskadowe w dół do ListView. Teraz działa płynnie!

public class CustomListviewHolderLayout extends FrameLayout { 

    public int currentWidth = 0; 
    public int currentHeight = 0; 

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

    public CustomListviewHolderLayout(Context context, AttributeSet attrs) { 
     super(context, attrs); 
    } 

    public CustomListviewHolderLayout(Context context, AttributeSet attrs, 
      int defStyle) { 
     super(context, attrs, defStyle); 
    } 

    @Override 
    protected void onMeasure(final int widthMeasureSpec, final int heightMeasureSpec) { 
     //Debug Prints 
     String wMode = ""; 
     switch(MeasureSpec.getMode(widthMeasureSpec)){ 
      case MeasureSpec.AT_MOST: 
       wMode = "AT_MOST"; break; 
      case MeasureSpec.EXACTLY: 
       wMode = "EXACTLY"; break; 
      case MeasureSpec.UNSPECIFIED: 
       wMode = "UNSPECIFIED"; break; 
      default: 
       wMode = ""; 
     } 
     String hMode = ""; 
     switch(MeasureSpec.getMode(heightMeasureSpec)){ 
      case MeasureSpec.AT_MOST: 
       hMode = "AT_MOST"; break; 
      case MeasureSpec.EXACTLY: 
       hMode = "EXACTLY"; break; 
      case MeasureSpec.UNSPECIFIED: 
       hMode = "UNSPECIFIED"; break; 
      default: 
       hMode = ""; 
     } 
     Log.i("RandomCustomListViewHolder", "wMode = " + wMode + ", size = " + MeasureSpec.getSize(widthMeasureSpec)); 
     Log.i("RandomCustomListViewHolder", "hMode = " + hMode + ", size = " + MeasureSpec.getSize(heightMeasureSpec)); 
     //only remeasure child listview when the size changes (e.g. orientation change) 
     if(getChildCount() == 1){ 
      if(((MeasureSpec.getMode(widthMeasureSpec) == MeasureSpec.EXACTLY) || 
       (MeasureSpec.getMode(widthMeasureSpec) == MeasureSpec.AT_MOST)) 
       &&((MeasureSpec.getMode(heightMeasureSpec) == MeasureSpec.EXACTLY) || 
       (MeasureSpec.getMode(heightMeasureSpec) == MeasureSpec.AT_MOST))){ 
       //check if height dimensions are different than before 
       int newWidth = MeasureSpec.getSize(widthMeasureSpec); 
       int newHeight = MeasureSpec.getSize(heightMeasureSpec); 
       if((newWidth != currentWidth) || (newHeight != currentHeight)){ 
        //remeasure if different 
        Log.i("RandomCustomListViewHolder", "measuring listView"); 
        View childView = getChildAt(0); 
        childView.measure(widthMeasureSpec, heightMeasureSpec); 
        currentWidth = newWidth; 
        currentHeight = newHeight; 
        this.setMeasuredDimension(newWidth, newHeight); 
       } else { 
        //still set this view's measured dimension 
        this.setMeasuredDimension(newWidth, newHeight);  
       }    
      } else { 
       //Specify match parent if one of the dimensions is unspecified 
       this.setMeasuredDimension(ViewGroup.LayoutParams.MATCH_PARENT, 
         ViewGroup.LayoutParams.MATCH_PARENT);     
      } 
     } else { 
      //view does not have the listview child, measure normally 
      super.onMeasure(widthMeasureSpec, heightMeasureSpec);   
      currentWidth = 0; 
      currentHeight = 0; 
     } 
    } 
} 
Powiązane problemy