Android左右滑動實(shí)現(xiàn)Activity切換類(整合代碼實(shí)例)_第1頁
Android左右滑動實(shí)現(xiàn)Activity切換類(整合代碼實(shí)例)_第2頁
Android左右滑動實(shí)現(xiàn)Activity切換類(整合代碼實(shí)例)_第3頁
Android左右滑動實(shí)現(xiàn)Activity切換類(整合代碼實(shí)例)_第4頁
Android左右滑動實(shí)現(xiàn)Activity切換類(整合代碼實(shí)例)_第5頁
已閱讀5頁,還剩58頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

Android左右滑動實(shí)現(xiàn) Activity切換類 (整合代碼實(shí)例)先上圖吧,下圖是左右拖動的過程:具體代碼如下: Fling_Gallery 類[java]//TODO:1.InordertoimproveperformanceCachescreenbitmapanduseforanimation2.EstablishsuperfluousmemoryallocationsanddelayorreplacewithreusedobjectsProbablyneedtomakesurewearenotallocatingobjects(strings,etc.)inloopspublicclassFlingGalleryextendsFrameLayout{//Constantsprivatefinalintswipe_min_distance=120;privatefinalintswipe_max_off_path=250;privatefinalintswipe_threshold_veloicty=400;//PropertiesprivateintmViewPaddingWidth=0;privateintmAnimationDuration=250;privatefloatmSnapBorderRatio=0.5f;privatebooleanmIsGalleryCircular=true;//MembersprivateintmGalleryWidth=0;privatebooleanmIsTouched=false;privatebooleanmIsDragging=false;privatefloatmCurrentOffset=0.0f;privatelongmScrollTimestamp=0;privateintmFlingDirection=0;privateintmCurrentPosition=0;privateintmCurrentViewNumber=0;privateContextmContext;privateAdaptermAdapter;privateFlingGalleryView[]mViews;privateFlingGalleryAnimationmAnimation;privateGestureDetectormGestureDetector;privateInterpolatormDecelerateInterpolater;publicFlingGallery(Contextcontext){super(context);mContext=context;mAdapter=null;mViews=newFlingGalleryView[3];mViews[0]=newFlingGalleryView(0,this);mViews[1]=newFlingGalleryView(1,this);mViews[2]=newFlingGalleryView(2,this);mAnimation=newFlingGalleryAnimation();mGestureDetector=newGestureDetector(newFlingGestureDetector());}publicvoidsetPaddingWidth(intviewPaddingWidth){mViewPaddingWidth=viewPaddingWidth;}publicvoidsetAnimationDuration(intanimationDuration){mAnimationDuration=animationDuration;}publicvoidsetSnapBorderRatio(floatsnapBorderRatio){mSnapBorderRatio=snapBorderRatio;}publicvoidsetIsGalleryCircular(booleanisGalleryCircular){if(mIsGalleryCircular!=isGalleryCircular){mIsGalleryCircular=isGalleryCircular;if(mCurrentPosition==getFirstPosition()){WeneedtoreloadtheviewimmediatelytothelefttochangeittocircularvieworblankmViews[getPrevViewNumber(mCurrentViewNumber)].recycleView(getPrevPosition(mCurrentPosition));}if(mCurrentPosition==getLastPosition()){WeneedtoreloadtheviewimmediatelytotherighttochangeittocircularvieworblankmViews[getNextViewNumber(mCurrentViewNumber)].recycleView(getNextPosition(mCurrentPosition));}}}publicintgetGalleryCount(){return(mAdapter==null)?0:mAdapter.getCount();}publicintgetFirstPosition(){return0;}publicintgetLastPosition(){return(getGalleryCount()==0)?0:getGalleryCount()-1;}privateintgetPrevPosition(intrelativePosition){intprevPosition=relativePosition-1;if(prevPosition<getFirstPosition()){prevPosition=getFirstPosition()-1;if(mIsGalleryCircular==true){prevPosition=getLastPosition();}}returnprevPosition;}privateintgetNextPosition(intrelativePosition){intnextPosition=relativePosition+1;if(nextPosition>getLastPosition()){nextPosition=getLastPosition()+1;if(mIsGalleryCircular==true){nextPosition=getFirstPosition();}}returnnextPosition;}privateintgetPrevViewNumber(intrelativeViewNumber){return(relativeViewNumber==0)?2:relativeViewNumber-1;}privateintgetNextViewNumber(intrelativeViewNumber){return(relativeViewNumber==2)?0:relativeViewNumber+1;}@OverrideprotectedvoidonLayout(booleanchanged,intleft,inttop,intright,intbottom){super.onLayout(changed,left,top,right,bottom);//CalculateourviewwidthmGalleryWidth=right-left;if(changed==true){//PositionviewsatcorrectstartingoffsetsmViews[0].setOffset(0,0,mCurrentViewNumber);mViews[1].setOffset(0,0,mCurrentViewNumber);mViews[2].setOffset(0,0,mCurrentViewNumber);}}publicvoidsetAdapter(Adapteradapter){mAdapter=adapter;mCurrentPosition=0;mCurrentViewNumber=0;LoadtheinitialviewsfromadaptermViews[0].recycleView(mCurrentPosition);mViews[1].recycleView(getNextPosition(mCurrentPosition));mViews[2].recycleView(getPrevPosition(mCurrentPosition));PositionviewsatcorrectstartingoffsetsmViews[0].setOffset(0,0,mCurrentViewNumber);mViews[1].setOffset(0,0,mCurrentViewNumber);mViews[2].setOffset(0,0,mCurrentViewNumber);}privateintgetViewOffset(intviewNumber,intrelativeViewNumber){//DeterminewidthincludingconfiguredpaddingwidthintoffsetWidth=mGalleryWidth+mViewPaddingWidth;//Positionthepreviousviewonemeasuredwidthtoleftif(viewNumber==getPrevViewNumber(relativeViewNumber)){returnoffsetWidth;}//Positionthenextviewonemeasuredwidthtotherightif(viewNumber==getNextViewNumber(relativeViewNumber)){returnoffsetWidth*-1;}return0;}voidmovePrevious(){SlidetopreviousviewmFlingDirection=1;processGesture();}voidmoveNext(){SlidetonextviewmFlingDirection=-1;processGesture();}@OverridepublicbooleanonKeyDown(intkeyCode,KeyEventevent){switch(keyCode){caseKeyEvent.KEYCODE_DPAD_LEFT:movePrevious();returntrue;caseKeyEvent.KEYCODE_DPAD_RIGHT:moveNext();returntrue;caseKeyEvent.KEYCODE_DPAD_CENTER:caseKeyEvent.KEYCODE_ENTER:}returnsuper.onKeyDown(keyCode,event);}publicbooleanonGalleryTouchEvent(MotionEventevent){booleanconsumed=mGestureDetector.onTouchEvent(event);if(event.getAction()==MotionEvent.ACTION_UP){if(mIsTouched||mIsDragging){processScrollSnap();processGesture();}}returnconsumed;}voidprocessGesture(){intnewViewNumber=mCurrentViewNumber;intreloadViewNumber=0;intreloadPosition=0;mIsTouched=false;mIsDragging=false;if(mFlingDirection>0){if(mCurrentPosition>getFirstPosition()||mIsGalleryCircular==true){//DeterminepreviousviewandoutgoingviewtorecyclenewViewNumber=getPrevViewNumber(mCurrentViewNumber);mCurrentPosition=getPrevPosition(mCurrentPosition);reloadViewNumber=getNextViewNumber(mCurrentViewNumber);reloadPosition=getPrevPosition(mCurrentPosition);}}if(mFlingDirection<0){if(mCurrentPosition<getLastPosition()||mIsGalleryCircular==true){//DeterminethenextviewandoutgoingviewtorecyclenewViewNumber=getNextViewNumber(mCurrentViewNumber);mCurrentPosition=getNextPosition(mCurrentPosition);reloadViewNumber=getPrevViewNumber(mCurrentViewNumber);reloadPosition=getNextPosition(mCurrentPosition);}}if(newViewNumber!=mCurrentViewNumber){mCurrentViewNumber=newViewNumber;//ReloadoutgoingviewfromadapterinnewpositionmViews[reloadViewNumber].recycleView(reloadPosition);}EnsureinputfocusonthecurrentviewmViews[mCurrentViewNumber].requestFocus();//RuntheslideanimationsforviewtransitionsmAnimation.prepareAnimation(mCurrentViewNumber);this.startAnimation(mAnimation);ResetflingstatemFlingDirection=0;}voidprocessScrollSnap(){//SnaptonextviewifscrolledpassedsnappositionfloatrollEdgeWidth=mGalleryWidth*mSnapBorderRatio;introllOffset=mGalleryWidth-(int)rollEdgeWidth;intcurrentOffset=mViews[mCurrentViewNumber].getCurrentOffset();if(currentOffset<=rollOffset*-1){SnaptopreviousviewmFlingDirection=1;}if(currentOffset>=rollOffset){SnaptonextviewmFlingDirection=-1;}}privateclassFlingGalleryView{privateintmViewNumber;privateFrameLayoutmParentLayout;privateFrameLayoutmInvalidLayout=null;privateLinearLayoutmInternalLayout=null;privateViewmExternalView=null;publicFlingGalleryView(intviewNumber,FrameLayoutparentLayout){mViewNumber=viewNumber;mParentLayout=parentLayout;//InvalidlayoutisusedwhenoutsidegallerymInvalidLayout=newFrameLayout(mContext);mInvalidLayout.setLayoutParams(newLinearLayout.LayoutParams(LayoutParams.FILL_PARENT,LayoutParams.FILL_PARENT));//InternallayoutispermanentfordurationmInternalLayout=newLinearLayout(mContext);mInternalLayout.setLayoutParams(newLinearLayout.LayoutParams(LayoutParams.FILL_PARENT,LayoutParams.FILL_PARENT));mParentLayout.addView(mInternalLayout);}publicvoidrecycleView(intnewPosition){if(mExternalView!=null){mInternalLayout.removeView(mExternalView);}if(mAdapter!=null){if(newPosition>=getFirstPosition()&&newPosition<=getLastPosition()){mExternalView=mAdapter.getView(newPosition,mExternalView,mInternalLayout);}else{mExternalView=mInvalidLayout;}}if(mExternalView!=null){mInternalLayout.addView(mExternalView,newLinearLayout.LayoutParams(LayoutParams.FILL_PARENT,LayoutParams.FILL_PARENT));}}publicvoidsetOffset(intxOffset,intyOffset,intrelativeViewNumber){ScrollthetargetviewrelativetoitsownpositionrelativetocurrentlydisplayedviewmInternalLayout.scrollTo(getViewOffset(mViewNumber,relativeViewNumber)+xOffset,yOffset);}publicintgetCurrentOffset(){ReturnthecurrentscrollpositionreturnmInternalLayout.getScrollX();}publicvoidrequestFocus(){mInternalLayout.requestFocus();}}privateclassFlingGalleryAnimationextendsAnimation{privatebooleanmIsAnimationInProgres;privateintmRelativeViewNumber;privateintmInitialOffset;privateintmTargetOffset;privateintmTargetDistance;publicFlingGalleryAnimation(){mIsAnimationInProgres=false;mRelativeViewNumber=0;mInitialOffset=0;mTargetOffset=0;mTargetDistance=0;}publicvoidprepareAnimation(intrelativeViewNumber){//Ifweareanimatingrelativetoanewviewif(mRelativeViewNumber!=relativeViewNumber){if(mIsAnimationInProgres==true){WeonlyhavethreeviewssoifrequestedagaintoanimateinsamedirectionwemustsnapintnewDirection=(relativeViewNumber==getPrevViewNumber(mRelativeViewNumber))?1:-1;intanimDirection=(mTargetDistance<0)?1:-1;//Ifanimationinsamedirectionif(animDirection==newDirection){//RanoutoftimetoanimatesosnaptothetargetoffsetmViews[0].setOffset(mTargetOffset,0,mRelativeViewNumber);mViews[1].setOffset(mTargetOffset,0,mRelativeViewNumber);mViews[2].setOffset(mTargetOffset,0,mRelativeViewNumber);}}//SetrelativeviewnumberforanimationmRelativeViewNumber=relativeViewNumber;}Note:InthisimplementationthetargetOffsetwillalwaysbezeroaswearecenteringtheview;butweincludethecalculationsoftargetOffsetandtargetDistanceforuseinfutureimplementationsmInitialOffset=mViews[mRelativeViewNumber].getCurrentOffset();mTargetOffset=getViewOffset(mRelativeViewNumber,mRelativeViewNumber);mTargetDistance=mTargetOffset-mInitialOffset;//Configurebaseanimationpropertiesthis.setDuration(mAnimationDuration);this.setInterpolator(mDecelerateInterpolater);Start/continuedanimationmIsAnimationInProgres=true;}@OverrideprotectedvoidapplyTransformation(floatinterpolatedTime,Transformationtransformation){EnsureinterpolatedTimedoesnotover-shootthencalculatenewoffsetinterpolatedTime=(interpolatedTime>1.0f)?1.0f:interpolatedTime;intoffset=mInitialOffset+(int)(mTargetDistance*interpolatedTime);for(intviewNumber=0;viewNumber<3;viewNumber++){Onlyneedtoanimatethevisibleviewsastheotherviewwillalwaysbeoff-screenif((mTargetDistance>0&&viewNumber!=getNextViewNumber(mRelativeViewNumber))||(mTargetDistance<0&&viewNumber!=getPrevViewNumber(mRelativeViewNumber))){mViews[viewNumber].setOffset(offset,0,mRelativeViewNumber);}}}@OverridepublicbooleangetTransformation(longcurrentTime,TransformationoutTransformation){if(super.getTransformation(currentTime,outTransformation)==false){//PerformfinaladjustmenttooffsetstocleanupanimationmViews[0].setOffset(mTargetOffset,0,mRelativeViewNumber);mViews[1].setOffset(mTargetOffset,0,mRelativeViewNumber);mViews[2].setOffset(mTargetOffset,0,mRelativeViewNumber);ReachedtheanimationtargetmIsAnimationInProgres=false;returnfalse;}Cancelifthescreentouchedif(mIsTouched||mIsDragging){Notethatatthispointwestillconsiderourselvestobeanimatingbecausewehavenotyetreachedthetargetoffset;itsjustthattheuserhastemporarilyinterruptedtheanimationwithatouchgesturereturnfalse;}returntrue;}}privateclassFlingGestureDetectorextendsGestureDetector.SimpleOnGestureListener{@OverridepublicbooleanonDown(MotionEvente){StopanimationmIsTouched=true;ResetflingstatemFlingDirection=0;returntrue;}@OverridepublicbooleanonScroll(MotionEvente1,MotionEvente2,floatdistanceX,floatdistanceY){if(e2.getAction()==MotionEvent.ACTION_MOVE){if(mIsDragging==false){//StopanimationmIsTouched=true;//ReconfigurescrollmIsDragging=true;mFlingDirection=0;mScrollTimestamp=System.currentTimeMillis();mCurrentOffset=mViews[mCurrentViewNumber].getCurrentOffset();}floatmaxVelocity=mGalleryWidth/(mAnimationDuration/1000.0f);longtimestampDelta=System.currentTimeMillis()-mScrollTimestamp;floatmaxSc

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論