У меня есть поле, которое расширяет BitmapField (называемое AnimatedGIFField) и AnimatorThread (расширяющий поток), которое выполняет цикл по кадрам GIF, увеличивает текущий кадр и делает поле недействительным, вызывая метод paint () для рисования следующий кадр (в результате анимация). Код анимации работает нормально, но моя проблема в методе paint () класса AnimatedGIFField. Я звоню ' graphics.drawImage () ' и у меня возникают проблемы с получением правильных позиций для x и y (первые два аргумента для drawImage ()). Позиционирование AnimatedGIFField работает и выполняется путем переопределения getPreferredWidth () и getPreferredHeight (). Соответствующий код здесь:
public class AnimatedGIFField extends BitmapField {
/**
The current frame in the animation sequence; the AnimatorThread
increments this so paint() knows which frame to draw.
*/
private int currentFrame;
public AnimatedGIFField(GIFEncodedImage image, long style) {
super(image.getBitmap(), style);
this.image = image;
this.preferredWidth = this.image.getWidth();
this.preferredHeight = -(this.image.getHeight() * 4);
}
protected void paint(Graphics graphics) {
// Calling super draws the first background frame.
super.paint(graphics);
// Don't redraw if this is the first frame.
if (this.currentFrame != 0) {
// Draw the animation frame.
/* getFrameLeft() and getFrameTop() both return the top left-most position (0, 0). */
/* graphics.drawImage(this.image.getFrameLeft(this.currentFrame), */
/* this.image.getFrameTop(this.currentFrame), */
/* this.image.getFrameWidth(this.currentFrame), */
/* this.image.getFrameHeight(this.currentFrame), */
/* this.image, this.currentFrame, 0, 0); */
/*
Currently trying some hackish nonsense like this to position the frame, although
it probably won't scale properly across different devices/screen sizes.
*/
int x = (this.getManager().getWidth() / 2) - 45;
int y = (this.getManager().getHeight() / 2) + 83;
graphics.drawImage(x, y,
this.image.getFrameWidth(this.currentFrame),
this.image.getFrameHeight(this.currentFrame),
this.image, this.currentFrame, 0, 0);
}
}
}