Google の CubeLiveWallpaper デモを適応させて、ライブ壁紙に視差効果を作成しようとしています。立方体を削除し、独自の画像を表示しました。これは素晴らしいことですが、壁にぶつかりました。
私の理解では、 onOffsetsChanged() から xPixels を使用して、キャンバス上のどこにビットマップを描画するかを決定できるはずです。まだおかしなことを言っているわけではないと仮定すると、ロジックは、ユーザーがスワイプするたびに xPixels が異なる値でなければならないことを示します。これが起こっていないことをログ ステートメントで証明しました。実際、onOffsetsChanged() が受け取った値は変化しません。その結果、私のイメージは動かないということです。
最初にログ出力を提供し、次にコードを提供します。
ログ (Dalvik Debug Monitor からコピー)。いずれかの方向にスワイプするたびに、この出力が生成されます。
02-23 20:09:29.859: D/onOffsetsChanged(1039): xOffset (0.500000) | yOffset (0.000000) | xStep (0.000000) | yStep (0.000000) | xPixels (-160) | yPixels (0)
onOffsetsChanged
public void onOffsetsChanged( float xOffset, float yOffset, float xStep, float yStep, int xPixels, int yPixels )
{
Log.d( "onOffsetsChanged", String.format("xOffset (%f) | yOffset (%f) | xStep (%f) | yStep (%f) | xPixels (%d) | yPixels (%d)",
xOffset,
yOffset,
xStep,
yStep,
xPixels,
yPixels) );
mOffset = xPixels; // mOffset is a member of my class
drawFrame();
}
onOffsetsChanged で mOffset が割り当てられた後に描画操作が行われるため、以下のコードを含める必要はないと思いますが、ここで助けを求めているのは私であるため、想定する権利を失いました。
drawFrame()
void drawFrame()
{
final SurfaceHolder holder = getSurfaceHolder();
Canvas c = null;
try
{
c = holder.lockCanvas();
if( c != null )
{
drawBackdrop( c );
}
}
finally
{
if( c != null )
{
holder.unlockCanvasAndPost( c );
}
}
mHandler.removeCallbacks( drawFrameRunnable );
if( mVisible )
{
mHandler.postDelayed( drawFrameRunnable, 1000 / 25 );
}
}
drawBackdrop()
void drawBackdrop( Canvas c )
{
c.save();
c.drawColor( Color.BLACK );
c.drawBitmap( backdropBmp,
mOffset,
0,
null );
c.restore();
}
最後に、私の知る限り、私の電話は壁紙のスクロールをサポートしています。たとえば、Galaxy S3 はそうではないことを理解しています (出典: http://androidforums.com/samsung-galaxy-s3/586033-galaxy-s3-cheated-some-us-leaving-out-scrolling-wallpapers.html)。Play ストアからいくつかのライブ壁紙をダウンロードしましたが、それらはすべて正常にスクロールされました。それらの開発者は、私のデバイスの同じ機能をハッキングするために、何らかの方法で一連のフープを飛び越えていないと思います。Samsung Transform Ultra を使用しています。
ご協力ありがとうございました!