如何在我的应用程序中多次调用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);
}
}
答案 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();
}
}