package com.novoda.wallpaper; import java.util.Timer; import java.util.TimerTask; import android.content.res.Resources; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.graphics.Matrix; import android.graphics.Paint; import android.os.Handler; import android.service.wallpaper.WallpaperService; import android.util.Log; import android.view.MotionEvent; import android.view.SurfaceHolder; public class AnimSwitchWallPaper extends WallpaperService { @Override public void onCreate() { super.onCreate(); } @Override public void onDestroy() { super.onDestroy(); } @Override public Engine onCreateEngine() { return new OutRunEngine(); } class OutRunEngine extends Engine { OutRunEngine() { Resources res = getResources(); for (int i = 0; i< FRONT_RES; i++) { mFrontPicIds[i] = res.getIdentifier("front_day00" + (i + 1), "drawable", "com.novoda.wallpaper"); } for (int i = 0; i< LEFT_RES; i++) { mLeftPicIds[i] = res.getIdentifier("left_day00" + (i + 1), "drawable", "com.novoda.wallpaper"); } for (int i = 0; i< RIGHT_RES; i++) { mRightPicIds[i] = res.getIdentifier("right_day00" + (i + 1), "drawable", "com.novoda.wallpaper"); } } @Override public void onCreate(SurfaceHolder surfaceHolder) { super.onCreate(surfaceHolder); setTouchEventsEnabled(true); } @Override public void onDestroy() { super.onDestroy(); mHandler.removeCallbacks(mDrawWallpaper); } @Override public void onVisibilityChanged(boolean visible) { mVisible = visible; if (visible) { drawFrame(); } else { mHandler.removeCallbacks(mDrawWallpaper); } } @Override public void onSurfaceChanged(SurfaceHolder holder, int format, int width, int height) { super.onSurfaceChanged(holder, format, width, height); drawFrame(); } @Override public void onSurfaceCreated(SurfaceHolder holder) { super.onSurfaceCreated(holder); } @Override public void onSurfaceDestroyed(SurfaceHolder holder) { super.onSurfaceDestroyed(holder); mVisible = false; mHandler.removeCallbacks(mDrawWallpaper); } @Override public void onOffsetsChanged(float xOffset, float yOffset, float xStep, float yStep, int xPixels, int yPixels) { // Log.i(TAG, "XOffset["+xOffset+"] xStep["+xStep+"] xPixels["+xPixels+"]"); drawFrame(); } /* * Store the position of the touch event so we can use it for drawing later */ @Override public void onTouchEvent(MotionEvent event) { if (event.getAction() == MotionEvent.ACTION_DOWN) { mDragEventInProgress = true; mDragEventStartX = event.getX(); } if (event.getAction() == MotionEvent.ACTION_UP) { boolean draggedLotsRight = (mDragEventStartX - event.getX()) >=160; boolean draggedLotsLeft = (event.getX() - mDragEventStartX) >=160; Log.v(TAG, "X:["+event.getX()+"+] - dragStart["+mDragEventStartX+"] =" + (event.getX() - mDragEventStartX)); if( (mDragEventStartX > 150) && draggedLotsRight ){ takingACorner =true; currentDirection = DRIVING_RIGHT; Log.d(TAG, "Driving animation started Right >"); new Timer().schedule(new TimerTask(){ @Override public void run() { takingACorner =false; picIdx =0; }}, 1000); } if( (mDragEventStartX < 150) && draggedLotsLeft ){ takingACorner =true; currentDirection = DRIVING_LEFT; Log.d(TAG, "Driving animation started < Left"); new Timer().schedule(new TimerTask(){ @Override public void run() { takingACorner =false; picIdx =0; }}, 1000); } mDragEventInProgress = false; mDragEventStartX = 0; } super.onTouchEvent(event); } void drawFrame() { final SurfaceHolder holder = getSurfaceHolder(); Canvas c = null; try { c = holder.lockCanvas(); if (c != null) { c.save(); drawCar(c); c.restore(); } } finally { if (c != null) holder.unlockCanvasAndPost(c); } // Reschedule the next redraw mHandler.removeCallbacks(mDrawWallpaper); if (mVisible) { mHandler.postDelayed(mDrawWallpaper, 1000 / 300); } } private void drawCar(Canvas c) { if(takingACorner){ if(currentDirection == DRIVING_RIGHT){ drawAnim(c, mRightPicIds); }else{ drawAnim(c, mLeftPicIds); } }else{ if(!mDragEventInProgress){ drawAnim(c, mFrontPicIds); }else{ /* * Uncomment this to respond * to all onscreen touch events * * if(mDragEventStartX > 150){ * drawAnimRight(c, mLeftPics); * }else{ * drawAnim(c, mLeftPics); * } */ } } } void drawAnim(Canvas c, int[] pics) { c.drawBitmap(BitmapFactory.decodeResource(getResources(), pics[picIdx]), 0, 100, null); ++picIdx; if (picIdx == FRONT_RES) picIdx = 0; } private int picIdx = 0; private final Paint mPaint = new Paint(); private float mTouchX = -1; private float mTouchY = -1; private int currentDirection = DRIVING_FORWARD; private static final int DRIVING_FORWARD = 5678; private static final int DRIVING_LEFT = 9876; private static final int DRIVING_RIGHT = 234; private boolean mDragEventInProgress = false; private float mDragEventStartX = 0; private boolean mVisible; private float mPosY; private boolean takingACorner = false; private Matrix mMatrix = new Matrix(); private static final int FRONT_RES = 4; private static final int LEFT_RES = 4; private static final int RIGHT_RES = 4; private final int[] mFrontPicIds = new int[FRONT_RES]; private final int[] mRightPicIds = new int[RIGHT_RES]; private final int[] mLeftPicIds = new int[LEFT_RES]; private final Runnable mDrawWallpaper = new Runnable() { public void run() { drawFrame(); } }; } private final Handler mHandler = new Handler(); private static final String TAG = AnimSwitchWallPaper.class.getSimpleName(); }