- public class MenuScrollerActivity extends BaseGameActivity implements IScrollDetectorListener, IOnSceneTouchListener, IClickDetectorListener {
- // ===========================================================
- // Constants
- // ===========================================================
- protected static int CAMERA_WIDTH = 480;
- protected static int CAMERA_HEIGHT = 320;
- protected static int FONT_SIZE = 24;
- protected static int PADDING = 50;
- protected static int MENUITEMS = 7;
- // ===========================================================
- // Fields
- // ===========================================================
- private Scene mScene;
- private Camera mCamera;
- private Font mFont;
- private BitmapTextureAtlas mFontTexture;
- private BitmapTextureAtlas mMenuTextureAtlas;
- private TextureRegion mMenuLeftTextureRegion;
- private TextureRegion mMenuRightTextureRegion;
- private Sprite menuleft;
- private Sprite menuright;
- // Scrolling
- private SurfaceScrollDetector mScrollDetector;
- private ClickDetector mClickDetector;
- private float mMinX = 0;
- private float mMaxX = 0;
- private float mCurrentX = 0;
- private int iItemClicked = -1;
- private Rectangle scrollBar;
- private List<TextureRegion> columns = new ArrayList<TextureRegion>();
- // ===========================================================
- // Constructors
- // ===========================================================
- // ===========================================================
- // Getter & Setter
- // ===========================================================
- // ===========================================================
- // Methods for/from SuperClass/Interfaces
- // ===========================================================
- @Override
- public void onLoadResources() {
- // Paths
- FontFactory.setAssetBasePath("font/");
- BitmapTextureAtlasTextureRegionFactory.setAssetBasePath("gfx/");
- // Font
- this.mFontTexture = new BitmapTextureAtlas(256, 256);
- this.mFont = FontFactory.createFromAsset(this.mFontTexture, this, "Plok.TTF", FONT_SIZE, true, Color.BLACK);
- this.mEngine.getTextureManager().loadTextures(this.mFontTexture);
- this.mEngine.getFontManager().loadFonts(this.mFont);
- //Images for the menu
- for (int i = 0; i < MENUITEMS; i++) {
- BitmapTextureAtlas mMenuBitmapTextureAtlas = new BitmapTextureAtlas(256,256, TextureOptions.BILINEAR_PREMULTIPLYALPHA);
- TextureRegion mMenuTextureRegion = BitmapTextureAtlasTextureRegionFactory.createFromAsset(mMenuBitmapTextureAtlas, this, "menu"+i+".png", 0, 0);
- this.mEngine.getTextureManager().loadTexture(mMenuBitmapTextureAtlas);
- columns.add(mMenuTextureRegion);
- }
- //Textures for menu arrows
- this.mMenuTextureAtlas = new BitmapTextureAtlas(128,128, TextureOptions.BILINEAR_PREMULTIPLYALPHA);
- this.mMenuLeftTextureRegion = BitmapTextureAtlasTextureRegionFactory.createFromAsset(mMenuTextureAtlas, this, "menu_left.png", 0, 0);
- this.mMenuRightTextureRegion = BitmapTextureAtlasTextureRegionFactory.createFromAsset(mMenuTextureAtlas, this, "menu_right.png",64, 0);
- this.mEngine.getTextureManager().loadTexture(mMenuTextureAtlas);
- }
- @Override
- public Engine onLoadEngine() {
- this.mCamera = new Camera(0, 0, CAMERA_WIDTH, CAMERA_HEIGHT);
- final EngineOptions engineOptions = new EngineOptions(true, ScreenOrientation.LANDSCAPE, new FillResolutionPolicy(), this.mCamera);
- engineOptions.getTouchOptions().setRunOnUpdateThread(true);
- final Engine engine = new Engine(engineOptions);
- return engine;
- }
- @Override
- public Scene onLoadScene() {
- this.mEngine.registerUpdateHandler(new FPSLogger());
- this.mScene = new Scene();
- this.mScene.setBackground(new ColorBackground(0, 0, 0));
- this.mScrollDetector = new SurfaceScrollDetector(this);
- this.mClickDetector = new ClickDetector(this);
- this.mScene.setOnSceneTouchListener(this);
- this.mScene.setTouchAreaBindingEnabled(true);
- this.mScene.setOnSceneTouchListenerBindingEnabled(true);
- CreateMenuBoxes();
- return this.mScene;
- }
- @Override
- public boolean onSceneTouchEvent(final Scene pScene, final TouchEvent pSceneTouchEvent) {
- this.mClickDetector.onTouchEvent(pSceneTouchEvent);
- this.mScrollDetector.onTouchEvent(pSceneTouchEvent);
- return true;
- }
- @Override
- public void onScroll(final ScrollDetector pScollDetector, final TouchEvent pTouchEvent, final float pDistanceX, final float pDistanceY) {
- //Disable the menu arrows left and right (15px padding)
- if(mCamera.getMinX()<=15)
- menuleft.setVisible(false);
- else
- menuleft.setVisible(true);
- if(mCamera.getMinX()>mMaxX-15)
- menuright.setVisible(false);
- else
- menuright.setVisible(true);
- //Return if ends are reached
- if ( ((mCurrentX - pDistanceX) < mMinX) ){
- return;
- }else if((mCurrentX - pDistanceX) > mMaxX){
- return;
- }
- //Center camera to the current point
- this.mCamera.offsetCenter(-pDistanceX,0 );
- mCurrentX -= pDistanceX;
- //Set the scrollbar with the camera
- float tempX =mCamera.getCenterX()-CAMERA_WIDTH/2;
- // add the % part to the position
- tempX+= (tempX/(mMaxX+CAMERA_WIDTH))*CAMERA_WIDTH;
- //set the position
- scrollBar.setPosition(tempX, scrollBar.getY());
- //set the arrows for left and right
- menuright.setPosition(mCamera.getCenterX()+CAMERA_WIDTH/2-menuright.getWidth(),menuright.getY());
- menuleft.setPosition(mCamera.getCenterX()-CAMERA_WIDTH/2,menuleft.getY());
- //Because Camera can have negativ X values, so set to 0
- if(this.mCamera.getMinX()<0){
- this.mCamera.offsetCenter(0,0 );
- mCurrentX=0;
- }
- }
- @Override
- public void onClick(ClickDetector pClickDetector, TouchEvent pTouchEvent) {
- loadLevel(iItemClicked);
- };
- // ===========================================================
- // Methods
- // ===========================================================
- private void CreateMenuBoxes() {
- int spriteX = PADDING;
- int spriteY = PADDING;
- //current item counter
- int iItem = 1;
- for (int x = 0; x < columns.size(); x++) {
- //On Touch, save the clicked item in case it's a click and not a scroll.
- final int itemToLoad = iItem;
- Sprite sprite = new Sprite(spriteX,spriteY,columns.get(x)){
- public boolean onAreaTouched(final TouchEvent pSceneTouchEvent, final float pTouchAreaLocalX, final float pTouchAreaLocalY) {
- iItemClicked = itemToLoad;
- return false;
- }
- };
- iItem++;
- this.mScene.attachChild(sprite);
- this.mScene.registerTouchArea(sprite);
- spriteX += 20 + PADDING+sprite.getWidth();
- }
- mMaxX = spriteX - CAMERA_WIDTH;
- //set the size of the scrollbar
- float scrollbarsize = CAMERA_WIDTH/((mMaxX+CAMERA_WIDTH)/CAMERA_WIDTH);
- scrollBar = new Rectangle(0,CAMERA_HEIGHT-20,scrollbarsize, 20);
- scrollBar.setColor(1,0,0);
- this.mScene.attachChild(scrollBar);
- menuleft = new Sprite(0,CAMERA_HEIGHT/2-mMenuLeftTextureRegion.getHeight()/2,mMenuLeftTextureRegion);
- menuright = new Sprite(CAMERA_WIDTH-mMenuRightTextureRegion.getWidth(),CAMERA_HEIGHT/2-mMenuRightTextureRegion.getHeight()/2,mMenuRightTextureRegion);
- this.mScene.attachChild(menuright);
- menuleft.setVisible(false);
- this.mScene.attachChild(menuleft);
- }
- @Override
- public void onLoadComplete() {
- }
- //Here is where you call the item load.
- private void loadLevel(final int iLevel) {
- if (iLevel != -1) {
- runOnUiThread(new Runnable() {
- @Override
- public void run() {
- Toast.makeText(MenuScrollerActivity.this, "Load Item" + String.valueOf(iLevel), Toast.LENGTH_SHORT).show();
- iItemClicked = -1;
- }
- });
- }
- }
- }
- //该片段来自于http://www.codesnippet.cn/detail/1409201513668.html
来源: http://www.codesnippet.cn/detail/1409201513668.html