Search code examples
androidimageviewsurfaceview

add image to surface view in android


I want to add image to Surface view. So i used below code

public class MySurfaceView extends SurfaceView implements SurfaceHolder.Callback{

     Bitmap myicon;
     Canvas canvas;
     private Paint   mBitmapPaint;

     Paint p= new Paint();


       @Override
        protected void onDraw(Canvas canvas) {
           Bitmap myicon=BitmapFactory.decodeResource(getResources(),R.drawable.icon);
           canvas.drawColor(Color.BLACK);
           canvas.drawBitmap(myicon, 0,0, p);
           // canvas.drawBitmap(myicon, 0,0, null);
           // canvas.drawBitmap(myicon, 25,25, null);
       }
        public MySurfaceView(Context context) {
            super(context);
            // TODO Auto-generated constructor stub
        }

        public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) {
            // TODO Auto-generated method stub

        }

        public void surfaceCreated(SurfaceHolder holder) {
            // TODO Auto-generated method stub

        }

        public void surfaceDestroyed(SurfaceHolder arg0) {
            // TODO Auto-generated method stub

        }
    }

But it shows black screen. I didn't get what i did wrong in above code.

Please solve the problem

Thanks in advance.


Solution

  • See this link from where I got the solution.

    MainAct.java

    public class MainAct extends Activity {
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            mySurfaceView mySurfaceView = new mySurfaceView(getApplicationContext());
            setContentView(mySurfaceView);
        }
    }
    

    mySurfaceView.java

    public class mySurfaceView extends SurfaceView implements
            SurfaceHolder.Callback {
    
        private TutorialThread _thread;
    
        public mySurfaceView(Context context) {
            super(context);
            getHolder().addCallback(this);
            _thread = new TutorialThread(getHolder(), this);
        }
    
        @Override
        protected void onDraw(Canvas canvas) {
            super.onDraw(canvas);
            Bitmap _scratch = BitmapFactory.decodeResource(getResources(),
                    R.drawable.icon);
            canvas.drawColor(Color.BLACK);
            canvas.drawBitmap(_scratch, 10, 10, null);
    
        }
    
        public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) {
        }
    
        public void surfaceCreated(SurfaceHolder arg0) {
            _thread.setRunning(true);
            _thread.start();
        }
    
        public void surfaceDestroyed(SurfaceHolder arg0) {
            boolean retry = true;
            _thread.setRunning(false);
            while (retry) {
                try {
                    _thread.join();
                    retry = false;
                } catch (InterruptedException e) {
                }
            }
        }
    
        class TutorialThread extends Thread {
            private SurfaceHolder _surfaceHolder;
            private mySurfaceView _panel;
            private boolean _run = false;
    
            public TutorialThread(SurfaceHolder surfaceHolder, mySurfaceView 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);
                        }
                    }
                }
            }
        }
    }
    

    Edit

    The Droidnova website is not available any more. I have found an alternative website here which has the same source.