首页 > 编程 > Java > 正文

java实现菜单滑动效果

2019-11-26 15:14:16
字体:
来源:转载
供稿:网友

菜单滑动效果的实现

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

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

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表