Canvaspublic abstract class Canvas extends Displayable The Canvas class is a base class for writing
applications that need to
handle low-level events and to issue graphics calls for drawing to the
display. Game applications will likely make heavy use of the
Canvas class.
From an application development perspective, the Canvas class is
interchangeable with standard Screen classes, so an
application may mix and
match Canvas with high-level screens as needed. For
example, a List screen
may be used to select the track for a racing game, and a
Canvas subclass
would implement the actual game.
The Canvas provides the developer with methods to
handle game actions,
key events, and
pointer events (if supported by the device). Methods are
also provided to identify the device's capabilities and mapping of
keys to game actions.
The key events are reported with respect to key codes, which
are directly bound to concrete keys on the device, use of which may hinder
portability. Portable applications should use game actions instead of key
codes.
Like other subclasses of Displayable , the
Canvas class allows the
application to register a listener for commands. Unlike other
Displayables ,
however, the Canvas class requires applications to
subclass it in order to
use it. The paint() method is declared
abstract , and so the
application must provide an implementation in its subclass. Other
event-reporting methods are not declared abstract, and their
default implementations are empty (that is, they do nothing). This allows
the application to override only the methods that report events in which the
application has interest.
This is in contrast to the {@link Screen Screen} classes, which allow
the application to define listeners and to register them with instances of
the Screen classes. This style is not used for the
Canvas class, because
several new listener interfaces would need to be created, one for each kind
of event that might be delivered. An alternative would be to have fewer
listener interfaces, but this would require listeners to filter out events
in which they had no interest.
Key Events
Applications receive keystroke events in which the individual keys are
named within a space of key codes. Every key for which events are
reported to MIDP applications is assigned a key code.
The key code values are unique for each hardware key unless two keys are
obvious synonyms for each other.
MIDP defines the following key codes:
{@link #KEY_NUM0 KEY_NUM0},
{@link #KEY_NUM1 KEY_NUM1},
{@link #KEY_NUM2 KEY_NUM2},
{@link #KEY_NUM3 KEY_NUM3},
{@link #KEY_NUM4 KEY_NUM4},
{@link #KEY_NUM5 KEY_NUM5},
{@link #KEY_NUM6 KEY_NUM6},
{@link #KEY_NUM7 KEY_NUM7},
{@link #KEY_NUM8 KEY_NUM8},
{@link #KEY_NUM9 KEY_NUM9},
{@link #KEY_STAR KEY_STAR}, and
{@link #KEY_POUND KEY_POUND}.
(These key codes correspond to keys on a ITU-T standard telephone keypad.)
Other keys may be present on the keyboard, and they will generally have key
codes distinct from those list above. In order to guarantee portability,
applications should use only the standard key codes.
The standard key codes' values are equal to the Unicode encoding for the
character that represents the key. If the device includes any other keys
that have an obvious correspondence to a Unicode character, their key code
values should equal the Unicode encoding for that character. For keys that
have no corresponding Unicode character, the implementation must use
negative values. Zero is defined to be an invalid key code. It is thus
possible for an application to convert a keyCode into a Unicode character
using the following code:
if (keyCode > 0) {
char ch = (char)keyCode;
// ...
}
|
This technique is useful only in certain limited cases. In particular,
it is not sufficient for full textual input, because it does not handle
upper and lower case, keyboard shift states, and characters that require
more than one keystroke to enter. For textual input, applications should
always use {@link TextBox TextBox} or {@link TextField TextField}
objects.
It is sometimes useful to find the name of a key in order to
display a message about this key. In this case the application may use the
{@link #getKeyName(int) getKeyName()} method to find a key's name.
Game Actions
Portable applications that need arrow key events and gaming-related events
should use game actions in preference to key codes and key names.
MIDP defines the following game actions:
{@link #UP UP},
{@link #DOWN DOWN},
{@link #LEFT LEFT},
{@link #RIGHT RIGHT},
{@link #FIRE FIRE},
{@link #GAME_A GAME_A},
{@link #GAME_B GAME_B},
{@link #GAME_C GAME_C}, and
{@link #GAME_D GAME_D}.
Each key code may be mapped to at most one game action. However, a game
action may be associated with more than one key code. The application can
translate a key code into a game action using the {@link #getGameAction(int)
getGameAction(int keyCode)} method, and it can translate a game action into
a key code using the {@link #getKeyCode(int) getKeyCode(int gameAction)}
method. There may be multiple keycodes associated with a particular game
action, but getKeyCode returns only one of them. Supposing
that g is a valid game action and k
is a valid key code for a key associated with a game action, consider
the following expressions:
g == getGameAction(getKeyCode(g)) // (1)
k == getKeyCode(getGameAction(k)) // (2)
|
Expression (1) is always true. However, expression (2)
might be true but is not necessarily true.
The implementation is not allowed to change the mapping of game
actions and key codes during execution of the application.
Portable applications that are interested in using game actions should
translate every key event into a game action by calling the {@link
#getGameAction getGameAction()} method and then testing the result. For
example, on some devices the game actions UP ,
DOWN , LEFT and RIGHT may be
mapped to 4-way navigation arrow keys. In this case,
getKeyCode(UP) would
return a device-dependent code for the up-arrow key. On other devices, a
possible mapping would be on the number keys 2 ,
4 , 6 and 8 . In this case,
getKeyCode(UP) would return KEY_NUM2 . In
both cases, the getGameAction()
method would return the LEFT game action when the user
presses the key that
is a "natural left" on her device.
Commands
It is also possible for the user to issue {@link Command commands} when
a canvas is current. Commands are mapped to keys and menus in a
device-specific fashion. For some devices the keys used for commands may
overlap with the keys that will deliver key code events to the canvas. If
this is the case, the device will provide a means transparent to the
application that enables the user to select a mode that determines whether
these keys will deliver commands or key code events to the application.
When the Canvas is in normal mode (see below),
the set of key code events available to a canvas will not change depending
upon the number of commands present or the presence of a command listener.
When the Canvas is in full-screen mode, if there is no
command listener
present, the device may choose to deliver key code events for keys that
would otherwise be reserved for delivery of commands. Game developers
should be aware that access to commands will vary greatly across devices,
and that requiring the user to issue commands during game play may have a
great impact on the ease with which the game can be played.
Event Delivery
The Canvas object defines several methods that are
called by the
implementation. These methods are primarily for the purpose of delivering
events to the application, and so they are referred to as
event delivery methods. The set of methods is:
-
showNotify()
-
hideNotify()
-
keyPressed()
-
keyRepeated()
-
keyReleased()
-
pointerPressed()
-
pointerDragged()
-
pointerReleased()
-
paint()
These methods are all called serially. That is, the implementation will
never call an event delivery method before a prior call to any of
the event delivery methods has returned. The
serviceRepaints() method is an exception to this rule, as it
blocks until paint() is called and returns. This will occur
even if the application is in the midst of one of the event delivery
methods when it calls serviceRepaints() .
The {@link Display#callSerially Display.callSerially()} method can be
used to serialize some application-defined work with the event stream.
For further information, see the
Event Handling and
Concurrency
sections of the package summary.
The key-related, pointer-related, and paint() methods
will only be called while the Canvas is actually
visible on the output
device. These methods will therefore only be called on this
Canvas object
only after a call to showNotify() and before a call to
hideNotify() . After
hideNotify() has been called, none of the key,
pointer, and paint
methods will be called until after a
subsequent call to
showNotify() has returned. A call to a
run() method resulting from
callSerially() may occur irrespective of calls to
showNotify() and
hideNotify() .
The {@link #showNotify() showNotify()} method is called prior to the
Canvas actually being made visible on the display, and
the {@link
#hideNotify() hideNotify()} method is called after the
Canvas has been
removed from the display. The visibility state of a
Canvas (or any other
Displayable object) may be queried through the use of the {@link
Displayable#isShown() Displayable.isShown()} method. The change in
visibility state of a Canvas may be caused by the
application management
software moving MIDlets between foreground and
background states, or by the
system obscuring the Canvas with system screens.
Thus, the calls to
showNotify() and hideNotify() are not
under the control of the MIDlet and
may occur fairly frequently. Application developers are encouraged to
perform expensive setup and teardown tasks outside the
showNotify() and
hideNotify() methods in order to make them as
lightweight as possible.
A Canvas can be in normal mode or in full-screen
mode. In normal mode,
space on the display may be occupied by command labels, a title, and a
ticker. By setting a Canvas into full-screen mode,
the application is
requesting that the Canvas occupy as much of the
display space as is
possible. In full-screen mode, the title and ticker are not displayed even
if they are present on the Canvas , and
Commands may be presented using some
alternative means (such as through a pop-up menu). Note that the
implementation may still consume a portion of the display for things like
status indicators, even if the displayed Canvas is in
full-screen mode. In
full-screen mode, although the title is not displayed, its text may still
be used for other purposes, such as for the title of a pop-up menu of
Commands .
Canvas objects are in normal mode by default. The normal vs.
full-screen mode setting is controlled through the use of the {@link
#setFullScreenMode} method.
Calling {@link #setFullScreenMode} may result in
{@link #sizeChanged(int, int) sizeChanged()} being called.
The default implementation of this method does nothing.
The application can override this method to handle changes
in size of available drawing area.
Note: As mentioned in the "Specification
Requirements" section
of the overview, implementations must provide the user with an indication
of network usage. If the indicator is rendered on screen,
it must be visible when network activity occurs, even when
the Canvas is in full-screen mode. |
Fields Summary |
---|
public static final int | UPConstant for the UP game action.
Constant value 1 is set to UP . | public static final int | DOWNConstant for the DOWN game action.
Constant value 6 is set to DOWN . | public static final int | LEFTConstant for the LEFT game action.
Constant value 2 is set to LEFT . | public static final int | RIGHTConstant for the RIGHT game action.
Constant value 5 is set to RIGHT . | public static final int | FIREConstant for the FIRE game action.
Constant value 8 is set to FIRE . | public static final int | GAME_AConstant for the general purpose "A " game action.
Constant value 9 is set to GAME_A . | public static final int | GAME_BConstant for the general purpose "B " game action.
Constant value 10 is set to GAME_B . | public static final int | GAME_CConstant for the general purpose "C " game action.
Constant value 11 is set to GAME_C . | public static final int | GAME_DConstant for the general purpose "D " game action.
Constant value 12 is set to GAME_D . | public static final int | KEY_NUM0keyCode for ITU-T key 0 .
Constant value 48 is set to KEY_NUM0 . | public static final int | KEY_NUM1keyCode for ITU-T key 1 .
Constant value 49 is set to KEY_NUM1 . | public static final int | KEY_NUM2keyCode for ITU-T key 2 .
Constant value 50 is set to KEY_NUM2 . | public static final int | KEY_NUM3keyCode for ITU-T key 3 .
Constant value 51 is set to KEY_NUM3 . | public static final int | KEY_NUM4keyCode for ITU-T key 4 .
Constant value 52 is set to KEY_NUM4 . | public static final int | KEY_NUM5keyCode for ITU-T key 5 .
Constant value 53 is set to KEY_NUM5 . | public static final int | KEY_NUM6keyCode for ITU-T key 6 .
Constant value 54 is set to KEY_NUM6 . | public static final int | KEY_NUM7keyCode for ITU-T key 7 .
Constant value 55 is set to KEY_NUM7 . | public static final int | KEY_NUM8keyCode for ITU-T key 8 .
Constant value 56 is set to KEY_NUM8 . | public static final int | KEY_NUM9keyCode for ITU-T key 9 .
Constant value 57 is set to KEY_NUM09 . | public static final int | KEY_STARkeyCode for ITU-T key "star" (* ).
Constant value 42 is set to KEY_STAR . | public static final int | KEY_POUNDkeyCode for ITU-T key "pound" (# ).
Constant value 35 is set to KEY_POUND . | private boolean | suppressKeyEventsUsed by GameCanvas to suppress Game action key events |
Constructors Summary |
---|
protected Canvas()Constructs a new Canvas object.
|
Methods Summary |
---|
private boolean | allowKey(int keyCode)Test to see if the given keyCode should be sent to
the application
if (!suppressKeyEvents) {
return true;
}
// NOTE: we're using Canvas's public getGameAction()
// method here
switch (getGameAction(keyCode)) {
case Canvas.UP:
case Canvas.DOWN:
case Canvas.LEFT:
case Canvas.RIGHT:
case Canvas.FIRE:
case Canvas.GAME_A:
case Canvas.GAME_B:
case Canvas.GAME_C:
case Canvas.GAME_D :
// don't generate key events for
// the defined game keys
return false;
default:
return true;
}
| void | callHideNotify(Display d)Notify this Canvas it is being hidden on the given Display
synchronized (Display.calloutLock) {
try {
this.hideNotify();
} catch (Throwable t) {
Display.handleThrowable(t);
}
}
| void | callKeyPressed(int keyCode)Handle a key press
if (allowKey(keyCode)) {
synchronized (Display.calloutLock) {
try {
this.keyPressed(keyCode);
} catch (Throwable t) {
Display.handleThrowable(t);
}
}
}
| void | callKeyReleased(int keyCode)Handle a key release
if (allowKey(keyCode)) {
synchronized (Display.calloutLock) {
try {
this.keyReleased(keyCode);
} catch (Throwable t) {
Display.handleThrowable(t);
}
}
}
| void | callKeyRepeated(int keyCode)Handle a repeated key press
if (allowKey(keyCode)) {
synchronized (Display.calloutLock) {
try {
this.keyRepeated(keyCode);
} catch (Throwable t) {
Display.handleThrowable(t);
}
}
}
| void | callPaint(Graphics g, java.lang.Object target)Paint this Canvas
super.callPaint(g, target);
if (g.getClipY() + g.getClipHeight() <= viewport[Y]) {
return;
}
// We prevent the Canvas from drawing outside of the
// allowable viewport - such as over the command labels
g.clipRect(viewport[X], viewport[Y],
viewport[WIDTH],
viewport[HEIGHT]);
synchronized (Display.calloutLock) {
g.translate(viewport[X], viewport[Y]);
try {
paint(g);
} catch (Throwable t) {
Display.handleThrowable(t);
}
g.translate(-viewport[X], -viewport[Y]);
}
| void | callPointerDragged(int x, int y)Handle a pointer drag event
synchronized (Display.calloutLock) {
try {
this.pointerDragged(x - viewport[X], y - viewport[Y]);
} catch (Throwable t) {
Display.handleThrowable(t);
}
}
| void | callPointerPressed(int x, int y)Handle a pointer press event
synchronized (Display.calloutLock) {
try {
this.pointerPressed(x - viewport[X], y - viewport[Y]);
} catch (Throwable t) {
Display.handleThrowable(t);
}
}
| void | callPointerReleased(int x, int y)Handle a pointer release event
synchronized (Display.calloutLock) {
try {
this.pointerReleased(x - viewport[X], y - viewport[Y]);
} catch (Throwable t) {
Display.handleThrowable(t);
}
}
| void | callShowNotify(Display d)Notify this Canvas it is being shown on the given Display
super.callShowNotify(d);
super.layout();
synchronized (Display.calloutLock) {
try {
this.showNotify();
} catch (Throwable t) {
Display.handleThrowable(t);
}
}
| void | callSizeChanged(int w, int h)Handle a size change notification.
super.callSizeChanged(w, h);
/*
* sizeChangeOccurred is a boolean which (when true) indicates
* that sizeChanged() will be called at a later time. So, if it
* is false after calling super(), we go ahead and notify the
* Canvas now, rather than later
*/
if (!super.sizeChangeOccurred) {
synchronized (Display.calloutLock) {
try {
this.sizeChanged(w, h);
} catch (Throwable t) {
Display.handleThrowable(t);
}
}
}
| public int | getGameAction(int keyCode)Gets the game action associated with the given key code of the
device. Returns zero if no game action is associated with this key
code. See above for further discussion of
game actions.
The mapping between key codes and game actions
will not change during the execution of the application.
// SYNC NOTE: no locking necessary as we are doing a static
// table lookup and getGameAction() is implemented natively
int n = Display.getGameAction(keyCode);
if (n == -1) {
throw new IllegalArgumentException();
}
return n;
| public int | getKeyCode(int gameAction)Gets a key code that corresponds to the specified game action on the
device. The implementation is required to provide a mapping for every
game action, so this method will always return a valid key code for
every game action. See above for further
discussion of game actions. There may be multiple keys associated
with the same game action; however, this method will return only one of
them. Applications should translate the key code of every key event
into a game action using {@link #getGameAction} and then interpret the
resulting game action, instead of generating a table of key codes at
using this method during initialization.
The mapping between key codes and game actions
will not change during the execution of the application.
// SYNC NOTE: no locking necessary as we are doing a static
// table lookup and getKeyCode() is implemented natively
int n = Display.getKeyCode(gameAction);
if (n == 0) {
throw new IllegalArgumentException();
}
return n;
| public java.lang.String | getKeyName(int keyCode)Gets an informative key string for a key. The string returned will
resemble the text physically printed on the key. This string is
suitable for displaying to the user. For example, on a device
with function keys F1 through F4 ,
calling this method on the keyCode for
the F1 key will return the string
"F1 ". A typical use for this string
will be to compose help text such as "Press
F1 to proceed."
This method will return a non-empty string for every valid key code.
There is no direct mapping from game actions to key names. To get
the string name for a game action GAME_A , the
application must call
getKeyName(getKeyCode(GAME_A));
|
// SYNC NOTE: no locking necessary as we are doing a static
// table lookup and getKeyName() is implemented natively
String s = Display.getKeyName(keyCode);
if (s == null) {
throw new IllegalArgumentException();
}
return s;
| public boolean | hasPointerEvents()Checks if the platform supports pointer press and release events.
// SYNC NOTE: return of atomic value, no locking necessary
return Display.POINTER_SUPPORTED;
| public boolean | hasPointerMotionEvents()Checks if the platform supports pointer motion events (pointer dragged).
Applications may use this method to determine if the platform is capable
of supporting motion events.
// SYNC NOTE: return of atomic value, no locking necessary
return Display.MOTION_SUPPORTED;
| public boolean | hasRepeatEvents()Checks if the platform can generate repeat events when key
is kept down.
// SYNC NOTE: return of atomic value, no locking necessary
return Display.REPEAT_SUPPORTED;
| protected void | hideNotify()The implementation calls hideNotify() shortly
after the Canvas has been
removed from the display.
Canvas subclasses may override this method in
order to pause
animations,
revoke timers, etc. The default implementation of this
method in class Canvas is empty.
| public boolean | isDoubleBuffered()Checks if the Canvas is double buffered by the
implementation.
// SYNC NOTE: return of atomic value, no locking necessary
return Display.IS_DOUBLE_BUFFERED;
| protected void | keyPressed(int keyCode)Called when a key is pressed.
The getGameAction() method can be called to
determine what game action, if any, is mapped to the key.
Class Canvas has an empty implementation of this method, and
the subclass has to redefine it if it wants to listen this method.
| protected void | keyReleased(int keyCode)Called when a key is released.
The getGameAction() method can be called to
determine what game action, if any, is mapped to the key.
Class Canvas has an empty implementation of this method, and
the subclass has to redefine it if it wants to listen this method.
| protected void | keyRepeated(int keyCode)Called when a key is repeated (held down).
The getGameAction() method can
be called to determine what game action,
if any, is mapped to the key.
Class Canvas has an empty implementation of this method, and
the subclass has to redefine it if it wants to listen this method.
| protected abstract void | paint(Graphics g)Renders the Canvas . The application must implement
this method in
order to paint any graphics.
The Graphics object's clip region defines the
area of the screen
that is considered to be invalid. A correctly-written
paint() routine
must paint every pixel within this region. This is necessary
because the implementation is not required to clear the region prior to
calling paint() on it. Thus, failing to paint
every pixel may result
in a portion of the previous screen image remaining visible.
Applications must not assume that
they know the underlying source of the paint()
call and use this
assumption
to paint only a subset of the pixels within the clip region. The
reason is
that this particular paint() call may have
resulted from multiple
repaint()
requests, some of which may have been generated from outside the
application. An application that paints only what it thinks is
necessary to
be painted may display incorrectly if the screen contents had been
invalidated by, for example, an incoming telephone call.
Operations on this graphics object after the paint()
call returns are
undefined. Thus, the application must not cache this
Graphics
object for later use or use by another thread. It must only be
used within
the scope of this method.
The implementation may postpone visible effects of
graphics operations until the end of the paint method.
The contents of the Canvas are never saved if
it is hidden and then
is made visible again. Thus, shortly after
showNotify() is called,
paint() will always be called with a
Graphics object whose clip region
specifies the entire displayable area of the
Canvas . Applications
must not rely on any contents being preserved from a previous
occasion when the Canvas was current. This call to
paint() will not
necessarily occur before any other key or pointer
methods are called on the Canvas . Applications
whose repaint
recomputation is expensive may create an offscreen
Image , paint into it,
and then draw this image on the Canvas when
paint() is called.
The application code must never call paint() ;
it is called only by
the implementation.
The Graphics object passed to the
paint() method has the following
properties:
- the destination is the actual display, or if double buffering is in
effect, a back buffer for the display;
- the clip region includes at least one pixel
within this
Canvas ;
- the current color is black;
- the font is the same as the font returned by
{@link Font#getDefaultFont() Font.getDefaultFont()};
- the stroke style is {@link Graphics#SOLID SOLID};
- the origin of the coordinate system is located at the upper-left
corner of the
Canvas ; and
- the
Canvas is visible, that is, a call to
isShown() will return
true .
| protected void | pointerDragged(int x, int y)Called when the pointer is dragged.
The {@link #hasPointerMotionEvents() hasPointerMotionEvents()}
method may be called to determine if the device supports pointer events.
Class Canvas has an empty implementation of this method, and
the subclass has to redefine it if it wants to listen this method.
| protected void | pointerPressed(int x, int y)Called when the pointer is pressed.
The {@link #hasPointerEvents() hasPointerEvents()}
method may be called to determine if the device supports pointer events.
Class Canvas has an empty implementation of this method, and
the subclass has to redefine it if it wants to listen this method.
| protected void | pointerReleased(int x, int y)Called when the pointer is released.
The {@link #hasPointerEvents() hasPointerEvents()}
method may be called to determine if the device supports pointer events.
Class Canvas has an empty implementation of this method, and
the subclass has to redefine it if it wants to listen this method.
| public final void | repaint(int x, int y, int width, int height)Requests a repaint for the specified region of the
Canvas . Calling
this method may result in subsequent call to
paint() , where the passed
Graphics object's clip region will include at
least the specified
region.
If the canvas is not visible, or if width and height are zero or
less, or if the rectangle does not specify a visible region of
the display, this call has no effect.
The call to paint() occurs asynchronously of
the call to repaint() .
That is, repaint() will not block waiting for
paint() to finish. The
paint() method will either be called after the
caller of repaint( )
returns
to the implementation (if the caller is a callback) or on another thread
entirely.
To synchronize with its paint() routine,
applications can use either
{@link Display#callSerially(Runnable) Display.callSerially()} or
{@link #serviceRepaints() serviceRepaints()}, or they can code explicit
synchronization into their paint() routine.
The origin of the coordinate system is above and to the left of the
pixel in the upper left corner of the displayable area of the
Canvas .
The X-coordinate is positive right and the Y-coordinate is
positive downwards.
synchronized (Display.LCDUILock) {
callRepaint(x + viewport[X], y + viewport[Y], width, height, null);
}
| public final void | repaint()Requests a repaint for the entire Canvas . The
effect is identical to
repaint(0, 0, getWidth(), getHeight());
synchronized (Display.LCDUILock) {
callRepaint(viewport[X], viewport[Y],
viewport[WIDTH], viewport[HEIGHT], null);
}
| public final void | serviceRepaints()Forces any pending repaint requests to be serviced immediately. This
method blocks until the pending requests have been serviced. If
there are
no pending repaints, or if this canvas is not visible on the display,
this call does nothing and returns immediately.
Warning: This method blocks until the call to the
application's paint() method returns. The
application has no
control over
which thread calls paint() ; it may vary from
implementation to
implementation. If the caller of serviceRepaints()
holds a lock that the
paint() method acquires, this may result in
deadlock. Therefore, callers
of serviceRepaints() must not hold any
locks that might be
acquired within the paint() method. The
{@link Display#callSerially(Runnable) Display.callSerially()}
method provides a facility where an application can be called back after
painting has completed, avoiding the danger of deadlock.
// SYNC NOTE: unlike most public API methods, no locking is done
// here. This is necessary because Display.serviceRepaints()
// needs to handle its own locking. We avoid locking by making
// a copy of currentDisplay -- an atomic operation -- before
// testing and using it.
Display d = currentDisplay;
if (d != null) {
d.serviceRepaints(this);
}
| public void | setFullScreenMode(boolean mode)Controls whether the Canvas is in full-screen mode
or in normal mode.
if (mode == super.fullScreenMode) {
return;
}
super.grabFullScreen(mode);
synchronized (Display.LCDUILock) {
super.fullScreenMode(mode);
}
| protected void | showNotify()The implementation calls showNotify()
immediately prior to this Canvas being made
visible on the display.
Canvas subclasses may override
this method to perform tasks before being shown, such
as setting up animations, starting timers, etc.
The default implementation of this method in class
Canvas is empty.
| protected void | sizeChanged(int w, int h)Called when the drawable area of the Canvas has
been changed. This
method has augmented semantics compared to {@link
Displayable#sizeChanged(int, int) Displayable.sizeChanged}.
In addition to the causes listed in
Displayable.sizeChanged , a size change can occur on a
Canvas because of a change between normal and
full-screen modes.
If the size of a Canvas changes while it is
actually visible on the
display, it may trigger an automatic repaint request. If this occurs,
the call to sizeChanged will occur prior to the call to
paint . If the Canvas has become smaller, the
implementation may choose not to trigger a repaint request if the
remaining contents of the Canvas have been
preserved. Similarly, if
the Canvas has become larger, the implementation
may choose to trigger
a repaint only for the new region. In both cases, the preserved
contents must remain stationary with respect to the origin of the
Canvas . If the size change is significant to the
contents of the
Canvas , the application must explicitly issue a
repaint request for the
changed areas. Note that the application's repaint request should not
cause multiple repaints, since it can be coalesced with repaint
requests that are already pending.
If the size of a Canvas changes while it is not
visible, the
implementation may choose to delay calls to sizeChanged
until immediately prior to the call to showNotify . In
that case, there will be only one call to sizeChanged ,
regardless of the number of size changes.
An application that is sensitive to size changes can update instance
variables in its implementation of sizeChanged . These
updated values will be available to the code in the
showNotify , hideNotify , and
paint methods.
// this method is intended to be overridden by the application
|
|