2015-04-23 130 views
1

我使用自定義佈局來排列視圖,同時將我的視圖轉換爲位圖,但它並未繪製位圖上的子視圖。請幫助我擺脫此問題,這裏是我的代碼自定義佈局繪製畫布失敗

public class CustomLayout extends ViewGroup { 
private int line_height;  
public CustomLayout(Context context) { 
    super(context);  
    this.setWillNotDraw(false);    
}      

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

@Override 
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 
    super.onMeasure(widthMeasureSpec, heightMeasureSpec); 
    assert(MeasureSpec.getMode(widthMeasureSpec) != MeasureSpec.UNSPECIFIED); 

    final int width = MeasureSpec.getSize(widthMeasureSpec); 

    // The next line is WRONG!!! Doesn't take into account requested MeasureSpec mode! 
    int height = MeasureSpec.getSize(heightMeasureSpec) - getPaddingTop() - getPaddingBottom(); 
    final int count = getChildCount(); 
    int line_height = 0; 

    int xpos = getPaddingLeft(); 
    int ypos = getPaddingTop(); 

    for (int i = 0; i < count; i++) { 
     final View child = getChildAt(i); 
     if (child.getVisibility() != GONE) { 
      final LayoutParams lp = (LayoutParams) child.getLayoutParams(); 
      child.measure(
        MeasureSpec.makeMeasureSpec(width, MeasureSpec.AT_MOST), 
        MeasureSpec.makeMeasureSpec(height, MeasureSpec.AT_MOST)); 

      final int childw = child.getMeasuredWidth(); 
      line_height = Math.max(line_height, child.getMeasuredHeight() + lp.height); 

      if (xpos + childw > width) { 
       xpos = getPaddingLeft(); 
       ypos += line_height; 
      } 

      xpos += childw + lp.width; 
     } 

    } 
    this.line_height = line_height; 

    if (MeasureSpec.getMode(heightMeasureSpec) == MeasureSpec.UNSPECIFIED){ 
     height = ypos + line_height; 

    } else if (MeasureSpec.getMode(heightMeasureSpec) == MeasureSpec.AT_MOST){ 
     if (ypos + line_height < height){ 
      height = ypos + line_height; 
     } 

    } 

    setMeasuredDimension(width, height); 
} 

@Override 
protected LayoutParams generateDefaultLayoutParams() { 
    return new LayoutParams(1, 1); // default of 1px spacing 
} 

@Override 
protected void onLayout(boolean changed, int l, int t, int r, int b) { 

    final int count = getChildCount(); 
    final int width = r - l; 
    int xpos = getPaddingLeft(); 
    int ypos = getPaddingTop()-10; 

    /** 
    * padding 
    */ 
    //int padding = 10; 

    for (int i = 0; i < count; i++) { 
     final View child = getChildAt(i); 
     if(child instanceof CheckBox) 
     { 
      CheckBox chk = (CheckBox)child; 
      Log.e("APPLAYOYUTTTTTT", String.valueOf(chk.getText())); 
     } 
     if (child.getVisibility() != GONE) { 
      final int childw = child.getMeasuredWidth(); 
      final int childh = child.getMeasuredHeight(); 
      final LayoutParams lp = (LayoutParams) child.getLayoutParams(); 
      if (xpos + childw > width) { 
       xpos = getPaddingLeft(); 
       ypos += line_height; 
      } 

      child.layout(xpos, ypos, xpos + childw, ypos + childh); 

      xpos += childw + lp.width ;//+ padding; 
      child.buildDrawingCache(true); 
      child.setWillNotDraw(true); 
     } 
    } 



} 
} 

按鈕轉換以位圖

btnViewBitmap.setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View arg0) { 
      View v = lp; // custom layout object. 

      v.measure(825, LayoutParams.WRAP_CONTENT);    
      v.setBackgroundColor(Color.TRANSPARENT); 

      Bitmap b = Bitmap.createBitmap(825, 1140, Bitmap.Config.ARGB_8888); 
      Canvas c = new Canvas(b); 
      v.layout(0, 0, v.getMeasuredWidth(), v.getMeasuredHeight()); 


       v.draw(c);     
       FileOutputStream out; 
       try { 
        out = new FileOutputStream("/mnt/sdcard/ViewBitmap.png"); 
        b.compress(Bitmap.CompressFormat.PNG, 90, out); 
        b.recycle(); 
        try { 
         out.flush(); 
        } catch (IOException e) { 
         // TODO Auto-generated catch block 
         e.printStackTrace(); 
        } 
        try { 
         out.close(); 
        } catch (IOException e) { 
         // TODO Auto-generated catch block 
         e.printStackTrace(); 
        } 
       } catch (FileNotFoundException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 


     } 
    }); 
+0

你爲什麼要重寫dispatchDraw和onDraw,而只是調用超級方法? – pskink

+0

@pskink剛纔修改了代碼 – chocolate

回答

0

做child.setWillNotDraw(真),將最有可能跳過圖紙兒童的意見。