PanoramaCanvas.java

/**
 * Copyright (c) 2011 Nokia Corporation. All rights reserved.
 * Nokia and Nokia Connecting People are registered trademarks of Nokia Corporation.
 * Oracle and Java are trademarks or registered trademarks of Oracle and/or its
 * affiliates. Other product and company names mentioned herein may be trademarks
 * or trade names of their respective owners.
 * See LICENSE.TXT for license information.
 */

package com.nokia.example;

import java.io.IOException;

import javax.microedition.lcdui.Canvas;
import javax.microedition.lcdui.Graphics;
import javax.microedition.lcdui.Image;
import javax.microedition.sensor.Data;

import com.nokia.mid.ui.DeviceControl;

public class PanoramaCanvas extends Canvas
{
    private static final int STEP = 5;
    private static ExitIf iExit;
    private static Image iImage;
    private static int iImageHeight;
    private static int iImageWidth;
    private static int x = 0;
    private static int y = 0;
    private static int ii = 0;

    public PanoramaCanvas(  Image aImage, ExitIf aExit) throws IOException
    {
        super();
        setFullScreenMode( true );

        iExit = aExit;
        iImage = aImage;
        iImageHeight = iImage.getHeight();
        iImageWidth = iImage.getWidth();
        y=-(iImageHeight-getHeight())/2;

        repaint();
    }

    void setPosition(Data[] aData) {

        if (ii++%100==0) {
            DeviceControl.setLights(0, 100);   //to keep backlight on
            setFullScreenMode( true );
        }

        x = getX(x+=getX(aData));
        y = getY(y+=getY(aData));

        repaint();
    }

    /**
     * deal with any key presses
     */
    protected void keyPressed(int keyCode) {
        switch (keyCode) {
        case -1:    //up
        case Canvas.UP:
            y = getY(y+=STEP);
            break;
        case -2: //down
        case Canvas.DOWN:
            y = getY(y+=-STEP);
            break;
        case -3:    //left
        case Canvas.LEFT:
            x = getX(x+=STEP);
            break;
        case -4: //right
        case Canvas.RIGHT:
            x = getX(x+=-STEP);
            break;
        default:
        }
        repaint();

    }


    protected void keyRepeated(int keyCode) {
        keyPressed(keyCode);

    }


    protected void paint( Graphics g ) {
        g.setColor(0, 0, 0);
        g.fillRect(0, 0, getWidth(), getHeight());
        g.drawImage( iImage, x , y, Graphics.TOP | Graphics.LEFT );
        if ( x + iImageWidth - getWidth() < 0 )
            g.drawImage( iImage, x + iImageWidth, y, Graphics.TOP | Graphics.LEFT );

    }

    protected void pointerPressed(int x, int y) {        iExit.exit();    }

    protected void sizeChanged(int w, int h) {
        y=-(iImageHeight-getHeight())/ 2;
        repaint();
    }


    private int getX(Data[] aData) {
        int x_axis = 0;
        boolean isPortrait = getHeight()>getWidth();
        int index= isPortrait? 0: 1;

        try {
            for (int i=0; i<3; i++) {
                x_axis += aData[index].getIntValues()[0];
            }
            x_axis = (int)(x_axis/3);
        } catch (IllegalStateException e) {
            for (int i=0; i<3; i++) {
                x_axis += (int)aData[index].getDoubleValues()[0];
            }
            x_axis = (int)(x_axis/3);
        }

        return isPortrait?-x_axis%iImageWidth:x_axis%iImageWidth;
    }



    private int getY(Data[] aData) {
        int y_axis = 0;
        boolean isPortrait = getHeight()>getWidth();
        int index= isPortrait? 1: 0;

        try {
            for (int i=0; i<3; i++) {
                y_axis += aData[index].getIntValues()[0];
            }
            y_axis = (int)(y_axis/3);
        } catch (IllegalStateException e) {
            for (int i=0; i<3; i++) {
                y_axis += (int)aData[index].getDoubleValues()[0];
            }
            y_axis = (int)(y_axis/3);
        }

        return y_axis%iImageHeight;
    }

    private int getX(int x) {
        x = x>0?-iImageWidth+x:x;
        return x % iImageWidth;
    }

    private int getY(int y) {
        y = y>0?0:y;    // upper limit

        //This is to center the image if the screen is higher than the image.
        if (iImageHeight<getHeight())
            return -(iImageHeight-getHeight())/2;

        return Math.abs(y)>iImageHeight-getHeight()?(getHeight()-iImageHeight):y;    //bottom limit
    }

    static interface ExitIf
    {
        public void exit();
    };
}