2012-11-12 11 views
12

मैं व्यूग्रुप में दृश्य प्रभाव लागू करने की कोशिश कर रहा हूं। मेरा विचार है कि व्यूग्रुप का बिटमैप लेना, इसे कम करना, इसे बैक अप करना, और दृश्य समूह पर इसे एक अवरुद्ध, कम गुणवत्ता वाले प्रभाव देने के लिए खींचना है।एक दृश्य और उसके सभी बच्चों के चित्रण

मैं जिस तरह से वहाँ इस कोड का उपयोग के सबसे मिल गया है:

public class Blocker { 

    private static final float RESAMPLE_QUALITY = 0.66f; // less than 1, lower = worse quality 


    public static void block(Canvas canvas, Bitmap bitmap_old) { 
     block(canvas, bitmap_old, RESAMPLE_QUALITY); 
    } 


    public static void block(Canvas canvas, Bitmap bitmap_old, float quality) { 
     Bitmap bitmap_new = Bitmap.createScaledBitmap(bitmap_old, Math.round(bitmap_old.getWidth() * RESAMPLE_QUALITY), Math.round(bitmap_old.getHeight() * RESAMPLE_QUALITY), true); 
     Rect from = new Rect(0, 0, bitmap_new.getWidth(), bitmap_new.getHeight()); 
     RectF to = new RectF(0, 0, bitmap_old.getWidth(), bitmap_old.getHeight()); 
     canvas.drawBitmap(bitmap_new, from, to, null); 
    } 
} 

मैं बस कैनवास में पारित पर आकर्षित करने के लिए और की जरूरत है की एक बिटमैप नीचे + बढ़ाया जा करने के लिए और यह अच्छी तरह से काम करता है।

public class BlockedLinearLayout extends LinearLayout { 

    private static final String TAG = BlockedLinearLayout.class.getSimpleName(); 


    public BlockedLinearLayout(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     applyCustomAttributes(context, attrs); 
     setup(); 
    } 


    public BlockedLinearLayout(Context context) { 
     super(context); 
     setup(); 
    } 


    private void setup() { 
     this.setDrawingCacheEnabled(true); 
    } 


    @Override 
    public void draw(Canvas canvas) { 
     super.draw(canvas); 
     // block(canvas); If I call this here, it works but no updates 
    } 


    @Override 
    public void onDraw(Canvas canvas) { 
     // block(canvas); If I call this here, draws behind children, still no updates 
    } 

    private void block(Canvas canvas) { 
     Blocker.block(canvas, this.getDrawingCache()); 
    } 
} 

मेरी समस्या समूह में मेरे विचार समूह में है। यदि मैं व्यूग्रुप के ड्रॉ में ब्लॉक विधि चलाता हूं, तो यह सब कुछ खत्म हो जाता है लेकिन जब बच्चे के विचार बदलते हैं तो कभी अपडेट नहीं होता है। मैंने लॉग के साथ फंक्शन कॉल का पता लगाया है, और ड्रॉ विधि चल रही है, लेकिन कुछ भी नहीं बदलता है।

मैंने इसे ड्रॉ में लागू करने का भी प्रयास किया है। यह सभी बच्चों के विचारों के पीछे बिटमैप खींचता है, और फिर वे अपडेट नहीं कर रहे हैं।

क्या कोई यह समझा सकता है कि मैं इसे ठीक करने के बारे में कैसे जाऊंगा?

उत्तर

34

इस प्रयास करें:

@Override 
protected void dispatchDraw(Canvas canvas) { 
    // call block() here if you want to draw behind children 
    super.dispatchDraw(canvas); 
    // call block() here if you want to draw over children 
} 

और destroyDrawingCache() और फिर, buildDrawingCache() हर बार जब आप एक बच्चे को बदलने कहते हैं।

+0

सुझाव के लिए धन्यवाद। दुर्भाग्यवश यह सभी बच्चों के शीर्ष पर ड्राइंग के लिए काम करता है, लेकिन अगर शुरुआती ड्रॉ के बाद बच्चों को अपडेट किया जाता है, तो दृश्य अपडेट नहीं होता है। उदाहरण के लिए, मुझे एक सिंगल टेक्स्टव्यू के साथ एक रैखिक लेआउट मिला है जो 1 से शुरू होता है और हर सेकेंड में वृद्धि करता है। मैं संख्या गिनती देख सकता हूं, लेकिन लाइनरलेआउट सिर्फ 1 के साथ खींचता है और फिर नहीं बदलता है। – raydowe

+0

हर बार जब आप बच्चे को बदलते हैं तो नष्ट करने के लिए ड्रॉइंग ड्रैच() और फिर बिल्डिंग ड्रॉइंग कैश() को कॉल करने का प्रयास करें। –

+0

धन्यवाद! ऐसा लगता है कि यह बहुत अच्छी तरह से काम कर रहा है। मैं इसके साथ थोड़ा सा खेलना चाहता हूं, लेकिन क्या आपको पता है कि माता-पिता के दृष्टिकोण से बच्चे के परिवर्तन का पता लगाने का कोई तरीका है या नहीं? मैं माता-पिता को अपने सभी बच्चों को स्वचालित रूप से बदलने में सक्षम होना चाहता हूं, स्पष्ट रूप से माता-पिता दृश्य समूह को कुछ बार करने के लिए स्पष्ट रूप से कहने के लिए कहता हूं। – raydowe

संबंधित मुद्दे