如何在黑莓中调用paint方法

时间:2011-08-23 05:34:30

标签: blackberry

如何在我的应用程序中多次调用paint我尝试使用invalidate但是它不是调用paint我认为任何人都可以提供多次调用paint的示例代码。

  package mypackage;

import com.rss.logger.Log;

import net.rim.device.api.system.Bitmap;
import net.rim.device.api.ui.Graphics;
import net.rim.device.api.ui.UiApplication;
import net.rim.device.api.ui.component.BitmapField;
import net.rim.device.api.ui.component.LabelField;
import net.rim.device.api.ui.container.MainScreen;

/**
 * A class extending the MainScreen class, which provides default standard
 * behavior for BlackBerry GUI applications.
 */
public final class MyScreen extends MainScreen
{
    BitmapField objBitmapField;
    boolean objBoolean;
    int postion=0;
    public MyScreen()
    {        
        objBitmapField=new BitmapField(Bitmap.getBitmapResource("bb.png"));
        // Set the displayed title of the screen       
        setTitle("MyTitle");
        objBoolean=false;
      new AnimationThread().start();

    }
    private class AnimationThread extends Thread{

        public void run() {
            super.run();
             UiApplication.getUiApplication().invokeLater(new Runnable() {
                  public void run()
                  {
                      objBoolean=true;
                    //Add a new LabelField to the screen.
                    //theScreen.add(new LabelField("Hello there.");

                    //Call the screen’s invalidate method to
                    //force the screen to redraw itself.
                    //Note that invalidate can be called
                    //at the screen, manager or field level,
                    //which means you can inform the
                    //BlackBerry to only redraw the area that
                    //has changed.

                      for (int i = 0; i < 20; i++) {
                          try {
                            sleep(200);
                        } catch (InterruptedException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        }
                        Log.info("in run");
                          postion=postion+5;
                          MyScreen.this.invalidate();
                    }


                  }
                });
        }

    }

    protected void paint(Graphics graphics) {

        super.paint(graphics);
        Log.info("in paint");
        if(objBoolean)          
        graphics.drawBitmap(20, postion, 50, 50, Bitmap.getBitmapResource("bb.png"), 30, 40);

    }

}

3 个答案:

答案 0 :(得分:0)

paint()方法可以通过使用invalidate方法或通过创建您现在使用的类的对象来调用。

我认为您在此处提到的示例代码中存在Typo错误。只要通过定义类,就不能在类中创建类。来到你面临的问题

虽然调用invalidate方法,因为你使用MyScreen.this.invalidate这不是正确的方法来调用它,但是不能从另一个类调用paint方法,就像你的情况那样{{1 }} 不可能。 Screen类和paint方法的主要特征是,一旦创建了屏幕的Object,就会调用它。 据我所知,可以在同一个类中为管理器或屏幕调用invalidate方法,但不能通过在另一个类中创建屏幕对象并调用它来实现。

应该简单地调用它,而不是简单地使用任何对象,AnimationThread,使屏幕重新绘制或失效。

也可以通过创建同一屏幕的对象来实现它,如果想要以不同的方式显示屏幕,可以使用不同的参数创建对象,并在paint方法中相应地处理它。 在这里,无论何时运行线程,您都可以创建一个对象并根据您的选择进行处理。

作为样本:

invalidate();

希望这可以解决您的问题 快乐的编码。 干杯

答案 1 :(得分:0)

您可以尝试使用Screen.doPaint()

你的位图是否足够大,可以从顶部/左边开始完全绘制(30,40)?可能只是它看起来不像它的绘画,因为你超出了绘制它的意义范围。

答案 2 :(得分:0)

嗨piyus找到工作代码。 invalidate()需要在paint()方法中调用。还有一件事也很重要,不应该在paint方法中创建对象。

import net.rim.device.api.system.Bitmap;
import net.rim.device.api.ui.Graphics;
import net.rim.device.api.ui.container.MainScreen;

public final class MyScreen extends MainScreen
{
    private boolean objBoolean=false;
    private int postion=0;
    private Bitmap bb=Bitmap.getBitmapResource("bb.png");

    public MyScreen()
    {        
        setTitle("MyTitle");
        new AnimationThread().start();
    }

    private class AnimationThread extends Thread
    {
        public void run() 
        {
            objBoolean=true;

            for (int i = 0; i < 20; i++) 
            {
                try 
                {
                    sleep(200);
                }
                catch (InterruptedException e) 
                {
                }
                postion=postion+5;
            }
        }
    }

    protected void paint(Graphics graphics) 
    {
        super.paint(graphics);
        if(objBoolean)          
            graphics.drawBitmap(20, postion, 50, 50, bb, 30, 40);
        invalidate();
    }
}