Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/182.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 自定义布局绘制画布失败_Java_Android_Canvas_Bitmap - Fatal编程技术网

Java 自定义布局绘制画布失败

Java 自定义布局绘制画布失败,java,android,canvas,bitmap,Java,Android,Canvas,Bitmap,我使用自定义布局来排列视图,而将视图转换为位图时,它不会在位图上绘制子视图。请帮助我解决此问题。这是我的代码 public class CustomLayout extends ViewGroup { private int line_height; public CustomLayout(Context context) { super(context); this.setWillNotDraw(false); }

我使用自定义布局来排列视图,而将视图转换为位图时,它不会在位图上绘制子视图。请帮助我解决此问题。这是我的代码

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);
        }
    }



}
 }

执行child.setWillNotDraw(true)很可能会跳过子视图的绘制。

为什么要覆盖dispatchDraw和onDraw,而只调用超级方法?@pskink刚刚修改了代码
    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();
                }


        }
    });