亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

基于MIDP1.0實現動畫效果

2019-11-18 16:13:46
字體:
來源:轉載
供稿:網友

    在SUN的技術文章里面有一篇文章講述了如何基于MIDP1.0實現動畫,個人覺得很不錯。在MIDP1.0中并為直接對動畫提供支持,如果我們明白動畫的原理,熟悉Timer和TimerTask的話實現動畫并非很困難的事情。

    動畫實際上就是一系列連續的幀,當他們變換的足夠快的時候,我們人的眼睛就會覺得他是運動的。所以如果我們能夠周期性的切換畫面,從第一幀到第二幀到第三幀 ......那么我們就可以制作出動畫的效果了。Timer和TimerTask正好可以很好的幫我們完成這一功能,如果你還不熟悉這兩個類可以參考使用java中的Timer和TimerTask。我們首先擴展TimerTask實現AnimatedImage類,它的功能就是在特定位置畫圖

import java.util.*;
import javax.microedition.lcdui.*;

// Defines an animated image, which is just a set
// of images of equal size which are drawn in turn
// to simulate movement.

public class AnimatedImage extends TimerTask
{
    PRivate Canvas canvas;
    private Image[] images;
    private int[][] clipList;
    private int current;
    private int x;
    private int y;
    private int w;
    private int h;

    // ConstrUCt an animation with no canvas.

    public AnimatedImage(Image[] images)
    {
        this(null, images, null);
    }

    // Construct an animation with a null clip list.

    public AnimatedImage(Canvas canvas, Image[] images)
    {
        this(canvas, images, null);
    }

    // Construct an animation. The canvas can be null, but
    // if not null then a repaint will be triggered on it
    // each time the image changes due to a timer event.
    // If a clip list is specified, the image is drawn
    // multiple times, each time with a different clip
    // rectangle, to simulate transparent parts.

    public AnimatedImage(Canvas canvas, Image[] images, int[][] clipList)
    {
        this.canvas = canvas;
        this.images = images;
        this.clipList = clipList;

        if (images != null && clipList != null)
        {
            if (clipList.length < images.length)
            {
                throw new IllegalArgumentException();
            }
        }


        if (images != null && images.length > 0)
        {
            w = images[0].getWidth();
            h = images[0].getHeight();
        }
    }

    // Move to the next frame, wrapping if necessary.

    public void advance(boolean repaint)
    {
        if (++current >= images.length)
        {
            current = 0;
        }

        if (repaint && canvas != null && canvas.isShown())
        {
            canvas.repaint(x, y, w, h);
            canvas.serviceRepaints();
        }
    }

    // Draw the current image in the animation. If
    // no clip list, just a simple copy, otherwise
    // set the clipping rectangle accordingly and
    // draw the image multiple times.

    public void draw(Graphics g)
    {
        if (w == 0 h == 0)
            return;

        int which = current;

        if (clipList == null clipList[which] == null)
        {
            g.drawImage(images[which], x, y, g.TOP g.LEFT);
        } else
        {
            int cx = g.getClipX();
            int cy = g.getClipY();
            int cw = g.getClipWidth();
            int ch = g.getClipHeight();

            int[] list = clipList[which];

            for (int i = 0; i + 3 <= list.length; i += 4)
            {
                g.setClip(x + list[0], y + list[1], list[2], list[3]);
                g.drawImage(images[which], x, y, g.TOP g.LEFT);
            }


            g.setClip(cx, cy, cw, ch);
        }
    }

    // Moves the animation's top left corner.

    public void move(int x, int y)
    {
        this.x = x;
        this.y = y;
    }

    // Invoked by the timer. Advances to the next frame
    // and causes a repaint if a canvas is specified.

    public void run()
    {
        if (w == 0 h == 0)
            return;

        advance(true);
    }
}

我們需要預先在jar文件里面存儲幾個大小一樣,形態有序的圖片,在MIDlet啟動的時候把它裝載在一個Image數組,并把它作為參數傳遞給AnimatedImage。
private Image[] loadFrames( String name, int frames )
                                  throws IOException {
    Image[] images = new Image[frames];
    for( int i = 0; i < frames; ++i ){
 images[i] = Image.createImage( name + i +
            ".png" );
    }

    return images;
}

Image[] frames = loadFrames( "/images/bird", 7 );
AnimatedImage ai = new AnimatedImage( frames );
ai.move( 20, 20 ); // set top-left to 20,20

下面是兩個測試效果的AnimatedCanvas和AnimationTest類的源代碼,在這里你可以得到全部的源文件和圖片資源。仔細讀讀這幾個類是很有好處的。有一點值得一提的是,在繪制圖片的時候應該判斷設備是否支持雙緩沖,如果不支持要使用雙緩沖技術避免畫面閃爍。而且我們也不適宜把動畫圖片作的過大,這樣會增大jar文件的大小,同時會給設備造成很大的負擔。

    protected void paint(Graphics g)
    {
        Graphics saved = g;

        if (offscreen != null)
        {
            g = offscreen.getGraphics();
        }

        g.setColor(255, 255, 255);
        g.fillRect(0, 0, getWidth(), getHeight());

        int n = images.size();
        for (int i = 0; i < n; ++i)
        {
            AnimatedImage img = (AnimatedImage) images.elementAt(i);
            img.draw(g);
        }


        if (g != saved)
        {
            saved.drawImage(offscreen, 0, 0, Graphics.LEFT Graphics.TOP);
        }
    }

