On Jul 7, 7:07 pm, Dianne Hackborn <hack...@android.com> wrote:
> This isn't an intrinsic problem -- apps like YouTube have a surface view and
> show the menu fine.  And there isn't enough information here to provide much
> help.

Yes, several other examples I've looked at, including the LunarLander
game does this, so it was my expectation too that this should work.
I've compared just about everything I can think of with the
LunarLander sourcecode, but nothing of consequence has popped up yet.

I've made one more observation: onWindowFocusChanged in my SurfaceView
gets called only when the MENU button works, or in other words, only
after having selected my game/app from the press-and-hold-home-button
menu. If I then hit one of the DPAD buttons, which my SurfaceView
listens to, onWindowFocusChanged will not get called no more when I
hit the MENU button.

It's a bit hard to explain this problem, and not obvious what info is
needed to answer/discuss the problem. I will paste the sourcecode
underneath, hoping it won't cause dismay. It's kinda greasy, but
that's not what I'm seeking advice on right now ;)

MySurfaceView.java - the SurfaceView
rename.java - the default activity

************************MySurfaceView.java:

public class MySurfaceView extends SurfaceView implements
SurfaceHolder.Callback {

private SurfaceHolder holder;
        private MySurfaceViewThread mySurfaceViewThread;
        private boolean hasSurface;
        private Bitmap bit;
        private Bitmap bitUser;
        private Bitmap bitShadow;
        private Bitmap wall;

        private Bitmap face;

        private Game game;

        Bitmap bitResized;

        public MySurfaceView(Context context, AttributeSet attrs) {
                super(context, attrs);
                initialize();
                setFocusable(true);
                //setFocusableInTouchMode(true);
        }


        @Override
    public void onWindowFocusChanged(boolean hasWindowFocus) {
                Log.d(this.getClass().getName(), "changed focus");
    }

        private void initialize() {


                // Create a new SurfaceHolder and assign this class as its 
callback.
                holder = getHolder();
                holder.addCallback(this);
                hasSurface = false;
                mySurfaceViewThread = new MySurfaceViewThread(holder, this);

                BitmapDrawable d = (BitmapDrawable)getResources().getDrawable
(R.drawable.bit);



                bit = d.getBitmap();


                BitmapDrawable s = (BitmapDrawable)getResources().getDrawable
(R.drawable.face);

                face = s.getBitmap();

                int width = face.getWidth();
        int height = face.getHeight();
        int newWidth = 240;
        int newHeight = 343;

                float scaleWidth = ((float) newWidth) / width;
        float scaleHeight = ((float) newHeight) / height;

                Matrix matrix = new Matrix();

                matrix.postScale(scaleWidth, scaleHeight);

                bitResized = Bitmap.createBitmap(face, 0, 0,
                width, height, matrix, true);

                BitmapDrawable e = (BitmapDrawable)getResources().getDrawable
(R.drawable.bituser);
                bitUser = e.getBitmap();

                BitmapDrawable f = (BitmapDrawable)getResources().getDrawable
(R.drawable.wall);
                wall = f.getBitmap();

                BitmapDrawable g = (BitmapDrawable)getResources().getDrawable
(R.drawable.bitshadow);
                bitShadow = g.getBitmap();

                game = new Game();



        }
        public void resume() {
                // Create and start the graphics update thread.
                if (mySurfaceViewThread == null) {
                        mySurfaceViewThread = new MySurfaceViewThread(holder, 
this);
                        if (hasSurface == true)
                                mySurfaceViewThread.start();
                }
        }
        public void pause() {
                // Kill the graphics update thread
                if (mySurfaceViewThread != null) {
                        mySurfaceViewThread.requestExitAndWait();
                        mySurfaceViewThread = null;
                }
        }
        public void surfaceCreated(SurfaceHolder holder) {
                hasSurface = true;
                if (mySurfaceViewThread != null)
                        mySurfaceViewThread.start();
        }
        public void surfaceDestroyed(SurfaceHolder holder) {
                hasSurface = false;

                pause();
        }
        public void surfaceChanged(SurfaceHolder holder, int format, int w,
int h) {
                if (mySurfaceViewThread != null)
                        mySurfaceViewThread.onWindowResize(w, h);
        }

        @Override
        public boolean onKeyDown(int keyCode, KeyEvent msg) {
                synchronized (holder){
                        switch(keyCode){
                        case 19: game.moveUp(); 
Log.d(this.getClass().getName(), "opp");
break;
                        case 20: game.moveDown();break;
                        case 23: game.shoot(); break;
                        case 21: game.rotate();break;
                        case 22: game.rotate();break;
                        }


                        return true;
                }


        }

        class MySurfaceViewThread extends Thread {
                private boolean done;
                MySurfaceViewThread(SurfaceHolder surfaceHolder, MySurfaceView
mySurfaceView) {
                        super();
                        done = false;
                }

                @Override
                public void run() {

                        Canvas canvas;

                        //SurfaceHolder surfaceHolder = holder;
                        // Repeat the drawing loop until the thread is stopped.
                        while (!game.getGameOver()) {
                                // Lock the surface and return the canvas to 
draw onto.



                                canvas = null;
                        try {
                                canvas = holder.lockCanvas(null);
                            synchronized (holder) {

                                canvas.drawColor(0, PorterDuff.Mode.CLEAR);

                                                canvas.drawBitmap(wall, 20, 0, 
new Paint());

                                                drawCPUPieces(canvas);

                                                drawUserPiece(canvas);

                                                drawShadowPiece(canvas);

                                                drawUserPieceQueue(canvas);

                                                drawGrid(canvas);

                                                drawPoints(canvas);

                            }
                        } finally {
                            // do this in a finally so that if an exception is
thrown
                            // during the above, we don't leave the Surface in 
an
                            // inconsistent state
                            if (canvas != null) {
                                holder.unlockCanvasAndPost(canvas);
                            }
                        }



                                /*Canvas canvas = surfaceHolder.lockCanvas();
                                canvas.drawColor(0, PorterDuff.Mode.CLEAR);

                                canvas.drawBitmap(wall, 20, 0, new Paint());

                                drawCPUPieces(canvas);

                                drawUserPiece(canvas);

                                drawShadowPiece(canvas);

                                drawUserPieceQueue(canvas);

                                drawGrid(canvas);

                                drawPoints(canvas);

                                //canvas.drawBitmap(bitResized, 0, 150, new 
Paint());

                                // Unlock the canvas and render the current 
image.
                                surfaceHolder.unlockCanvasAndPost(canvas);*/
                        }
                }

                private void drawUserPieceQueue(Canvas canvas){

                        int pixels = 0;

                        for(PieceUser userPiece : game.getUserPieceQueue()){
                                boolean[][] userPieceArray = 
userPiece.getPiece();
                                for(int i=0; i<userPieceArray.length; i++){
                                        int x = (i * 
MuzzleConstants.BIT_BITMAP_SIZE) + pixels;
                                        int y = 150;
                                        for(int j=0; 
j<userPieceArray[0].length; j++){
                                                if(userPieceArray[i][j]){
                                                        
canvas.drawBitmap(bitUser, x, y, new Paint());
                                                }
                                                
y+=MuzzleConstants.BIT_BITMAP_SIZE;
                                        }
                                }
                                pixels += 24;
                        }


                }

                private void drawPoints(Canvas canvas){
                        Paint paint = new Paint();
                        paint.setColor(Color.WHITE);
                        canvas.drawText("Points: " + 
Integer.toString(game.getPoints()),
5f, (float)((MuzzleConstants.HEIGHT-1)*10)+14, paint);
                }

                private void drawShadowPiece(Canvas canvas){
                        for(Position p : game.getShadowPiece()){
                                canvas.drawBitmap(bitShadow, p.getX()*10, 
p.getY()*10, new Paint
());

                        }
                }

                private void drawGrid(Canvas canvas){
                        Paint paint = new Paint();
                        paint.setColor(Color.BLUE);
                        for(int x=0; x<MuzzleConstants.WIDTH; x++){
                                
canvas.drawLine(x*MuzzleConstants.BIT_BITMAP_SIZE, 0,
x*MuzzleConstants.BIT_BITMAP_SIZE,
MuzzleConstants.HEIGHT*MuzzleConstants.BIT_BITMAP_SIZE, paint);
                                for(int y=0; y<MuzzleConstants.HEIGHT; y++){
                                        
canvas.drawLine(x*MuzzleConstants.BIT_BITMAP_SIZE,
y*MuzzleConstants.BIT_BITMAP_SIZE, (x*10)+10, y*10, paint);
                                }
                        }
                }

                private void drawUserPiece(Canvas canvas){
                        PieceUser userPiece = game.getUserPiece();

                        boolean[][] userPieceArray = userPiece.getPiece();

                        for(int i=0; i<userPieceArray.length; i++){
                                int x = i * MuzzleConstants.BIT_BITMAP_SIZE;
                                int y = userPiece.getPosition() * 
MuzzleConstants.BIT_BITMAP_SIZE;
                                for(int j=0; j<userPieceArray[0].length; j++){
                                        if(userPieceArray[i][j]){
                                                canvas.drawBitmap(bitUser, x, 
y, new Paint());
                                        }
                                        y+=MuzzleConstants.BIT_BITMAP_SIZE;
                                }
                        }
                }

                private void drawCPUPieces(Canvas canvas){
                        for(PieceCPU cpuPiece : game.getCPUPieces()){
                                int x = 
cpuPiece.getPositionX()*MuzzleConstants.BIT_BITMAP_SIZE;
                                for(boolean[] bar : cpuPiece.getBars()){
                                        int y = 
cpuPiece.getPositionY()*MuzzleConstants.BIT_BITMAP_SIZE;
                                        for(int i=0; i<bar.length; i++){

                                                if(bar[i]){
                                                        canvas.drawBitmap(bit, 
x, y, new Paint());
                                                }
                                                
y+=MuzzleConstants.BIT_BITMAP_SIZE;

                                        }
                                        x-=MuzzleConstants.BIT_BITMAP_SIZE;
                                }

                        }
                }

                public void requestExitAndWait() {
                        // Mark this thread as complete and combine into
                        // the main application thread.
                        done = true;
                        try {
                                join();
                        } catch (InterruptedException ex) { }
                }
                public void onWindowResize(int w, int h) {
                        // Deal with a change in the available surface size.
                }
        }
}



