问题描述
我一直在浏览整个互联网,但找不到该问题的任何答案。我想创建一个背景,一些图像按钮以及一堆运动图形(圆圈)。由于我不知道如何用移动图形覆盖xml布局,因此我选择自定义创建视图,绘制背景,imageButton和圆形(2D图形)。
public class GameView extends View implements UtilConstants
自从扩展View类以来,我不得不在构造函数中调用超类构造函数
GameView(Context context) {
super(context);
this.context = context;
this.paint = new Paint();
}
并实现onDraw方法,该方法的作用类似于Java paintComponent
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas); // necessary for some reason
setGridBackground(); // sets the background
paint.setColor(Color.parseColor("#FF0000"));
canvas.drawCircle(this.x += 10,300,20,paint); //moves my graphics (ball) within the screen
drawscoreInLeftUpperCorner(canvas,20); // paints a string text on the screen
setAbilitiesImages(); // places some imageButtons
try {
Thread.sleep(THREAD_REFRESH_RATE_MS);
} catch (InterruptedException ex) {
System.out.println(ex);
}
invalidate();
}
现在,要解决我的问题: 我不知道如何设置那些ImageButtons!我正在尝试
private void setAbilititesImages() {
ImageButton imageButton = new ImageButton(this.context); // is this ok to put the argument this.context??
imageButton.setLayoutParams(new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,ViewGroup.LayoutParams.WRAP_CONTENT));
imageButton.setimageResource(R.drawable.monster); // set my resource
RelativeLayout relativeLayout = findViewById(R.id.in_game_layout); // what is the purpose of this???
if (relativeLayout != null) { // it never enters this if,relativeLayout is always null
relativeLayout.addView(imageButton);
}
}
Aaaa和图像按钮从不显示...为什么需要使用相对/线性布局?我创建的R.id.in_game_layout只是一个空的RelativeLayout xml。我不能只使用类似的
imageButton.setimageResource(R.drawable.monster); // set my resource
imageButton.setBounds(.....);
(View)this.add(imageButton); ???
解决方法
ImageButton需要一个父视图托管在其中。父视图可以是RelativeLayout,linearlayout或ConstraintLayout。
在您的情况下,实例relativeLayout始终为null,因为未指定在其中查找findById的视图父级。
您应该做出类似的事情:
RelativeLayout relativeLayout = view.findViewById(R.id.in_game_layout);
,您还需要在父相对布局中添加布局参数,以正确显示“图像”按钮。
示例
RelativeLayout relativeLayout = findViewById(R.id.relativeLayout);
RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(
ViewGroup.LayoutParams.WRAP_CONTENT,ViewGroup.LayoutParams.WRAP_CONTENT);
ImageButton imageButton = new ImageButton(this);
imageButton.setImageDrawable(getResources().getDrawable(R.drawable.ic_launcher_background,null));
relativeLayout.addView(imageButton,params);