gpt4 book ai didi

Android以编程方式添加两个带有 Canvas 的 View

转载 作者:行者123 更新时间:2023-11-29 19:34:48 27 4
gpt4 key购买 nike

我一直在尝试以编程方式将两个带有 Canvas 的 View 添加到我的 Activity 中,但看起来只添加了第一个(我可以通过查看控制台输出来判断)。我做错了什么?

这是我的代码:

package app.com.example.android.drawtwoviews;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.LinearLayout;

public class MainActivity extends AppCompatActivity {
DrawView drawView;
DrawView2 drawView2;
private LinearLayout root;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

root = new LinearLayout(this);
root.setOrientation(LinearLayout.VERTICAL);

drawView = new DrawView(this);
drawView.setBackgroundColor(Color.WHITE);
root.addView(drawView);

drawView2 = new DrawView2(this);
drawView2.setBackgroundColor(Color.WHITE);
root.addView(drawView2);

setContentView(root);
}

public class DrawView extends View {
Paint paint = new Paint();

public DrawView(Context context) {
super(context);
}

@Override
public void onDraw(Canvas canvas) {
System.out.println("DrawView1");
paint.setColor(Color.BLACK);
//paint.setStrokeWidth(3);
canvas.drawRect(30, 30, 80, 80, paint);


}

}


public class DrawView2 extends View {
Paint paint = new Paint();

public DrawView2(Context context) {
super(context);
}

@Override
public void onDraw(Canvas canvas) {
System.out.println("DrawView2");
paint.setColor(Color.BLUE);
paint.setStrokeWidth(3);
canvas.drawRect(300, 300, 400, 400, paint);


}

}
}

最佳答案

您在未指定布局参数的情况下将 View 添加到 root。这意味着他们都得到了 default layout parameters of LinearLayout ,对于垂直布局,它是 (MATCH_PARENT, WRAP_CONTENT)

您的自定义 View 都没有覆盖 onMeasure(),这意味着 measure到他们默认建议的最小尺寸 0×0。

这意味着您的 LinearLayout 正在布局两个请求大小为 0×0 且布局规范为 (MATCH_PARENT, WRAP_CONTENT) 的 View 。计算方法是 a bit tricky , 但是你的第一个 child 占据了全屏高度而你的第二个 child 是 0px 高。两个 child 都是全屏宽度。您可以在 Hierarchy Viewer 中轻松看到这一点.

要解决这个问题,您需要指定布局参数:

// in onCreate()
int width = LinearLayout.LayoutParams.MATCH_PARENT;
int height = 0;
int weight = 1;
LinearLayout.LayoutParams params =
new LinearLayout.LayoutParams(width, height, weight);

drawView = new DrawView(this);
drawView.setBackgroundColor(Color.WHITE);
root.addView(drawView, params); // note the extra argument

drawView2 = new DrawView2(this);
drawView2.setBackgroundColor(Color.WHITE);
root.addView(drawView2, params); // note the extra argument

或者您可以修改 DrawView 以便它们测量到某个最小尺寸:

public class DrawView extends View {
// paint
// constructor
// onDraw

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec)
{
setMeasuredDimension(80, 80);
}
}


public class DrawView2 extends View {
// paint
// constructor
// onDraw

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec)
{
setMeasuredDimension(400, 400);
}
}

关于Android以编程方式添加两个带有 Canvas 的 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39337030/

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