java实现菜单滑动效果
菜单滑动效果的实现
publicclassMenuScrollerActivityextendsBaseGameActivityimplementsIScrollDetectorListener,IOnSceneTouchListener,IClickDetectorListener{
//===========================================================
//Constants
//===========================================================
protectedstaticintCAMERA_WIDTH=480;
protectedstaticintCAMERA_HEIGHT=320;
protectedstaticintFONT_SIZE=24;
protectedstaticintPADDING=50;
protectedstaticintMENUITEMS=7;
//===========================================================
//Fields
//===========================================================
privateScenemScene;
privateCameramCamera;
privateFontmFont;
privateBitmapTextureAtlasmFontTexture;
privateBitmapTextureAtlasmMenuTextureAtlas;
privateTextureRegionmMenuLeftTextureRegion;
privateTextureRegionmMenuRightTextureRegion;
privateSpritemenuleft;
privateSpritemenuright;
//Scrolling
privateSurfaceScrollDetectormScrollDetector;
privateClickDetectormClickDetector;
privatefloatmMinX=0;
privatefloatmMaxX=0;
privatefloatmCurrentX=0;
privateintiItemClicked=-1;
privateRectanglescrollBar;
privateList<TextureRegion>columns=newArrayList<TextureRegion>();
//===========================================================
//Constructors
//===========================================================
//===========================================================
//Getter&Setter
//===========================================================
//===========================================================
//Methodsfor/fromSuperClass/Interfaces
//===========================================================
@Override
publicvoidonLoadResources(){
//Paths
FontFactory.setAssetBasePath("font/");
BitmapTextureAtlasTextureRegionFactory.setAssetBasePath("gfx/");
//Font
this.mFontTexture=newBitmapTextureAtlas(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);
//Imagesforthemenu
for(inti=0;i<MENUITEMS;i++){
BitmapTextureAtlasmMenuBitmapTextureAtlas=newBitmapTextureAtlas(256,256,TextureOptions.BILINEAR_PREMULTIPLYALPHA);
TextureRegionmMenuTextureRegion=BitmapTextureAtlasTextureRegionFactory.createFromAsset(mMenuBitmapTextureAtlas,this,"menu"+i+".png",0,0);
this.mEngine.getTextureManager().loadTexture(mMenuBitmapTextureAtlas);
columns.add(mMenuTextureRegion);
}
//Texturesformenuarrows
this.mMenuTextureAtlas=newBitmapTextureAtlas(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
publicEngineonLoadEngine(){
this.mCamera=newCamera(0,0,CAMERA_WIDTH,CAMERA_HEIGHT);
finalEngineOptionsengineOptions=newEngineOptions(true,ScreenOrientation.LANDSCAPE,newFillResolutionPolicy(),this.mCamera);
engineOptions.getTouchOptions().setRunOnUpdateThread(true);
finalEngineengine=newEngine(engineOptions);
returnengine;
}
@Override
publicSceneonLoadScene(){
this.mEngine.registerUpdateHandler(newFPSLogger());
this.mScene=newScene();
this.mScene.setBackground(newColorBackground(0,0,0));
this.mScrollDetector=newSurfaceScrollDetector(this);
this.mClickDetector=newClickDetector(this);
this.mScene.setOnSceneTouchListener(this);
this.mScene.setTouchAreaBindingEnabled(true);
this.mScene.setOnSceneTouchListenerBindingEnabled(true);
CreateMenuBoxes();
returnthis.mScene;
}
@Override
publicbooleanonSceneTouchEvent(finalScenepScene,finalTouchEventpSceneTouchEvent){
this.mClickDetector.onTouchEvent(pSceneTouchEvent);
this.mScrollDetector.onTouchEvent(pSceneTouchEvent);
returntrue;
}
@Override
publicvoidonScroll(finalScrollDetectorpScollDetector,finalTouchEventpTouchEvent,finalfloatpDistanceX,finalfloatpDistanceY){
//Disablethemenuarrowsleftandright(15pxpadding)
if(mCamera.getMinX()<=15)
menuleft.setVisible(false);
else
menuleft.setVisible(true);
if(mCamera.getMinX()>mMaxX-15)
menuright.setVisible(false);
else
menuright.setVisible(true);
//Returnifendsarereached
if(((mCurrentX-pDistanceX)<mMinX)){
return;
}elseif((mCurrentX-pDistanceX)>mMaxX){
return;
}
//Centercameratothecurrentpoint
this.mCamera.offsetCenter(-pDistanceX,0);
mCurrentX-=pDistanceX;
//Setthescrollbarwiththecamera
floattempX=mCamera.getCenterX()-CAMERA_WIDTH/2;
//addthe%parttotheposition
tempX+=(tempX/(mMaxX+CAMERA_WIDTH))*CAMERA_WIDTH;
//settheposition
scrollBar.setPosition(tempX,scrollBar.getY());
//setthearrowsforleftandright
menuright.setPosition(mCamera.getCenterX()+CAMERA_WIDTH/2-menuright.getWidth(),menuright.getY());
menuleft.setPosition(mCamera.getCenterX()-CAMERA_WIDTH/2,menuleft.getY());
//BecauseCameracanhavenegativXvalues,sosetto0
if(this.mCamera.getMinX()<0){
this.mCamera.offsetCenter(0,0);
mCurrentX=0;
}
}
@Override
publicvoidonClick(ClickDetectorpClickDetector,TouchEventpTouchEvent){
loadLevel(iItemClicked);
};
//===========================================================
//Methods
//===========================================================
privatevoidCreateMenuBoxes(){
intspriteX=PADDING;
intspriteY=PADDING;
//currentitemcounter
intiItem=1;
for(intx=0;x<columns.size();x++){
//OnTouch,savetheclickeditemincaseit'saclickandnotascroll.
finalintitemToLoad=iItem;
Spritesprite=newSprite(spriteX,spriteY,columns.get(x)){
publicbooleanonAreaTouched(finalTouchEventpSceneTouchEvent,finalfloatpTouchAreaLocalX,finalfloatpTouchAreaLocalY){
iItemClicked=itemToLoad;
returnfalse;
}
};
iItem++;
this.mScene.attachChild(sprite);
this.mScene.registerTouchArea(sprite);
spriteX+=20+PADDING+sprite.getWidth();
}
mMaxX=spriteX-CAMERA_WIDTH;
//setthesizeofthescrollbar
floatscrollbarsize=CAMERA_WIDTH/((mMaxX+CAMERA_WIDTH)/CAMERA_WIDTH);
scrollBar=newRectangle(0,CAMERA_HEIGHT-20,scrollbarsize,20);
scrollBar.setColor(1,0,0);
this.mScene.attachChild(scrollBar);
menuleft=newSprite(0,CAMERA_HEIGHT/2-mMenuLeftTextureRegion.getHeight()/2,mMenuLeftTextureRegion);
menuright=newSprite(CAMERA_WIDTH-mMenuRightTextureRegion.getWidth(),CAMERA_HEIGHT/2-mMenuRightTextureRegion.getHeight()/2,mMenuRightTextureRegion);
this.mScene.attachChild(menuright);
menuleft.setVisible(false);
this.mScene.attachChild(menuleft);
}
@Override
publicvoidonLoadComplete(){
}
//Hereiswhereyoucalltheitemload.
privatevoidloadLevel(finalintiLevel){
if(iLevel!=-1){
runOnUiThread(newRunnable(){
@Override
publicvoidrun(){
Toast.makeText(MenuScrollerActivity.this,"LoadItem"+String.valueOf(iLevel),Toast.LENGTH_SHORT).show();
iItemClicked=-1;
}
});
}
}
}
以上所述就是本文的全部内容了,希望大家能够喜欢。