gpt4 book ai didi

java - 自定义布局绘制 Canvas 失败

转载 作者:太空宇宙 更新时间:2023-11-04 13:55:59 24 4
gpt4 key购买 nike

我正在使用自定义布局来排列 View ,在将 View 转换为位图时,它不会在位图上绘制 subview 。请帮助我摆脱这个问题,这是我的代码

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



}
}

将 View 转换为位图的按钮

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


}
});

最佳答案

执行child.setWillNotDraw(true),很可能会跳过 subview 的绘制。

关于java - 自定义布局绘制 Canvas 失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29815344/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com