【问题标题】:Class variable has different value in different methods类变量在不同的方法中具有不同的值
【发布时间】:2015-04-23 17:08:43
【问题描述】:

我有一个名为OurView 的课程。我有 3 个 Buttons 调用 moveImage() 并根据它是哪个 Button 传递两个数字。

moveImage() 应该改变xCoordyCoord 的值,它似乎是这样做的。当从moveImage() 打印xCoordyCoord 时,它们会显示正确的值。

但是当从delay()doDraw() 打印时,它们显示的原始值是 500。

我是否在做不正确的事情导致变量无法更新?

这是OurView类:

package com.thatoneprogrammerkid.gameminimum;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.os.Handler;
import android.util.AttributeSet;
import android.view.SurfaceHolder;
import android.view.SurfaceView;

public class OurView extends SurfaceView implements SurfaceHolder.Callback {

    private SurfaceHolder holder;
    private Handler handler = new Handler();
    private Bitmap testimg;
    private int xCoord = 500;
    private int yCoord = 500;
    int xPos;
    int yPos;

    public OurView(Context context) {
        super(context);
        init();
    }

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

    public OurView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        init();
    }

    private void init() {
        holder = getHolder();
        holder.addCallback(this);
        testimg = BitmapFactory.decodeResource(getResources(),R.drawable.testimg);
    }

    void moveImage(int xChange, int yChange) {
        this.xCoord = this.xCoord + xChange;
        this.yCoord = this.yCoord + yChange;
        System.out.println("Move Image");
        printCoords();
    }

    void printCoords() {
        System.out.println(xCoord);
        System.out.println(yCoord);
    }

    void delay() {
        System.out.println("Delay");
        printCoords();
        handler.postDelayed(new Runnable() {
            public void run() {

                Canvas canvas = getHolder().lockCanvas();
                System.out.println("Run");
                printCoords();

                if(canvas != null){
                    synchronized (getHolder()) {
                        doDraw(canvas, xCoord, yCoord);
                    }
                    holder.unlockCanvasAndPost(canvas);
                }

            }
        }, 33);
    }

    void doDraw(Canvas canvas, int x, int y) {
        xPos = this.xCoord + (testimg.getWidth()/2);
        yPos = this.yCoord + (testimg.getHeight()/2);
        System.out.println("Draw");
        printCoords();
        canvas.drawARGB(255, 55, 255, 255);
        canvas.drawBitmap(testimg, x, y, null);
        delay();
    }

    @Override
    public void surfaceCreated(final SurfaceHolder holder) {
       delay();
    }

    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {}


    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {}

}

这是处理按钮按下的类:

package com.thatoneprogrammerkid.gameminimum;

import android.app.Activity;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.os.Bundle;
import android.util.AttributeSet;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;

public class SurfaceViewExample extends Activity {

    OurView gameView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        gameView = new OurView(this);
        setContentView(R.layout.activity_surface_view_example);
    }

    public void arrowPressed(View view) {
        switch (view.getId()) {

            case R.id.arrowLeft:
                gameView.moveImage(-1,0);
                break;

            case R.id.arrowRight:
                gameView.moveImage(1,0);
                break;

            case R.id.arrowUp:
                gameView.moveImage(0,1);
                break;
        }
    }
}

编辑:

为了澄清,按下按钮 10 次后 moveImage() 中的 printCoords() 显示如下:

510
500

所有其他位置的 printCoords() 显示如下:

500
500

【问题讨论】:

  • delay() 或 doDraw() 显示原始值 500 女巫是正确的,你期望什么?
  • 你是在调用 moveImage() 之后调用 delay() 还是 doDraw()。另外,你能检查一下 moveImage 的参数,以确保它们不是 0, 0 吗?
  • 我 100% 确定 moveImage 的参数不是 0,0。就像我在帖子中所说的那样,如果我使用 moveImage 更改 xCoord 和 yCoord,然后从 moveImage 中打印它们,它们会反映正确的值(每次按下增加一,因此在按下 moveImage 中的打印功能 10 次后打印“510 / n 500")

标签: java android scope


【解决方案1】:

如果我猜对了,那么你用来调用 moveImage() 和 delay() 的引用是不一样的。也许你做了类似的事情:

ourView = new OurView();

在调用 moveImage 之后。

【讨论】:

  • 我不确定这怎么可能,因为我需要一个类的实例才能调用 moveImage。如果您建议我有两个实例,那么情况也并非如此。在我的主要课程中,我有gameView = new OurView
  • 你能把调用MoveImage()和delay()的方法贴出来吗?
  • 我刚刚添加了 SurfaceViewExample 类,它处理按钮按下。 delay() 首先从surfaceCreated() 调用,然后从doDraw() 调用。
  • 如果你使用 SurfaceViewExample 调用 printCoords() 和 moveImage(),那么你可能有不同的 "SurfaceViewExample" 实例。或者您持有具有 SurfaceViewExample 作为属性的类的不同实例。
  • 我不确定是否有两个 SurfaceViewExample 实例。据我所知,android 中的活动不能重复。但即使有可能,我也不知道我会怎么做。我的主要活动只有一个调用此代码的按钮:public void startSurfaceViewExample(View view) { Intent startSurfaceViewExample = new Intent(this, SurfaceViewExample.class); startActivity(startSurfaceViewExample); }
猜你喜欢
  • 2011-04-07
  • 2017-04-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-24
  • 1970-01-01
相关资源
最近更新 更多