2010-07-07 3 views
5

Я пишу живые обои и я использую функцию:Android живые обои onOffsetsChanged xPixelOffset, кажется, не вернуть реальный пиксель смещение

public void onOffsetsChanged(float xOffset, float yOffset, 
      float xOffsetStep, float yOffsetStep, int xPixelOffset, 
      int yPixelOffset) 

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

Для каждого из 5 экранов рабочего стола показано смещение пикселя 0, -80, -160, -240, -320, однако я ожидаю, что он будет каждый раз смещаться по ширине экрана (240px, а не 80px)

Я что-то упустил?

ответ

7

Вы заметите, что при прокрутке передний план главного экрана (значки, виджеты и т. Д.) Перемещается влево или вправо по ширине полного экрана, но фоновое изображение (или живые обои) перемещается только на долю этой ширины. Очевидным результатом является эффект прокрутки параллакса.

Другими словами, все пять экранов имеют примерно 1200 пикселей (ширина экрана 5 x), но максимальная ширина обоев на одном дисплее примерно равна 480px (ширина экрана 2 x) , потому что спина не прокручивает столько, сколько спереди.

Таким образом, смещения не должны использоваться как показатель того, как далеко продвинулся передний план дисплея, но насколько далеко перемещен фон.

Итак, вы по-прежнему получаете информацию, которая вам нужна, из параметра смещения. Просто ваша интерпретация этой информации должна немного измениться.

+0

Да, но как я пишу живые обои, мне нужно, чтобы сделать этот эффект параллакса возникает, потому что по умолчанию обои статичны. Поэтому я хочу знать, сколько «экранов» пользователь переместил и узнать, какое максимальное количество экранов будет, поскольку это может измениться в зависимости от домашнего экрана или приложения, используя живые обои. – stealthcopter

+1

Полезное примечание, float xOffset возвращает смещение в нормализованных единицах (0.0 - 1.0), чтобы вы знали, когда достигнут максимум. – stealthcopter

2

Просто сделайте свой холст/растровое изображение, которое вы нарисуете, размером с все виртуальные обои (которые должны иметь размеры экранаWidth * 2, screenHeight), а затем нарисуйте его на холсте surfaceHolder с помощью xPixelOffset в качестве координаты x. Это простой способ.

Конечно, нет закона, согласно которому ваши виртуальные обои нуждаются в этих размерах. Он может прокручиваться со скоростью значков, если хотите. Именно тогда вы захотите использовать значение xOffset, чтобы определить собственное смещение пикселей.

0
  if(xPixelOffset != 0){ 
       myXPixelOffset = xPixelOffset*((backgroundWidth - screenwidth)/screenwidth); 
      } 

backgroundWidth должен пчела ScreenHeight * 2