Note that there are some explanatory texts on larger screens.

plurals
  1. POProblem with surfaceview
    text
    copied!<p>I have a problem with the flickering. Here is my code.</p> <pre><code>public class Tutorial2D3 extends Activity { Panel panel; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); panel = new Panel(this); setContentView(panel); } @Override public boolean onCreateOptionsMenu(Menu menu) { menu.add(1, 1, 1, "Clean Canvas"); return super.onCreateOptionsMenu(menu); } @Override public boolean onMenuItemSelected(int featureId, MenuItem item) { panel.cleanCanvas(); return true; } class Panel extends SurfaceView implements SurfaceHolder.Callback { TutorialThread thread; Bitmap icon; int iconWidth; int iconHeight; int touchX; int touchY; int mCount = 0; public Panel(Context context) { super(context); icon = BitmapFactory .decodeResource(getResources(), R.drawable.icon); iconWidth = icon.getWidth(); iconHeight = icon.getHeight(); getHolder().addCallback(this); thread = new TutorialThread(getHolder(), this); setFocusable(true); } @Override protected void onDraw(Canvas canvas) { int x = touchX - (iconWidth / 2); int y = touchY - (iconHeight / 2); if(mCount&gt;0) { canvas.drawColor(Color.BLACK); mCount--; } canvas.drawBitmap(icon, (x &gt; 0 ? x : 0), (y &gt; 0 ? y : 0), null); } @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { // TODO Auto-generated method stub } @Override public void surfaceCreated(SurfaceHolder holder) { thread.setRunning(true); thread.start(); } @Override public void surfaceDestroyed(SurfaceHolder holder) { boolean retry = true; thread.setRunning(false); do { try { thread.join(); retry = false; } catch (InterruptedException e) { e.printStackTrace(); } } while (retry); } @Override public boolean onTouchEvent(MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: touchX = (int) event.getX(); touchY = (int) event.getY(); break; case MotionEvent.ACTION_MOVE: touchX = (int) event.getX(); touchY = (int) event.getY(); break; case MotionEvent.ACTION_UP: break; default: break; } return true; } private void cleanCanvas() { mCount = 2; } } class TutorialThread extends Thread { private SurfaceHolder _surfaceHolder; private Panel _panel; private boolean _run = false; public TutorialThread(SurfaceHolder surfaceHolder, Panel panel) { _surfaceHolder = surfaceHolder; _panel = panel; } public void setRunning(boolean run) { _run = run; } @Override public void run() { Canvas c; while (_run) { c = null; try { c = _surfaceHolder.lockCanvas(null); synchronized (_surfaceHolder) { _panel.onDraw(c); } } finally { if (c != null) { _surfaceHolder.unlockCanvasAndPost(c); } } } } } </code></pre> <p>}</p> <p>The drawn image flickers. It looks like the bitmap that is drawn at one point is drawn on one surface and not the other so it looks like flickering, the bitmap that is drawn when we touch action_up is done, that is a solid image and does not flickers. Could someone please help me with this one. Thanks</p>
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload