2013-01-08 11 views
7

मेरे ऐप में मेरे पास एक टाइम डिस्प्ले है जो हर सेकेंड अपडेट करता है। प्रत्येक बार जब टेक्स्टव्यू सेकंड सेकंड फ़ील्ड के लिए उपयोग किया जाता है, तो डेवलपर विकल्प-> सतह अपडेट टूल दिखाएं पूरे स्क्रीन को चमकती है। मैंने चारों ओर देखा है और वास्तव में केवल this question देख सकता है जो बहुत अच्छी तरह से स्पष्ट करता है कि टेक्स्टव्यू को विंडो के कम से कम हिस्से के लिए रिलाउट करने से रोकने का कोई तरीका नहीं है। तो मुझे यह सत्यापित करना सुनिश्चित था कि मेरे टेक्स्ट व्यू को अपने कंटेनर में लपेटा गया है लेकिन मुझे अभी भी एक ही समस्या है। SetText() के लिए प्रत्येक कॉल पूरे दृश्य को फ्लैश करने का कारण बनती है।कॉलिंग TextView.setText() कॉलिंग पदानुक्रम के बावजूद पूरी स्क्रीन को फिर से चलाता है

  • टुकड़ा
    • RelativeLayout (टुकड़ा रूट देखें)
      • LinearLayout
        • RelativeLayout
            :

            मेरे पदानुक्रम इस प्रकार है 10

          • माई टाइम TextViews
      • विभिन्न अन्य दृश्य घटक जो शायद ही कभी

बदल मैं यदि संभव हो तो इसे ठीक करना चाहते हैं। यदि संभव हो तो मुझे अपनी दृश्य गणना को कम करने और कम करने की आवश्यकता है और मैं इस पर काम करने की योजना बना रहा हूं लेकिन यह अभी भी एक समस्या है जिसे मैं ऐप से हटाना चाहता हूं।

उत्तर

10

हार्डवेयर त्वरण चालू होने पर सतह अपडेट पूरे स्क्रीन को चमकती है लेकिन इसका मतलब यह नहीं है कि पूरी विंडो को फिर से खींचा गया है। एक और विकल्प है जिसका आप उपयोग कर सकते हैं जो आपको दिखाता है कि जब हार्डवेयर त्वरण चालू होता है तो स्क्रीन के किस हिस्से को फिर से खींचा जाता है ("GPU दृश्य अपडेट दिखाएं")।

+0

ठीक है जो बहुत अधिक समझ में आता है, धन्यवाद। अब मुझे दृश्य गणना को कम करने की जरूरत है। – Jared

1

मुझे एक ऐसी ही समस्या का सामना करना पड़ा जहां मैं एक टाइमर अपडेट कर रहा था जिसके कारण हर बार एक उपाय गुजरता था। यदि आपके पास कुछ ऐसा है जो मापने के लिए महंगा है, जैसे ListView, यह प्रदर्शन को प्रभावित करता है। मेरे मामले में, मेरे पास एक सूची दृश्य था जिसे टाइमर अपडेट होने पर आकार बदलने की आवश्यकता नहीं थी, इसलिए मैंने सूची सूची को कैस्केड करने से माप को रोकने के लिए कस्टम सूची दृश्य धारक बनाया। अब यह सुचारू रूप से चलता है!

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; 
     } 
    } 
} 
संबंधित मुद्दे