Add API demo for game style system UI interaction.
Shows the ideal way for a game to interact with system UI, hiding the status bar and nav bar while being played, making them visible when paused or otherwise interacting with controls of the game, and determing layout of game controls to not be covered by the status bar or nav bar. Change-Id: Ia192c31321113d81f96c06c7a69a06ef72c4682a
This commit is contained in:
@@ -0,0 +1,189 @@
|
||||
/*
|
||||
* Copyright (C) 2011 The Android Open Source Project
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package com.example.android.apis.view;
|
||||
|
||||
import android.app.ActionBar;
|
||||
import android.app.ActionBar.Tab;
|
||||
import android.app.Activity;
|
||||
import android.app.FragmentTransaction;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.net.Uri;
|
||||
import android.os.Bundle;
|
||||
import android.os.Handler;
|
||||
import android.util.AttributeSet;
|
||||
import android.util.Log;
|
||||
import android.view.Menu;
|
||||
import android.view.MenuInflater;
|
||||
import android.view.MenuItem;
|
||||
import android.view.View;
|
||||
import android.view.Window;
|
||||
import android.widget.Button;
|
||||
import android.widget.ImageView;
|
||||
import android.widget.SearchView;
|
||||
import android.widget.SeekBar;
|
||||
import android.widget.ShareActionProvider;
|
||||
import android.widget.TextView;
|
||||
import android.widget.Toast;
|
||||
import android.widget.SearchView.OnQueryTextListener;
|
||||
|
||||
import com.example.android.apis.R;
|
||||
import com.example.android.apis.graphics.TouchPaint;
|
||||
|
||||
/**
|
||||
* This activity demonstrates how to use the system UI flags to
|
||||
* implement an immersive game.
|
||||
*/
|
||||
public class GameActivity extends Activity {
|
||||
|
||||
/**
|
||||
* Implementation of a view for the game, filling the entire screen.
|
||||
*/
|
||||
//BEGIN_INCLUDE(content)
|
||||
public static class Content extends TouchPaint.PaintView implements
|
||||
View.OnSystemUiVisibilityChangeListener, View.OnClickListener {
|
||||
Activity mActivity;
|
||||
Button mPlayButton;
|
||||
boolean mPaused;
|
||||
int mLastSystemUiVis;
|
||||
boolean mUpdateSystemUi;
|
||||
|
||||
Runnable mFader = new Runnable() {
|
||||
@Override public void run() {
|
||||
fade();
|
||||
if (mUpdateSystemUi) {
|
||||
updateNavVisibility();
|
||||
}
|
||||
if (!mPaused) {
|
||||
getHandler().postDelayed(mFader, 1000/30);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
public Content(Context context, AttributeSet attrs) {
|
||||
super(context, attrs);
|
||||
setOnSystemUiVisibilityChangeListener(this);
|
||||
}
|
||||
|
||||
public void init(Activity activity, Button playButton) {
|
||||
// This called by the containing activity to supply the surrounding
|
||||
// state of the game that it will interact with.
|
||||
mActivity = activity;
|
||||
mPlayButton = playButton;
|
||||
mPlayButton.setOnClickListener(this);
|
||||
setGamePaused(true);
|
||||
}
|
||||
|
||||
@Override public void onSystemUiVisibilityChange(int visibility) {
|
||||
// Detect when we go out of nav-hidden mode, to reset back to having
|
||||
// it hidden; our game wants those elements to stay hidden as long
|
||||
// as it is being played and stay shown when paused.
|
||||
int diff = mLastSystemUiVis ^ visibility;
|
||||
mLastSystemUiVis = visibility;
|
||||
if (!mPaused && (diff&SYSTEM_UI_FLAG_HIDE_NAVIGATION) != 0
|
||||
&& (visibility&SYSTEM_UI_FLAG_HIDE_NAVIGATION) == 0) {
|
||||
// We are running and the system UI navigation has become
|
||||
// shown... we want it to remain hidden, so update our system
|
||||
// UI state at the next game loop.
|
||||
mUpdateSystemUi = true;
|
||||
}
|
||||
}
|
||||
|
||||
@Override protected void onWindowVisibilityChanged(int visibility) {
|
||||
super.onWindowVisibilityChanged(visibility);
|
||||
|
||||
// When we become visible or invisible, play is paused.
|
||||
setGamePaused(true);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onWindowFocusChanged(boolean hasWindowFocus) {
|
||||
super.onWindowFocusChanged(hasWindowFocus);
|
||||
|
||||
// When we become visible or invisible, play is paused.
|
||||
// Optional: pause game when window loses focus. This will cause it to
|
||||
// pause, for example, when the notification shade is pulled down.
|
||||
if (!hasWindowFocus) {
|
||||
//setGamePaused(true);
|
||||
}
|
||||
}
|
||||
|
||||
@Override public void onClick(View v) {
|
||||
if (v == mPlayButton) {
|
||||
// Clicking on the play/pause button toggles its state.
|
||||
setGamePaused(!mPaused);
|
||||
}
|
||||
}
|
||||
|
||||
void setGamePaused(boolean paused) {
|
||||
mPaused = paused;
|
||||
mPlayButton.setText(paused ? R.string.play : R.string.pause);
|
||||
setKeepScreenOn(!paused);
|
||||
updateNavVisibility();
|
||||
Handler h = getHandler();
|
||||
if (h != null) {
|
||||
getHandler().removeCallbacks(mFader);
|
||||
if (!paused) {
|
||||
mFader.run();
|
||||
text("Draw!");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void updateNavVisibility() {
|
||||
int newVis = SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
|
||||
| SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
|
||||
| SYSTEM_UI_FLAG_LAYOUT_STABLE;
|
||||
if (!mPaused) {
|
||||
newVis |= SYSTEM_UI_FLAG_LOW_PROFILE | SYSTEM_UI_FLAG_FULLSCREEN
|
||||
| SYSTEM_UI_FLAG_HIDE_NAVIGATION | SYSTEM_UI_FLAG_IMMERSIVE_STICKY;
|
||||
}
|
||||
|
||||
// Set the new desired visibility.
|
||||
setSystemUiVisibility(newVis);
|
||||
mUpdateSystemUi = false;
|
||||
}
|
||||
}
|
||||
//END_INCLUDE(content)
|
||||
|
||||
Content mContent;
|
||||
|
||||
public GameActivity() {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onCreate(Bundle savedInstanceState) {
|
||||
super.onCreate(savedInstanceState);
|
||||
|
||||
setContentView(R.layout.game);
|
||||
mContent = (Content)findViewById(R.id.content);
|
||||
mContent.init(this, (Button)findViewById(R.id.play));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onAttachedToWindow() {
|
||||
super.onAttachedToWindow();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onPause() {
|
||||
super.onPause();
|
||||
|
||||
// Pause game when its activity is paused.
|
||||
mContent.setGamePaused(true);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user