************************rename.java:

public class rename extends Activity {


        private static final int MENU_START = 6;

    private static final int MENU_STOP = 7;

    private MySurfaceView msv;

        /** Called when the activity is first created. */
        @Override
        public void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);

                // turn off the window's title bar
        requestWindowFeature(Window.FEATURE_NO_TITLE);


     // tell system to use the layout defined in our XML file
       setContentView(R.layout.muzzle_layout);



                msv = (MySurfaceView)findViewById(R.id.muzzle); //new 
MySurfaceView
(this);

        //MySurfaceView msv = new MySurfaceView(this);
                //setContentView(msv);



        }


        /**
     * Notification that something is about to happen, to give the
Activity a
     * chance to save state.
     *
     * @param outState a Bundle into which this Activity should save
its state
     */
    @Override
    protected void onSaveInstanceState(Bundle outState) {
        // just have the View's thread save its state into our Bundle
        super.onSaveInstanceState(outState);
        Log.w(this.getClass().getName(), "SIS called");
    }

         /**
     * Invoked during init to give the Activity a chance to set up its
Menu.
     *
     * @param menu the Menu to which entries may be added
     * @return true
     */
    @Override
        public boolean onCreateOptionsMenu(Menu menu) {

                boolean result = super.onCreateOptionsMenu(menu);

                menu.add("kuk");
        menu.add("fitta");

                return result;
        }

    @Override
    public boolean onOptionsItemSelected(MenuItem item){
        switch (item.getItemId()) {
        case 1:
                //fill in some actions here
                break;
        case 2:
                //fill in some actions here
                break;
        }
        return false;
    }

    @Override
    protected void onPause() {
        super.onPause();
        msv.pause();
    }
}

--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google
Groups "Android Developers" group.
To post to this group, send email to android-developers@googlegroups.com
To unsubscribe from this group, send email to
android-developers-unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/android-developers?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to