菜单滑动效果的实现
classe pública MenuScrollerActivity estende BaseGameActivity implementa IScrollDetectorListener, IOnSceneTouchListener, IClickDetectorListener { // ==================================== ======================= // Constantes // ================================================= ========= int estático protegido CAMERA_WIDTH = 480; estático protegido int CAMERA_HEIGHT = 320; protegido estático int FONT_SIZE = 24; protegido estático int PADDING = 50; protegido estático int MENUITEMS = 7; // ============================================== =========== // Campos // ================================================= ========= Cena privada mScene; Câmera privada mCamera; Fonte privada mFont; private BitmapTextureAtlas mFontTexture; private BitmapTextureAtlas mMenuTextureAtlas; private TextureRegion mMenuLeftTextureRegion; private TextureRegion mMenuRightTextureRegion; menu Sprite privado à esquerda; menu Sprite privado à direita; // Rolagem private SurfaceScrollDetector mScrollDetector; ClickDetector privado mClickDetector; flutuador privado mMinX = 0; flutuador privado mMaxX = 0; float privado mCurrentX = 0; private int iItemClicked = -1; scrollBar retângulo privado; private List<TextureRegion> colunas = new ArrayList<TextureRegion>(); // ============================================== =========== // Construtores // ================================================= ========= // ================================================= ========= // Getter e Setter // ================================================= ========= // ================================================= ========= // Métodos para/de SuperClass/Interfaces // ================================================= ========= @Override public void onLoadResources() { // Caminhos FontFactory.setAssetBasePath("font/"); BitmapTextureAtlasTextureRegionFactory.setAssetBasePath("gfx/"); // Fonte 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); //Imagens para o 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); colunas.add(mMenuTextureRegion); } //Texturas para setas de menu 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); motor final motor = novo motor (opções de motor); motor de retorno; } @Override cena pública onLoadScene() { this.mEngine.registerUpdateHandler(new FPSLogger()); this.mScene = nova cena(); this.mScene.setBackground(new ColorBackground(0, 0, 0)); this.mScrollDetector = novo SurfaceScrollDetector (este); this.mClickDetector = novo ClickDetector(this); this.mScene.setOnSceneTouchListener(this); this.mScene.setTouchAreaBindingEnabled(true); this.mScene.setOnSceneTouchListenerBindingEnabled(true); CriarMenuBoxes(); retorne isto.mScene; } @Override public boolean onSceneTouchEvent(cena final pScene, TouchEvent final pSceneTouchEvent) { this.mClickDetector.onTouchEvent(pSceneTouchEvent); this.mScrollDetector.onTouchEvent(pSceneTouchEvent); retornar verdadeiro; } @Override public void onScroll(final ScrollDetector pScollDetector, final TouchEvent pTouchEvent, final float pDistanceX, final float pDistanceY) { //Desativa as setas de menu esquerda e direita (preenchimento de 15px) if(mCamera.getMinX()<=15) menuleft. setVisible(falso); senão menuleft.setVisible(true); if(mCamera.getMinX()>mMaxX-15) menuright.setVisible(false); senão menuright.setVisible(true); //Retorna se os fins forem alcançados if ( ((mCurrentX - pDistanceX) < mMinX) ){ return; }else if((mCurrentX - pDistanceX) > mMaxX){ return; } //Centra a câmera no ponto atual this.mCamera.offsetCenter(-pDistanceX,0 ); mCurrentX -= pDistanceX; //Defina a barra de rolagem com a flutuação da câmera tempX =mCamera.getCenterX()-CAMERA_WIDTH/2; // adiciona a parte % à posição tempX+= (tempX/(mMaxX+CAMERA_WIDTH))*CAMERA_WIDTH; //definir a posição scrollBar.setPosition(tempX, scrollBar.getY()); //defina as setas para esquerda e direita menuright.setPosition(mCamera.getCenterX()+CAMERA_WIDTH/2-menuright.getWidth(),menuright.getY()); menuleft.setPosition(mCamera.getCenterX()-CAMERA_WIDTH/2,menuleft.getY()); //Como a câmera pode ter valores X negativos, defina como 0 if(this.mCamera.getMinX()<0){ this.mCamera.offsetCenter(0,0 ); mAtualX=0; } } @Override public void onClick(ClickDetector pClickDetector, TouchEvent pTouchEvent) { loadLevel(iItemClicked); }; // ============================================== =========== // Métodos // ================================================= ========= private void CreateMenuBoxes() { int spriteX = PADDING; int spriteY = PADDING; //contador de item atual int iItem = 1; for (int x = 0; x < columns.size(); x++) { //No Touch, salva o item clicado caso seja um clique e não uma rolagem. 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; retornar falso; } }; iItem++; this.mScene.attachChild(sprite); this.mScene.registerTouchArea(sprite); spriteX += 20 + PADDING+sprite.getWidth(); } mMaxX = spriteX - CAMERA_WIDTH; //define o tamanho da barra de rolagem float scrollbarsize = CAMERA_WIDTH/((mMaxX+CAMERA_WIDTH)/CAMERA_WIDTH); scrollBar = novo retângulo(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 = novo Sprite(CAMERA_WIDTH-mMenuRightTextureRegion.getWidth(),CAMERA_HEIGHT/2-mMenuRightTextureRegion.getHeight()/2,mMenuRightTextureRegion); this.mScene.attachChild (menu à direita); menuleft.setVisible(falso); this.mScene.attachChild(menuesquerda); } @Override public void onLoadComplete() { } //Aqui é onde você chama o item load. private void loadLevel (final int iLevel) { if (iLevel! = -1) { runOnUiThread (new Runnable () { @Override public void run () { Toast.makeText (MenuScrollerActivity.this, "Carregar item" + String.valueOf ( iLevel),Toast.LENGTH_SHORT).show(); } }}以上所述就是本文的全部内容了,希望大家能够喜欢。