Проблема с интерфейсом SurfaceHolder.Callback в Android SDK - PullRequest
2 голосов
/ 13 июня 2011

Я возился с идеей углубиться в Android SDK с тех пор, как я недавно получил свой Droid X и совсем недавно на нем действовал. Я установил плагин ADT в Eclipse, скачал и установил Android SDK (Rev. 11) и попробовал некоторые вещи. Я хотел попробовать 2-мерную графику, так как она сильно отличается от того, на чем я трачу свои часы на работе (разработка встроенных систем).

Я пытался следовать учебному пособию здесь , но не могу построить из-за некоторых ошибок с двумя реализованными интерфейсами. Я пытаюсь собрать для 2.3.3 на 64-разрядной машине Windows 7. Я включу приведенный ниже код с важным предупреждением о том, что я не являюсь типичным Java-программистом, и что-то очевидное могло бы легко избежать меня.

Drawable Panel.java

package com.android.tutorial;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.view.SurfaceHolder;
import android.view.SurfaceView;

public abstract class DrawablePanel 
    extends SurfaceView 
    implements SurfaceHolder.Callback, ISurface {

    private AnimationThread thread;

    public DrawablePanel(Context context) {
        super(context);
        getHolder().addCallback(this);

        this.thread = new AnimationThread(getHolder(), this);
    }

     @Override
     public void onDraw(Canvas canvas) {
     }

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

    @Override
    public void surfaceCreated(SurfaceHolder holder) {
        thread.setRunning(true);
        thread.start();
    }

    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {
        boolean retry = true;
        thread.setRunning(false);
        while (retry) {
            try {
                thread.join();
                retry = false;
            } catch (InterruptedException e) {
                // we will try it again and again...
            }
        }           
    }
}

ISurface.java

package com.android.tutorial;

import android.graphics.Canvas;

public interface ISurface {
    void onInitialize();
    void onDraw(Canvas canvas);
    void onUpdate(long gameTime);
}

AndroidTutorial.java

package com.android.tutorial;


import android.app.Activity;
import android.content.Context;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.os.Bundle;

public class AndroidTutorial extends Activity {
    AnimatedSprite animation = new AnimatedSprite();

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(new AndroidTutorialPanel(this));
    }

    class AndroidTutorialPanel extends DrawablePanel {

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

        @Override
        public void onDraw(Canvas canvas) {
            super.onDraw(canvas);
            AndroidTutorial.this.animation.draw(canvas);
        }

        @Override
        public void onInitialize() {
            AndroidTutorial.this.animation.Initialize(
                    BitmapFactory.decodeResource(
                            getResources(), 
                            R.drawable.explosion), 
                            32, 32, 14, 7);
        }

        @Override
        public void onUpdate(long gameTime) {
            AndroidTutorial.this.animation.Update(gameTime);
        }
    }

}

Я получаю следующую ошибку в DrawablePanel.java в определениях surfaceChanged (), surfaceCreated () и surfaceDestroyed ():

The method [name of function mentioned above](SurfaceHolder) of type DrawablePanel must override a superclass method.

Это то же самое для onInitialize и onUpdate в AndroidTutorial.java. Я потерян, так как могу копировать / вставлять одно и то же на работе (версия 10 SDK) без ошибок. Есть мысли?

Ответы [ 2 ]

3 голосов
/ 08 сентября 2012

Это может быть немного старым, и вы, наверное, поняли это, но у меня была та же проблема (я следовал тому же примеру, что и вы).Оказывается, что эти ошибки компиляции происходят из-за уровня Java Compiler, который вы использовали, вы должны установить его на 1.6 (поэтому он принимает аннотацию @Override как действительную и для методов, реализуемых интерфейсом), если выиспользуйте уровень 1.5, также можно удалить аннотацию @Override.

3 голосов
/ 14 ноября 2011

Я понимаю, что это немного поздно, и, надеюсь, вы поняли это, но вы реализуете SurfaceHolder. Обратный вызов не расширяет его.
Удалите @Override из функций, и он должен работать.

...