Как вызвать метод рисования в ежевике - PullRequest
0 голосов
/ 23 августа 2011

Как я могу вызывать рисование несколько раз в моем приложении, я пытался сделать недействительным, но это не вызывает рисование, я думаю, кто-нибудь может предоставить пример кода для многократного вызова рисования.

  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 голосов
/ 23 августа 2011

Вы можете попробовать использовать Screen.doPaint().

Достаточно ли велико ваше растровое изображение, чтобы его можно было полностью нарисовать, начиная сверху / слева (30, 40)?Может случиться так, что это не похоже на то, что оно рисует, потому что вы находитесь за границами, которые имеют смысл рисовать.

0 голосов
/ 24 августа 2011

Привет, пиюс, найди рабочий код.invalidate () нужно вызвать в методе 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();
    }
}
0 голосов
/ 23 августа 2011

Метод paint () может быть вызван либо с помощью метода invalidate, либо путем создания объекта класса, который вы используете сейчас.

Я думаю, что в приведенном выше примере кода есть ошибка опечатки. Нельзя иметь класс внутри класса, просто определяя его. Приходя к проблеме, с которой вы столкнулись

Хотя, вызывая метод invalidate, поскольку вы используете его как MyScreen.this.invalidate, который не является правильным способом его вызова, нельзя вызывать метод рисования из другого класса, так как в вашем случае это AnimationThread не возможный. Основная особенность класса Screen и метода paint заключается в том, что он вызывается после создания объекта экрана. И, насколько я понимаю, можно вызвать метод invalidate для менеджера или экрана внутри одного и того же класса, но не путем создания объекта экрана в другом классе и вызова его.

Он должен вызываться просто без использования каких-либо объектов, просто, invalidate();, перекрашивает экран или делает его недействительным.

Этого также можно добиться, создав объект того же экрана, например, если кто-то хочет отобразить экран по-другому, он может создать объект, используя разные аргументы, и соответственно обработать его в методе рисования. Здесь каждый раз, когда запускается поток, вы можете создать объект и обработать его по своему выбору.

Как образец:

public class theScreen extends MainScreen{
int dummy;
public theScreen(int firstArg){
    // Handle the firstArgument here
    dummy=0;
}
public theScreen(int secondArg,int dummy){
    // Handle the second Argument here
    this.dummy = dummy;
}
public void paint(Graphics graphcis)
{
    if(dummy == 0)
    {
        //Handle what you would like to paint here
    }
    else{
        //Handle with a different paint here
    }
}}

Надеюсь, это решит вашу проблему Удачного кодирования. Ура

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...