版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- N-Ethyl-4-methoxyamphetamine-hydrochloride-生命科學(xué)試劑-MCE-8599
- 2025年度商業(yè)門面使用權(quán)轉(zhuǎn)讓合同
- 2025年度電梯應(yīng)急救援預(yù)案制定與演練合同
- 2025年度解除租賃合同解除條件爭議調(diào)解協(xié)議書
- 施工現(xiàn)場安全風(fēng)險管控制度
- 科技發(fā)展趨勢宇宙生命探索與地球應(yīng)用
- 個人房屋租賃給企業(yè)合同范例
- 兩子女離婚財產(chǎn)分割合同范本
- 2025屆畢業(yè)生就業(yè)實(shí)習(xí)合同協(xié)議
- 個人委托代理合同書樣本
- 電子技術(shù)說課課件
- 探索者三維建筑結(jié)構(gòu)建模設(shè)計軟件說明書
- 實(shí)驗(yàn)動物飼養(yǎng)人員崗位競聘演講范文匯報報告范文
- 商業(yè)地產(chǎn)市場競品樓盤市場調(diào)研表格
- 社會治安視頻監(jiān)控系統(tǒng)項目技術(shù)及設(shè)計方案
- GB/T 709-2019熱軋鋼板和鋼帶的尺寸、外形、重量及允許偏差
- FZ/T 54007-2019錦綸6彈力絲
- DB11-T 291-2022日光溫室建造規(guī)范
- 2021-2022學(xué)年山東省淄博市高二(下)期末英語試卷(附答案詳解)
- 北師大版高中數(shù)學(xué)選修4-6初等數(shù)論初步全套課件
- 紀(jì)檢知識答題測試題及答案
評論
0/150
提交評論