Отрисовка холста: невозможно отобразить анимацию с помощью сгенерированных растровых изображений во время выполнения - PullRequest
0 голосов
/ 07 марта 2012

Здесь нужна небольшая помощь: у меня сейчас нет идей ...

Вот что мне нужно сделать:

  • Рендеринг "базового" изображения [оно созданоиз байтового массива ARGB.8888]
  • пользователь нажимает 2 точки на экране;Мне нужно выполнить пиксельные манипуляции с областью пикселей вокруг пути, взятого из одной точки в другую ... [Мне нужно вычислить квадратный блок пикселей для каждого пикселя на всем пути].
  • отображать модификацию изображения по мере продвижения кода в виде анимации.

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

public void onDraw(Canvas canvas){

canvas.drawColor(Color.WHITE);
Paint p = new Paint();
canvas.drawBitmap(base,0,0,p);

traverse clickEvent1.x -> clickEvent2.x
      traverse for clickEvent1.Y -> clickEvent2.Y
           {
           newBitMap = calculateNewBitMap(base)

           // I nee to redraw Canvas with (newBitMap)
           // canvas.drawBitMap(newBitMap);

            //Doesn't work
            //postInvalidate();
            //invalidate()

            //AnimationDrawable.addFrame(newBitMap)

            // I am not calling start here 
            //but just wanted to let you know that I do call animation start to display the frames stored in it
            // animation.start();
           }

// obviously wouldn't work here As it is already out of the loop
//invalidate();
}

Пожалуйста, обратите внимание:

  1. Образ newBitMap генерируется во время выполнения, он не будет доступен мне заранее ...
  2. Iпопробовал invalidate () в цикле;но он получит кумулятивный результат только после прохождения всего цикла, а не промежуточных состояний newBitMaps.
  3. Производительность имеет решающее значение + Я имею дело с ОГРОМНЫМИ размерами изображений .. поэтому, пожалуйста, имейте это в видуа также ... если я создаю несколько растровых изображений для временного хранения сбоев JVM из-за "OutofMemory" ..
  4. Я также попытался сохранить новые изображения в форме "AnimationDrawable";но это также не решает проблему ....

    AnimationDrawable animDrawable = new AnimationDrawable();
    Drawable frame1 = new BitmapDrawable(newCaclBitMap);
    animDrawable.addFrame(frame1, 250);
    

Спасибо за любые указания / предложения ..

Ответы [ 2 ]

1 голос
/ 07 марта 2012

Похоже, что вы выполняете всю свою логику рисования одним вызовом onDraw(), когда я думаю, что вы хотите, чтобы onDraw() вызывался один раз для каждого кадра вашей анимации.

Итак, вместо чего-то подобного в вашем следе:

onDraw()
  drawFrame()
  drawFrame()
  drawFrame()
  ...

У вас будет это:

onDraw()
  drawFrame()
onDraw()
  drawFrame()
onDraw()
  drawFrame()
...

Пример CubeLiveWallpaper содержит пример вещей такого типа.

0 голосов
/ 07 марта 2012

Animation объекты используются для анимации View объектов.То, что вы хотите сделать, это анимировать холст.Это более сложный, но потенциально более мощный.По сути, вам нужно вывести уравнение, которое будет управлять движением вашего рисунка как функции времени.Когда анимация начинается, вы получаете текущую отметку времени, а затем, используя метод onDraw, вы рисуете, как должен выглядеть холст в данный момент времени.В основном вы должны рисовать каждый шаг.

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