ScrollableView.java
/*
* Copyright © 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.
*/
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package com.nokia.example.frameanimdemo;
import com.nokia.mid.ui.frameanimator.FrameAnimator;
import com.nokia.mid.ui.frameanimator.FrameAnimatorListener;
import com.nokia.mid.ui.gestures.GestureEvent;
import com.nokia.mid.ui.gestures.GestureInteractiveZone;
import com.nokia.mid.ui.gestures.GestureListener;
import com.nokia.mid.ui.gestures.GestureRegistrationManager;
import java.util.Timer;
import java.util.TimerTask;
import javax.microedition.lcdui.Graphics;
import javax.microedition.lcdui.Image;
import javax.microedition.lcdui.game.GameCanvas;
/**
*
* @author tkor
*/
public class ScrollableView extends GameCanvas implements GestureListener, FrameAnimatorListener {
private Timer mTimer;
private Graphics g;
private int x = 0;
private int y = 0;
private FrameAnimator animator;
private Image buffer;
private Graphics bg;
public static final int LISTITEM_AMOUNT = 30;
private int lowerLimit = (-LISTITEM_AMOUNT * ListItem.HEIGHT + 320);
public ScrollableView() {
super(false);
setFullScreenMode(true);
animator = new FrameAnimator();
short fps = 0;
short pps = 0;
//when fps and or pps is zero, will use platform default values
animator.register(x, y, fps, pps, this);
//register for gesturevents
GestureInteractiveZone giz = new GestureInteractiveZone(GestureInteractiveZone.GESTURE_ALL);
GestureRegistrationManager.register(this, giz);
GestureRegistrationManager.setListener(this, this);
drawList();
}
/**
* Draws just a dummy list that doesn't do anything. Good for this scrolling demonstration.
*/
private void drawList() {
buffer = Image.createImage(getWidth(), LISTITEM_AMOUNT * ListItem.HEIGHT);
bg = buffer.getGraphics();
for (int i = 0; i < LISTITEM_AMOUNT; i++) {
ListItem l = new ListItem("item " + (i + 1));
l.setPosition(0, i * ListItem.HEIGHT);
l.render(bg);
}
}
public void showNotify() {
mTimer = new Timer();
g = getGraphics();
TimerTask ui = new TimerTask() {
public void run() {
render(g);
flushGraphics();
}
};
mTimer.schedule(ui, 0, 20);
}
public void hideNotify() {
mTimer.cancel();
}
public void render(Graphics g) {
g.setColor(0xFFFFFF);
g.fillRect(0, 0, getWidth(), getHeight());
if (this.y > 0) {
this.y = 0;
} else if (this.y < lowerLimit) {
this.y = lowerLimit;
}
g.drawImage(buffer, x, y, g.TOP | g.LEFT);
}
public void animate(FrameAnimator animator, int x, int y, short delta, short deltaX,
short deltaY, boolean lastFrame) {
this.y = y;
render(g);
flushGraphics();
}
public void gestureAction(Object container, GestureInteractiveZone giz, GestureEvent event) {
switch (event.getType()) {
case GestureInteractiveZone.GESTURE_DRAG:
animator.drag(this.x + event.getDragDistanceX(),
this.y + event.getDragDistanceY());
break;
case GestureInteractiveZone.GESTURE_FLICK:
animator.kineticScroll(event.getFlickSpeed(), FrameAnimator.FRAME_ANIMATOR_FREE_ANGLE, FrameAnimator.FRAME_ANIMATOR_FRICTION_MEDIUM, event.getFlickDirection());
break;
}
}
}