




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
Android左右滑動實現 Activity切換類 (整合代碼實例)先上圖吧,下圖是左右拖動的過程:具體代碼如下: 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. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 高新企業技術研發出資證明書(7篇)
- 戴眼鏡的貓100字(11篇)
- 2025年壓力管道作業特種作業操作證考試試卷(管道施工合同)
- 2025年人力資源管理師專業技能考核試卷:員工培訓需求分析與計劃制定實戰技巧案例分析試題集
- 企業信用報告-邵武市夏氏竹業有限公司
- 鄉村振興項目商業計劃書
- 中國氧化鐵黑(Fe3O4)項目商業計劃書
- 防爆開關柜項目投資分析及可行性報告
- 2025年中藥材黃芪行業市場評估分析及發展前景調研戰略研究報告2025
- 涉外投資項目可行性研究報告
- 借款分期付款協議書
- 護理員晨晚間護理課件
- GB/T 30819-2024機器人用諧波齒輪減速器
- DL-T5394-2021電力工程地下金屬構筑物防腐技術導則
- 試模自校規程
- 組織人事業務知識測試二
- 浙江省溫州市2022年初中科學中考試題及參考答案
- 食品經營操作流程圖
- 排樁+錨索深基坑安全專項施工方案
- 大型橋梁高程控制網的布設和精度分析
- 成本管理畢業論文參考文獻大全范文
評論
0/150
提交評論