Позиционирование анимированных кадров - PullRequest
0 голосов
/ 03 сентября 2010

У меня есть поле, которое расширяет 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);
        }
    }
}

Ответы [ 2 ]

0 голосов
/ 08 сентября 2010

Исправлена ​​проблема, удаляя все вещи getPreferredWidth / Height, удалял метод sublayout () в моем настраиваемом поле и просто переписывал layout () внутри моего настраиваемого менеджера, чтобы правильно расположить все поля (только одно). Это привело к тому, что image.getFrameLeft () и image.getFrameTop () возвращают правильные значения, где я раньше занимался позиционированием.

Спасибо за ответы. Я делал это намного сложнее, чем нужно было.

0 голосов
/ 03 сентября 2010

А как насчет этого?

         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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...