Dear All, I would like to ask about a problem that has been addressed here once or twice, but none of information I found could help me overcome the problem I faced a few days ago.
I want to make a live wallpaper for android using canvases - it is not graphically complicated enough to require OpenGL. For simplicity assume it consists of solid background and two smaller rectangles. Drawing consists of three separate stages: 1. backgroundDraw() requests entire canvas lock and draws on it solid color 2. draw1() requests partial (Rect r1) lock and draws only on locked rectangle 3. draw2() requests partial (Rect r2) lock and draws only on locked rectangle I tested it on multiple Android versions (both emulators and devices): 2.1, 2.2, 2.3.3. It seems to be working properly only on the latter one (here: http://home.elka.pw.edu.pl/~pgawron/include/Android/android_233.jpg). On previous Android versions SurfaceHolder.lockCanvas(Rect dirty) resizes(!) *dirty *passed as parameter to size of the full screen and further drawing using it results drawing on the whole screen (here: as previously, but /android_22.jpg). I can in fact see how each rectangle is being ill-drawn (full-screen): whole screen changes it's color very quickly. Unluckily google could not find for me any proper example of lockCanvas(Rect dirty) usage. Below I attach my complete and only class used for testing purposes. Full exemplary eclipse project is accessible just where provided screenshots are placed.<http://home.elka.pw.edu.pl/%7Epgawron/include/Android/Test.zip> I would be extremely grateful if somebody could finally help me and correct my code (if only the problem is in my code). I really wasted too much time on it. BR, petrelli package sec.polishcode.test; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.Rect; import android.os.SystemClock; import android.service.wallpaper.WallpaperService; import android.util.Log; import android.view.SurfaceHolder; public class TestLiveWallpaper extends WallpaperService{ @Override public Engine onCreateEngine() { return new MyEngine(); } class MyEngine extends Engine implements SurfaceHolder.Callback { private final String LOGTAG = MyEngine.class.getSimpleName(); private Paint backgroundPaint = new Paint(); private Paint mPaint1 = new Paint(); private Paint mPaint2 = new Paint(); private long lastVisibilityOnChange; private final Rect r1 = new Rect(20, 20, 60, 280); private final Rect r2 = new Rect(70, 20, 110, 280); public MyEngine() { getSurfaceHolder().addCallback(this); backgroundPaint.setColor(Color.YELLOW); mPaint1.setColor(Color.LTGRAY); mPaint2.setColor(Color.MAGENTA); } @Override public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) { drawSurface(); } @Override public void surfaceCreated(SurfaceHolder arg0) { Log.i(LOGTAG, "surfaceCreated"); } @Override public void surfaceDestroyed(SurfaceHolder arg0) { Log.i(LOGTAG, "surfaceDestroyed"); } @Override public void onCreate(SurfaceHolder surfaceHolder) { super.onCreate(surfaceHolder); setTouchEventsEnabled(true); } @Override public void onVisibilityChanged(boolean visible) { if (!visible) return; lastVisibilityOnChange = SystemClock.elapsedRealtime(); drawSurface(); } @Override public void onOffsetsChanged(float xOffset, float yOffset, float xStep, float yStep, int xPixels, int yPixels) { if (SystemClock.elapsedRealtime() - lastVisibilityOnChange > 30) return; Log.i(LOGTAG, "onOffsetsChanged filtered"); drawSurface(); } private void drawSurface() { backgroundDraw(); draw1(); draw2(); } private void backgroundDraw() { final SurfaceHolder holder = getSurfaceHolder(); Canvas c = null; try { c = holder.lockCanvas(); if (c != null) { c.drawRect(holder.getSurfaceFrame(), backgroundPaint); } } finally { if (c != null) holder.unlockCanvasAndPost(c); } } private void draw1() { final SurfaceHolder holder = getSurfaceHolder(); Canvas c = null; try { c = holder.lockCanvas(r1); if (c != null) { c.drawRect(r1, mPaint1); } } finally { if (c != null) holder.unlockCanvasAndPost(c); } } private void draw2() { final SurfaceHolder holder = getSurfaceHolder(); Canvas c = null; try { c = holder.lockCanvas(r2); if (c != null) { c.drawRect(r2, mPaint2); } } finally { if (c != null) holder.unlockCanvasAndPost(c); } } } } -- You received this message because you are subscribed to the Google Groups "Android Developers" group. To post to this group, send email to [email protected] To unsubscribe from this group, send email to [email protected] For more options, visit this group at http://groups.google.com/group/android-developers?hl=en