import java.io.*;
import java.util.*;
import javax.microedition.lcdui.*;
import javax.microedition.midlet.*;

// MIDlet that displays some simple animations.
// Displays a series of birds on the screen and
// animates them at different (random) rates.

public class AnimationTest extends MIDlet implements CommandListener


  {

    private static final int BIRD_FRAMES = 7;
    private static final int NUM_BIRDS = 5;

    private Display display;
    private Timer timer = new Timer();
    private AnimatedImage[] birds;
    private Random random = new Random();

    public static final Command exitCommand = new Command("Exit", Command.EXIT,
            1);

    public AnimationTest()
    {
    }

    public void commandAction(Command c, Displayable d)
    {
        if (c == exitCommand)
        {
            exitMIDlet();
        }
    }

    protected void destroyApp(boolean unconditional)
            throws MIDletStateChangeException
    {
        exitMIDlet();
    }

    public void exitMIDlet()
    {
        timer.cancel(); // turn it off...
        notifyDestroyed();
    }

    // Generate a non-negative random number...

    private int genRandom(int upper)
    {
        return (Math.abs(random.nextInt()) % upper);
    }

    public Display getDisplay()
    {
        return display;
    }

    // Initialize things by creating the canvas and then
    // creating a series of birds that are moved to
    // random locations on the canvas and attached to
    // a timer for scheduling.


    protected void initMIDlet()
    {
        try
        {
            AnimatedCanvas c = new AnimatedCanvas(getDisplay());
            Image[] images = loadFrames("/images/bird", BIRD_FRAMES);

            int w = c.getWidth();
            int h = c.getHeight();

            birds = new AnimatedImage[NUM_BIRDS];
            for (int i = 0; i < NUM_BIRDS; ++i)
            {
                AnimatedImage b = new AnimatedImage(c, images);
                birds[i] = b;
                b.move(genRandom(w), genRandom(h));
                c.add(b);
                timer.schedule(b, genRandom(1000), genRandom(400));
            }

            c.addCommand(exitCommand);
            c.setCommandListener(this);

            getDisplay().setCurrent(c);
        } catch (IOException e)
        {
            System.out.println("Could not load images");
            exitMIDlet();
        }
    }

    // Load the bird animation, which is stored as a series
    // of PNG files in the MIDlet suite.

    private Image[] loadFrames(String name, int frames) throws IOException
    {
        Image[] images = new Image[frames];
        for (int i = 0; i < frames; ++i)
        {
            images[i] = Image.createImage(name + i + ".png");
        }


        return images;
    }

    protected void pauseApp()
    {
    }

    protected void startApp() throws MIDletStateChangeException
    {
        if (display == null)
        {
            display = Display.getDisplay(this);
            initMIDlet();
        }
    }
}


import java.util.*;
import javax.microedition.lcdui.*;

// A canvas to which you can attach one or more
// animated images. When the canvas is painted,
// it cycles through the animated images and asks
// them to paint their current image.

public class AnimatedCanvas extends Canvas
{
    private Display display;
    private Image offscreen;
    private Vector images = new Vector();

    public AnimatedCanvas(Display display)
    {
        this.display = display;

        // If the canvas is not double buffered by the
        // system, do it ourselves...

        if (!isDoubleBuffered())
        {
            offscreen = Image.createImage(getWidth(), getHeight());
        }
    }

    // Add an animated image to the list.

    public void add(AnimatedImage image)
    {
        images.addElement(image);
    }

    // Paint the canvas by erasing the screen and then
    // painting each animated image in turn. Double
    // buffering is used to reduce flicker.

    protected void paint(Graphics g)
    {
        Graphics saved = g;

        if (offscreen != null)
        {
            g = offscreen.getGraphics();
        }

        g.setColor(255, 255, 255);
        g.fillRect(0, 0, getWidth(), getHeight());

        int n = images.size();
        for (int i = 0; i < n; ++i)
        {
            AnimatedImage img = (AnimatedImage) images.elementAt(i);
            img.draw(g);
        }


        if (g != saved)
        {
            saved.drawImage(offscreen, 0, 0, Graphics.LEFT Graphics.TOP);
        }
    }
}

