0

我想创建一个自定义加载屏幕我创建了一个可以这样做但它不起作用的类

我创建了 LoadingScreen 类,它传递一组图像字符串以在加载时加载图像

import net.rim.device.api.ui.Color;
import net.rim.device.api.ui.container.MainScreen;
import net.rim.device.api.ui.container.VerticalFieldManager;
import net.rim.device.api.ui.decor.BackgroundFactory;


public class LoadingScreen extends MainScreen {
    VerticalFieldManager vfm_Progress;
    String progressImgStr[]={"progress0000.png","progress0001.png","progress0002.png","progress0003.png","progress0004.png","progress0005.png","progress0006.png","progress0007.png"};

    public LoadingScreen() {
    this.getMainManager().setBackground(BackgroundFactory.createSolidTransparentBackground(Color.BLACK, 200));
    vfm_Progress=new VerticalFieldManager();
    LoadThread spin=new LoadThread(progressImgStr,this);
    spin.startLoading();
    spin.start();

    }       

}

然后这个类调用一个线程类,它加载图像并附加到 LoadingScreen 的 VerticalFieldManager 但是......它不起作用,所以我得到一个名为 IIlegalStateException 的错误

Thread类如下

import net.rim.device.api.system.Bitmap;
import net.rim.device.api.ui.component.BitmapField;


public class LoadThread extends Thread{
    private String[] mProgressImgStr;
    private boolean isLoading=false;
    LoadingScreen loadScreen;
    public LoadThread(String[] progressImgStr,LoadingScreen loadScreen) {
        this.mProgressImgStr=progressImgStr;
        this.loadScreen=loadScreen;
    }

    public void run() {
        if(isLoading)
        {
            for (int i = 0; i < mProgressImgStr.length; i++) {
                Bitmap img=Bitmap.getBitmapResource(mProgressImgStr[i]);
                BitmapField progressImgFld=new BitmapField(img);
                loadScreen.vfm_Progress.add(progressImgFld);
                loadScreen.add(loadScreen.vfm_Progress);
                try {
                    this.sleep(250);
                    loadScreen.vfm_Progress.delete(progressImgFld);
                    loadScreen.delete(loadScreen.vfm_Progress);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }

                if(i==mProgressImgStr.length-1)
                {
                    i=0;
                }
            }
        }


        //super.run();
    }

    public void stopLoading()
    {
        isLoading=false;
    }

    public void startLoading()
    {
        isLoading=true;
    }
}
4

2 回答 2

1

LoaderScreen.java

import java.util.Timer;
import java.util.TimerTask;
import net.rim.device.api.system.Bitmap;
import net.rim.device.api.system.Display;
import net.rim.device.api.ui.Graphics;
import net.rim.device.api.ui.container.PopupScreen;
import net.rim.device.api.ui.container.VerticalFieldManager;

public class LoaderScreen extends PopupScreen
{
    Timer loadingTimer = new Timer();
    TimerTask loadingTask;
    int imageIndex = 0;
    Bitmap loader1 = Bitmap.getBitmapResource("loader001.png");
    Bitmap loader2 = Bitmap.getBitmapResource("loader002.png");
    Bitmap loader3 = Bitmap.getBitmapResource("loader003.png");
    Bitmap loader4 = Bitmap.getBitmapResource("loader004.png");
    Bitmap loader5 = Bitmap.getBitmapResource("loader005.png");
    Bitmap loader6 = Bitmap.getBitmapResource("loader006.png");
    Bitmap loader7 = Bitmap.getBitmapResource("loader007.png");
    Bitmap loader8 = Bitmap.getBitmapResource("loader008.png");
    Bitmap loader9 = Bitmap.getBitmapResource("loader009.png");
    Bitmap loader10 = Bitmap.getBitmapResource("loader010.png");
    Bitmap loader11 = Bitmap.getBitmapResource("loader011.png");
    Bitmap loader12 = Bitmap.getBitmapResource("loader012.png");
    boolean showLoader = true;
    int screenWidth = Display.getWidth();
    int screenHeight = Display.getHeight();
    int xAnchor = 0; // (screenWidth-200)/2;
    int yAnchor = 0; // (screenHeight-40)/2;
    String loaderText = "Please wait...";

    public LoaderScreen() 
    {
        super(new VerticalFieldManager(), USE_ALL_HEIGHT | USE_ALL_WIDTH | DEFAULT_CLOSE);
        loadingTask = new TimerTask() {
            public void run() {
                invalidate();
                imageIndex++;
                if(imageIndex == 11){
                    imageIndex = 0;
                }
            }
        };
        loadingTimer.scheduleAtFixedRate(loadingTask, 0, 100);
    }

