android二维位图绘制

android二维位图绘制,android,animation,bitmap,drawing,Android,Animation,Bitmap,Drawing,有人能告诉我为什么我不能像这样在我的surfaceView上添加位图吗 steering = new Steering(BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher), getWidth()-50,getHeight()-50); final int width = getWidth(); final int height = getHeight(); final Bitmap bitmap =

有人能告诉我为什么我不能像这样在我的surfaceView上添加位图吗

    steering = new Steering(BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher), getWidth()-50,getHeight()-50);
final int width = getWidth();
final int height = getHeight();
final Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher);
steering = new Steering(bitmap, width-50,height-50);
 myView.getViewTreeObserver().addOnGlobalLayoutListener( new ViewTreeObserver.OnGlobalLayoutListener() {
                @Override
                public void onGlobalLayout() {
                    //Do something here since now you have the width and height of your view
                }
            });
如果我使用整数而不是“getHeight()”-方法,则位图添加得很好。但是因为我想让这个游戏在一部以上的手机上运行而不显得奇怪,所以我想用这两种方法添加它

有人能帮忙吗


谢谢

您到底在哪里添加该行?如果它在您的
onCreate
上,则它不会向您显示图像,因为方法
getWidth()
getHeight()
将返回0。因此,要绘制它,您必须等待系统实际创建视图。 要测试您是否实际收到了一个值,请尝试更改您实际拥有的代码,如下所示:

    steering = new Steering(BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher), getWidth()-50,getHeight()-50);
final int width = getWidth();
final int height = getHeight();
final Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher);
steering = new Steering(bitmap, width-50,height-50);
 myView.getViewTreeObserver().addOnGlobalLayoutListener( new ViewTreeObserver.OnGlobalLayoutListener() {
                @Override
                public void onGlobalLayout() {
                    //Do something here since now you have the width and height of your view
                }
            });
并在转向管路上添加断点并对其进行调试。如果宽度和高度为0,则必须等待视图绘制

编辑:
活动中
/
片段
可以添加如下树观察者:

    steering = new Steering(BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher), getWidth()-50,getHeight()-50);
final int width = getWidth();
final int height = getHeight();
final Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher);
steering = new Steering(bitmap, width-50,height-50);
 myView.getViewTreeObserver().addOnGlobalLayoutListener( new ViewTreeObserver.OnGlobalLayoutListener() {
                @Override
                public void onGlobalLayout() {
                    //Do something here since now you have the width and height of your view
                }
            });
下面是一个小例子,说明你在课堂上是如何做到这一点的:

我的驾驶课:

我的活动

和我的观点类

public class MyView extends View{

    Steering steering = null;

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

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

    public void setObject(Steering steering){
        this.steering = steering;
    }

    final Paint paint = new Paint();

    @Override
    protected void onDraw(Canvas canvas) {
        canvas.save();
        if(steering!=null){
            canvas.drawBitmap(steering.getBitmap(), 0, 0, paint);
        }
        canvas.restore();
    }

}
您可以将其用于普通视图或surfaceView,无论哪种方式都可以。
抱歉,如果答案有点太长:P

那么在构造函数中使用这些方法是没有办法的?不,但是在您的活动中,您可以使用treeobserver。。我刚刚为你更新了我的答案:)谢谢你的帮助,但是我也不能让它工作,所以我对android编程是新手。但无论如何还是要感谢:)只需在类上添加一个扩展视图的setMethod。我将尽可能快地编辑我的答案,给你们展示一个例子。哇,非常感谢你们,比我预想的要多得多,这将非常有帮助:)