(出處:http://www.49028c.com)



發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
91丝袜美腿美女视频网站| 97精品伊人久久久大香线蕉| 国内精品久久影院| 日产精品久久久一区二区福利| 国产91亚洲精品| 992tv成人免费影院| 亚洲精品日韩激情在线电影| 久久久久久久久久久av| 国内精品久久久久伊人av| 国产欧美va欧美va香蕉在线| 国产精品九九九| 日韩va亚洲va欧洲va国产| 亚洲japanese制服美女| 国产不卡av在线| 日韩中文字幕国产| 国产精品青草久久久久福利99| 成人黄色免费在线观看| 欧美色xxxx| 亚洲第一福利网| 丝袜情趣国产精品| 欧美一级片久久久久久久| 精品动漫一区二区| 国产精品入口尤物| 亚洲精品一区久久久久久| 136fldh精品导航福利| 亚洲欧美福利视频| 国产美女精品视频免费观看| 亚洲精品福利在线观看| 日韩av综合网| 久久色精品视频| 欧美精品一本久久男人的天堂| 成人综合国产精品| 亚洲一区精品电影| 日韩欧美国产骚| 国产成人精品一区二区| 成人免费在线视频网址| 91av在线免费观看视频| 亚洲精品视频免费在线观看| 国产成人在线精品| 日韩av免费在线看| 成人h猎奇视频网站| 日韩国产精品视频| 国产精品久久久久久亚洲调教| 国产精品久久精品| 国产一区二区日韩精品欧美精品| 亚洲精品视频在线观看视频| 91久久精品久久国产性色也91| 欧美一区二区三区四区在线| 69久久夜色精品国产69| 黑人巨大精品欧美一区二区| 欧美日韩在线视频首页| 色偷偷偷综合中文字幕;dd| 亚洲男人的天堂网站| 日本亚洲欧美成人| 久久99国产精品自在自在app| 国产视频福利一区| 搡老女人一区二区三区视频tv| 欧美日韩视频在线| 国内免费久久久久久久久久久| 久久亚洲国产成人| 欧美激情一区二区三级高清视频| 97精品国产97久久久久久免费| 亚洲美女黄色片| 亚洲春色另类小说| 亚洲天天在线日亚洲洲精| 久久精品国产2020观看福利| 亚洲最大成人网色| 欧美日韩精品在线视频| 久久视频在线观看免费| 日韩性生活视频| 亚洲一区二区在线播放| 久久久91精品国产| 伊人伊人伊人久久| 国产欧美日韩精品丝袜高跟鞋| 亚洲欧洲黄色网| 欧美最猛黑人xxxx黑人猛叫黄| 91精品久久久久久久| 一本久久综合亚洲鲁鲁| 亚洲一区www| 欧美麻豆久久久久久中文| 97视频com| 少妇高潮久久久久久潘金莲| 在线精品国产欧美| 亚洲成av人片在线观看香蕉| 欧美xxxx14xxxxx性爽| 亚洲国产精久久久久久久| 97国产suv精品一区二区62| 日韩av手机在线| 欧美理论电影在线播放| 久久久久久久香蕉网| 中文字幕欧美在线| 97精品免费视频| 国内精品小视频| 中文字幕精品久久| 精品一区二区三区三区| 亚洲视屏在线播放| 国产日韩欧美黄色| 国语自产精品视频在线看| 亚洲精品www| 国产成人精品一区二区三区| 亚洲成人av资源网| 91在线高清免费观看| 欧美亚洲日本黄色| 日韩在线观看免费全集电视剧网站| 4444欧美成人kkkk| 国产一区红桃视频| 在线不卡国产精品| 久久精视频免费在线久久完整在线看| 国产精品毛片a∨一区二区三区|国| 久久艹在线视频| 亚洲区免费影片| 国产欧美日韩高清| 欧美综合在线第二页| 精品中文字幕在线2019| 日韩欧美中文字幕在线观看| 亚洲国产精彩中文乱码av在线播放| 国产精品视频免费在线观看| 亚洲视频在线免费看| 成人黄色影片在线| 欧美大成色www永久网站婷| 国产成人精品电影久久久| 国产亚洲精品激情久久| 久久精品成人欧美大片古装| 亚洲成人精品久久| 日韩精品免费在线视频| 欧美韩国理论所午夜片917电影| 91嫩草在线视频| 日本伊人精品一区二区三区介绍| 国产亚洲精品久久久久动| 国产精品老女人精品视频| 黄色精品在线看| 国产成人黄色av| 91精品久久久久久久久久另类| 美女999久久久精品视频| 91国语精品自产拍在线观看性色| 国产亚洲精品一区二555| 国内精品美女av在线播放| 免费av在线一区| 亚洲精品视频免费| 日韩在线视频网| 国产成人精品久久亚洲高清不卡| 亚洲精品久久久久中文字幕欢迎你| 日韩欧美在线播放| 亚洲国产欧美一区二区三区久久| 国产区精品视频| 亚洲自拍偷拍色图| 欧美xxxx14xxxxx性爽| 91性高湖久久久久久久久_久久99| 日韩av最新在线观看| 91久久精品美女高潮| 国产成人精品av| 日韩在线小视频| 国产精品国产自产拍高清av水多| 亚洲欧美一区二区三区四区| 尤物yw午夜国产精品视频明星| 狠狠躁夜夜躁人人爽超碰91| 国产日产亚洲精品| 欧美精品在线极品| 亚洲欧洲xxxx| 国产精品v日韩精品| 午夜精品免费视频| 日韩欧美成人网| 久久综合国产精品台湾中文娱乐网| 91av在线国产|