    public void setShowLoader(boolean showLoader) {
        this.showLoader = showLoader;
    }

    public boolean isShowing(){
        return showLoader;
    }

    protected void paint(Graphics graphics) {
        super.paint(graphics);
        if (showLoader) {
            //draw background:
            graphics.setColor(0x363636);
            graphics.fillRect(xAnchor, yAnchor, 200, 40);

            //draw animation frame:
            switch (imageIndex) {
                case 0:
                    graphics.drawBitmap(xAnchor + 4, yAnchor + 4, 32, 32, loader1, 0, 0);
                    break;
                case 1:
                    graphics.drawBitmap(xAnchor + 4, yAnchor + 4, 32, 32, loader2, 0, 0);
                    break;
                case 2:
                    graphics.drawBitmap(xAnchor + 4, yAnchor + 4, 32, 32, loader3, 0, 0);
                    break;
                case 3:
                    graphics.drawBitmap(xAnchor + 4, yAnchor + 4, 32, 32, loader4, 0, 0);
                    break;
                case 4:
                    graphics.drawBitmap(xAnchor + 4, yAnchor + 4, 32, 32, loader5, 0, 0);
                    break;
                case 5:
                    graphics.drawBitmap(xAnchor + 4, yAnchor + 4, 32, 32, loader6, 0, 0);
                    break;
                case 6:
                    graphics.drawBitmap(xAnchor + 4, yAnchor + 4, 32, 32, loader7, 0, 0);
                    break;
                case 7:
                    graphics.drawBitmap(xAnchor + 4, yAnchor + 4, 32, 32, loader8, 0, 0);
                    break;
                case 8:
                    graphics.drawBitmap(xAnchor + 4, yAnchor + 4, 32, 32, loader9, 0, 0);
                    break;
                case 9:
                    graphics.drawBitmap(xAnchor + 4, yAnchor + 4, 32, 32, loader10, 0, 0);
                    break;
                case 10:
                    graphics.drawBitmap(xAnchor + 4, yAnchor + 4, 32, 32, loader11, 0, 0);
                    break;
                case 11:
                    graphics.drawBitmap(xAnchor + 4, yAnchor + 4, 32, 32, loader12, 0, 0);
                    break;
            }

            //draw text:
            graphics.setColor(0xefefef);
            graphics.drawText(loaderText, xAnchor + 44, yAnchor + 6);

            //draw border:
            graphics.setColor(0xcccccc);
            graphics.drawRect(xAnchor, yAnchor, 200, 40);
        }
    }

    protected void sublayout(int maxWidth, int maxHeight) {
        maxWidth = 200;
        maxHeight = 40;
        super.sublayout(maxWidth, maxHeight);
        setExtent(maxWidth, maxHeight);
        int x = (Display.getWidth() >> 1) - (maxWidth >> 1) - 15;
        int y = (Display.getHeight() >> 1) - (maxHeight >> 1) - 30 ;
        setPosition(x, y);
    }

    public void close() 
    {
        try
        {
            loadingTimer.cancel();
            loadingTask.cancel();
        }catch (Exception e) {  }
        super.close();
    }

}

在这里,您可以将此类与以下代码一起使用。

LoaderScreen loaderScreen = new LoaderScreen();
UiApplication.getUiApplication().invokeLater(new Runnable() {
    public void run() {
        UiApplication.getUiApplication().pushModalScreen(
                loaderScreen);
    }
});


Thread thread = new Thread() {
    public void run() {
        //Do Something 
        UiApplication.getUiApplication().invokeLater(
            new Runnable() {
                public void run() {
                    try {
                            loaderScreen.close();
                        } catch (Exception e) {
                    }
                }
        });
    }
};
thread.start();

您需要自己查找图像。

于 2012-05-18T09:52:01.373 回答
0

更改 UI 更新代码如下:

synchronized (UiApplication.getEventLock()) {
    loadScreen.vfm_Progress.add(progressImgFld);
    loadScreen.add(loadScreen.vfm_Progress);
    try {
        this.sleep(250);
        loadScreen.vfm_Progress.delete(progressImgFld);
        loadScreen.delete(loadScreen.vfm_Progress);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}

任何涉及设备用户界面的操作都必须使用锁定UiApplication.getEventLock()来完成。

于 2012-05-18T10:59:55.280 回答