java实现菜单滑动效果


菜单滑动效果的实现

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;
                }
            });
        }
    }
}

以上所述就是本文的全部内容了,希望大家能够喜欢。


« 
» 
快速导航

Copyright © 2016 phpStudy | 豫ICP备2021030365号-3