Java/J2ME/Clip

Материал из Java эксперт
Перейти к: навигация, поиск

Clipping Region

//jad file (please verify the jar size)
/*
MIDlet-Name: ClippingRegion
MIDlet-Version: 1.0
MIDlet-Vendor: MyCompany
MIDlet-Jar-URL: ClippingRegion.jar
MIDlet-1: ClippingRegion, , ClippingRegion
MicroEdition-Configuration: CLDC-1.0
MicroEdition-Profile: MIDP-1.0
MIDlet-JAR-SIZE: 100
*/
import javax.microedition.lcdui.Alert;
import javax.microedition.lcdui.Canvas;
import javax.microedition.lcdui.rumand;
import javax.microedition.lcdui.rumandListener;
import javax.microedition.lcdui.Display;
import javax.microedition.lcdui.Displayable;
import javax.microedition.lcdui.Graphics;
import javax.microedition.lcdui.Image;
import javax.microedition.midlet.MIDlet;
public class ClippingRegion extends MIDlet {
  private Display display;
  private MyCanvas canvas;
  public ClippingRegion() {
    display = Display.getDisplay(this);
    canvas = new MyCanvas(this);
  }
  protected void startApp() {
    display.setCurrent(canvas);
  }
  protected void pauseApp() {
  }
  protected void destroyApp(boolean unconditional) {
  }
  public void exitMIDlet() {
    destroyApp(true);
    notifyDestroyed();
  }
  public Display getDisplay() {
    return display;
  }
}
class MyCanvas extends Canvas implements CommandListener {
  private Command exit = new Command("Exit", Command.EXIT, 1);
  private ClippingRegion clippingRegion;
  private Image image = null;
  public MyCanvas(ClippingRegion clippingRegion) {
    this.clippingRegion = clippingRegion;
    
    addCommand(exit);
    setCommandListener(this);
    try {
      image = Image.createImage(70, 70);
      Graphics graphics = image.getGraphics();
      graphics.setColor(255, 0, 0);
      graphics.fillArc(10, 10, 60, 50, 180, 180);
    } catch (Exception error) {
      Alert alert = new Alert("Failure", "Creating Image", null, null);
      alert.setTimeout(Alert.FOREVER);
      this.clippingRegion.getDisplay().setCurrent(alert);
    }
  }
  protected void paint(Graphics graphics) {
    if (image != null) {
      graphics.setColor(255, 255, 255);
      graphics.fillRect(0, 0, getWidth(), getHeight());
      graphics.setClip(35, 35, 40, 40);
      graphics.drawImage(image, 30, 30, Graphics.VCENTER | Graphics.HCENTER);
    }
  }
  public void commandAction(Command command, Displayable display) {
    if (command == exit) {
      clippingRegion.exitMIDlet();
    }
  }
}





Move a clipping region around a Canvas

/*--------------------------------------------------
* Clip.java
*
* Move a clipping region around a Canvas
*
* Example from the book:     Core J2ME Technology
* Copyright John W. Muchow   http://www.CoreJ2ME.ru
* You may use/modify for any non-commercial purpose
*-------------------------------------------------*/  
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
import java.util.*;
public class Clip extends MIDlet
{
  private Display  display;     // The display
  private ClipCanvas canvas;    // Canvas 
 
  public Clip()
  {
    display = Display.getDisplay(this);
    canvas  = new ClipCanvas(this);
  }
 
  protected void startApp()
  {
    display.setCurrent( canvas );
  }
 
  protected void pauseApp()
  { }
  protected void destroyApp( boolean unconditional )
  { }
 
  public void exitMIDlet()
  {
    destroyApp(true);
    notifyDestroyed();
  }
}
/*--------------------------------------------------
* Class ClipCanvas
*
* Display the clipping region
*-------------------------------------------------*/
class ClipCanvas extends Canvas implements CommandListener
{
  private Command cmExit;  // Exit
  private Clip midlet;      // Main midlet
  private Image im = null; // Image to display
  private Random random;    // Get random number
  
  private int clipx = 0,  clipy = 0,  // View port 
  
              clipw = 45, cliph = 45; // (clipping region)
              
  private int old_clipx = 0, old_clipy = 0; // Last clipping region
  
 
  public ClipCanvas(Clip midlet)
  {
    this.midlet = midlet;
    
    // Create exit command & listen for events
    cmExit = new Command("Exit", Command.EXIT, 1);
    addCommand(cmExit);
    setCommandListener(this);
    // Get random values for starting point
    random = new java.util.Random();
 
    // Make sure the entire clipping region is 
    // visible on the display  
    clipx = Math.min((getWidth() - clipw),
                     (random.nextInt() >>> 1) % getWidth());
    clipy = Math.min((getHeight() - cliph),
                     (random.nextInt() >>> 1) % getHeight());
    try
    {
      // Create immutable image
      im = Image.createImage("/house.png");
    }
    catch (java.io.IOException e)
    {
      System.err.println("Unable to locate or read .png file");
    }    
  } 
  protected void paint(Graphics g)
  {
    if (im != null)
    {
      // Clear only the previous clipping region
      g.setColor(255, 255, 255);
      g.fillRect(old_clipx, old_clipy, clipw, cliph);      
      // Set the new clipping region
      g.setClip(clipx, clipy, clipw, cliph);
      // Draw image  
      g.drawImage(im, 0, 0, Graphics.LEFT | Graphics.TOP);
    }
  }
  public void commandAction(Command c, Displayable d)
  {
    if (c == cmExit)
      midlet.exitMIDlet();
  }
  
  protected void keyPressed(int keyCode)
  {
    // Save the last clipping region
    old_clipx = clipx;
    old_clipy = clipy;
    
    switch (getGameAction(keyCode))
    {
      case UP: 
        // Move clipping region up 3 pixels
        if (clipy > 0)
          clipy = Math.max(0, clipy - 3);
        break;
      
      case DOWN:
        // Move clipping region down 3 pixels      
        if (clipy + cliph < getHeight())
          clipy = Math.min(getHeight(), clipy + 3);
        break;
        
      case LEFT:
       // Move clipping region left 3 pixels
       if (clipx > 0)
          clipx = Math.max(0, clipx - 3);
        break;
      case RIGHT:
        // Move clipping region right 3 pixels      
        if (clipx + clipw < getWidth())
          clipx = Math.min(getWidth(), clipx + 3);
       break;
       
      case FIRE:
        // Show the whole screen by reseting 
        // the clipping region to the entire display
        clipx = clipy = 0;
        clipw = getWidth();
        cliph = getHeight();       
   }        
    repaint();
  }
}