让GestureDetector与handleMessage

时间:2017-08-20 20:59:09

标签: android gesturedetector

我的应用程序显示了一堆位图,它们一个接一个地动画,因为它存储在Bitmap数组中,最初当应用程序启动时,curPosition为0,以便在索引0处开始动画化obj。handleMessage将为每个obj设置动画。当应用程序第一次启动时,每个obj之间的延迟为1000毫秒,因此当应用程序第一次启动时,handleMessage会正常地为每个对象设置动画。

问题是我双击重启按钮位图。我使用了GestureDetector类,并且我通过位图构建了一个Restart按钮,当我监听onDoubleTap时,会发生什么是handleMessage将通过每个位图重新启动它们的动画。

出于某种原因,当我双击Restart按钮位图时,handleMessage正在运行,我知道这一点,因为我输入了一个logcat消息,并且在update方法中我看到它通过每个curPosition运行,所以我的意思是这个line:Log.i(" cur pos。到目前为止:","" + curPosition);

但我不会直观地看到通过更新方法运行的动画,除非我中断应用程序(即关闭应用程序或最小化然后恢复应用程序)并双击“重新启动”按钮位图和双击“重新启动”按钮位图仅适用于此我需要中断应用程序才能让它再次运行。

public class MainActivity extends Activity  implements
    GestureDetector.OnGestureListener,
    GestureDetector.OnDoubleTapListener {

private MySurfaceView mysurfaceView;

private Bitmap restart_buttonBitmap;
private GestureDetector mGestureDetector;
private MiniProj2Button restart;
private MiniProj2Button newLevel;

private final int SIZE = 5;
private final int DELAY = 1000;
private Bitmap[] myObjs = new Bitmap[ SIZE ];

//Screen size info
private int screenWidth;
private int screenHeight;
//The size in pixels of a place on the game board
private int blockSize;
private int numBlocksWide;
private int numBlocksHigh;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    mySurfaceView = new MySurfaceView(this);
    setContentView(mySurfaceView);

    // Create a GestureDetector
    mGestureDetector = new GestureDetector(this, this);

    // Attach listeners that'll be called for double-tap and related gestures
    mGestureDetector.setOnDoubleTapListener( this );

}//END METHOD: onCreate

@Override
protected void onStop() {
    super.onStop();
    Log.d("onStop", "Main Activity's onStop called");
    gameView.surfaceDestroyed( mySurfaceView.getHolder() );
    this.finish();
}

@Override
protected void onResume() {
    super.onResume();
    Log.d("onResume", "Main Activity's onResume called");

    mySurfaceView = new MySurfaceView(this);
    setContentView(mySurfaceView);
    mySurfaceView.surfaceCreated( mySurfaceView.getHolder() );
}

@Override
protected void onPause() {
    super.onPause();
    Log.i("onPause", "Main Activity's onPause called");
    mySurfaceView.surfaceDestroyed( mySurfaceView.getHolder() );
}

@Override
public boolean onDoubleTap(MotionEvent e) {

    //reset animation if Restart button pressed!
    if ( restart.isButtonTouched(e.getX(), e.getY(), blockSize,blockSize)  ) {

        curPosition = 0;

    }

    return true;
}

public void configureDisplay() {
    //find out the width and height of the screen
    Display display =
            getWindowManager().getDefaultDisplay();
    Point size = new Point();
    display.getSize(size);
    screenWidth = size.x;
    screenHeight = size.y;

    //Determine the size of each block/place on the board
//        blockSize = screenWidth/10;
    blockSize = screenWidth/10;

    //Determine how many blocks will fit into the
    //height and width
//        numBlocksWide = 10;
    numBlocksWide = 10;
    numBlocksHigh = ( ( screenHeight ) ) / blockSize;


}//END METHOD: configureDisplay

@Override
public boolean onTouchEvent(MotionEvent e) {
    mGestureDetector.onTouchEvent(e);
    return super.onTouchEvent(e);

}//END onTouchEvent

class MySurfaceView extends SurfaceView implements SurfaceHolder.Callback, Handler.Callback {

    Canvas canvas = new Canvas();
    SurfaceHolder surfaceHolder;//this lets us access the canvas but still need to use Canvas class
    Handler myHandler;
    Paint paint = new Paint ();

    public MySurfaceView(Context context) {
        super(context);
        paint.setColor(Color.argb(255, 0, 0, 0));
        path = new Path ();
        myHandler = new Handler(this);
        getHolder().addCallback(this);
    }

    @Override
    public void surfaceCreated(SurfaceHolder holder) {
        this.surfaceHolder = holder;
        myHandler.sendEmptyMessage(0);
    }

    @Override
    public void surfaceChanged(SurfaceHolder holder,
                               int format, int width, int height) {
        // What do I enter here???
    }

    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {
        Log.i("Me", "surfaceDestroyed: bye!" );
        myHandler.removeCallbacksAndMessages(null);
    }

    protected void drawIt ( ) {

        if ( surfaceHolder.getSurface().isValid() ) {
            canvas = surfaceHolder.lockCanvas();
            canvas.drawColor(Color.WHITE);//the background

            //for each obj, draw it

            surfaceHolder.unlockCanvasAndPost(canvas);
        }//END IF BLOCK: For valid surfaceHolder
    }//END METHOD: drawIt

    public void update() {
        Log.i ("cur pos. so far:", "" + curPosition );

        if ( curPosition < SIZE ) {
            myObjs [ curPosition ].animateMe ( );
            curPosition++;
        }


    }//END METHOD: update


    @Override
    public boolean handleMessage(Message msg) {

        if (curPosition < SIZE  ) {
            Log.i("Still objs 2 animate","Yes");
            Log.i ("cur pos. so far:", "" + curPosition );
            gameView.update();
            gameView.drawIt();
            myHandler.sendEmptyMessageDelayed(msg.what, DELAY);
        }

        else {
            myHandler.sendEmptyMessageDelayed(msg.what, 10);
            gameView.drawIt();
        }

        return true;
    }//END METHOD: handleMessage

}//END INNER CLASS: MySurfaceView
}//END CLASS: MainActivity

0 个答案:

没有答案