侧滑实现
2015-09-11 09:10
344 查看
找了很多种侧滑的实现,个人觉得这种实现简单,支持的更多,代码也容易看懂,原理一目了然。
base
shadow_left.png
使用的时候只需要继承自SwipeBackActivity就可以
packagecom.gaosi.View; importjava.util.LinkedList; importjava.util.List; importcom.gaosi.teacherapp.R; importandroid.app.Activity; importandroid.content.Context; importandroid.content.res.TypedArray; importandroid.graphics.Canvas; importandroid.graphics.Rect; importandroid.graphics.drawable.Drawable; importandroid.support.v4.view.ViewPager; importandroid.util.AttributeSet; importandroid.util.Log; importandroid.view.MotionEvent; importandroid.view.View; importandroid.view.ViewConfiguration; importandroid.view.ViewGroup; importandroid.widget.FrameLayout; importandroid.widget.Scroller; publicclassSwipeBackLayoutextendsFrameLayout{ privatestaticfinalStringTAG=SwipeBackLayout.class.getSimpleName(); privateViewmContentView; privateintmTouchSlop; privateintdownX; privateintdownY; privateinttempX; privateScrollermScroller; privateintviewWidth; privatebooleanisSilding; privatebooleanisFinish; privateDrawablemShadowDrawable; privateActivitymActivity; privateList<ViewPager>mViewPagers=newLinkedList<ViewPager>(); publicSwipeBackLayout(Contextcontext,AttributeSetattrs){ this(context,attrs,0); } publicSwipeBackLayout(Contextcontext,AttributeSetattrs,intdefStyle){ super(context,attrs,defStyle); mTouchSlop=ViewConfiguration.get(context).getScaledTouchSlop(); mScroller=newScroller(context); mShadowDrawable=getResources().getDrawable(R.drawable.shadow_left); } publicvoidattachToActivity(Activityactivity){ mActivity=activity; TypedArraya=activity.getTheme().obtainStyledAttributes( newint[]{android.R.attr.windowBackground}); intbackground=a.getResourceId(0,0); a.recycle(); ViewGroupdecor=(ViewGroup)activity.getWindow().getDecorView(); ViewGroupdecorChild=(ViewGroup)decor.getChildAt(0); decorChild.setBackgroundResource(background); decor.removeView(decorChild); addView(decorChild); setContentView(decorChild); decor.addView(this); } privatevoidsetContentView(ViewdecorChild){ mContentView=(View)decorChild.getParent(); } /** *事件拦截操作 */ @Override publicbooleanonInterceptTouchEvent(MotionEventev){ //处理ViewPager冲突问题 ViewPagermViewPager=getTouchViewPager(mViewPagers,ev); Log.i(TAG,"mViewPager="+mViewPager); if(mViewPager!=null&&mViewPager.getCurrentItem()!=0){ returnsuper.onInterceptTouchEvent(ev); } switch(ev.getAction()){ caseMotionEvent.ACTION_DOWN: downX=tempX=(int)ev.getRawX(); downY=(int)ev.getRawY(); break; caseMotionEvent.ACTION_MOVE: intmoveX=(int)ev.getRawX(); //满足此条件屏蔽SildingFinishLayout里面子类的touch事件 if(moveX-downX>mTouchSlop &&Math.abs((int)ev.getRawY()-downY)<mTouchSlop){ returntrue; } break; } returnsuper.onInterceptTouchEvent(ev); } @Override publicbooleanonTouchEvent(MotionEventevent){ switch(event.getAction()){ caseMotionEvent.ACTION_MOVE: intmoveX=(int)event.getRawX(); intdeltaX=tempX-moveX; tempX=moveX; if(moveX-downX>mTouchSlop &&Math.abs((int)event.getRawY()-downY)<mTouchSlop){ isSilding=true; } if(moveX-downX>=0&&isSilding){ mContentView.scrollBy(deltaX,0); } break; caseMotionEvent.ACTION_UP: isSilding=false; if(mContentView.getScrollX()<=-viewWidth/2){ isFinish=true; scrollRight(); }else{ scrollOrigin(); isFinish=false; } break; } returntrue; } /** *获取SwipeBackLayout里面的ViewPager的集合 *@parammViewPagers *@paramparent */ privatevoidgetAlLViewPager(List<ViewPager>mViewPagers,ViewGroupparent){ intchildCount=parent.getChildCount(); for(inti=0;i<childCount;i++){ Viewchild=parent.getChildAt(i); if(childinstanceofViewPager){ mViewPagers.add((ViewPager)child); }elseif(childinstanceofViewGroup){ getAlLViewPager(mViewPagers,(ViewGroup)child); } } } /** *返回我们touch的ViewPager *@parammViewPagers *@paramev *@return */ privateViewPagergetTouchViewPager(List<ViewPager>mViewPagers,MotionEventev){ if(mViewPagers==null||mViewPagers.size()==0){ returnnull; } RectmRect=newRect(); for(ViewPagerv:mViewPagers){ v.getHitRect(mRect); if(mRect.contains((int)ev.getX(),(int)ev.getY())){ returnv; } } returnnull; } @Override protectedvoidonLayout(booleanchanged,intl,intt,intr,intb){ super.onLayout(changed,l,t,r,b); if(changed){ viewWidth=this.getWidth(); getAlLViewPager(mViewPagers,this); Log.i(TAG,"ViewPagersize="+mViewPagers.size()); } } @Override protectedvoiddispatchDraw(Canvascanvas){ super.dispatchDraw(canvas); if(mShadowDrawable!=null&&mContentView!=null){ intleft=mContentView.getLeft() -mShadowDrawable.getIntrinsicWidth(); intright=left+mShadowDrawable.getIntrinsicWidth(); inttop=mContentView.getTop(); intbottom=mContentView.getBottom(); mShadowDrawable.setBounds(left,top,right,bottom); mShadowDrawable.draw(canvas); } } /** *滚动出界面 */ privatevoidscrollRight(){ finalintdelta=(viewWidth+mContentView.getScrollX()); //调用startScroll方法来设置一些滚动的参数,我们在computeScroll()方法中调用scrollTo来滚动item mScroller.startScroll(mContentView.getScrollX(),0,-delta+1,0, Math.abs(delta)); postInvalidate(); } /** *滚动到起始位置 */ privatevoidscrollOrigin(){ intdelta=mContentView.getScrollX(); mScroller.startScroll(mContentView.getScrollX(),0,-delta,0, Math.abs(delta)); postInvalidate(); } @Override publicvoidcomputeScroll(){ //调用startScroll的时候scroller.computeScrollOffset()返回true, if(mScroller.computeScrollOffset()){ mContentView.scrollTo(mScroller.getCurrX(),mScroller.getCurrY()); postInvalidate(); if(mScroller.isFinished()&&isFinish){ mActivity.finish(); } } } }
packagecom.gaosi.teacherapp; importcom.gaosi.View.SwipeBackLayout; importandroid.app.Activity; importandroid.content.Intent; importandroid.os.Bundle; importandroid.view.LayoutInflater; importandroid.view.Window; /** *想要实现向右滑动删除Activity效果只需要继承SwipeBackActivity即可,如果当前页面含有ViewPager *只需要调用SwipeBackLayout的setViewPager()方法即可 */ publicclassSwipeBackActivityextendsActivity{ protectedSwipeBackLayoutlayout; @Override protectedvoidonCreate(BundlesavedInstanceState){ super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE);//无标题 layout=(SwipeBackLayout)LayoutInflater.from(this).inflate( R.layout.base,null); layout.attachToActivity(this); } @Override publicvoidstartActivity(Intentintent){ super.startActivity(intent); overridePendingTransition(R.anim.base_slide_right_in,R.anim.base_slide_remain); } //返回按钮 @Override publicvoidonBackPressed(){ super.onBackPressed(); overridePendingTransition(0,R.anim.base_slide_right_out); } }
base
<com.gaosi.View.SwipeBackLayoutxmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent"> </com.gaosi.View.SwipeBackLayout>
base_slide_right_in
<?xmlversion="1.0"encoding="utf-8"?> <setxmlns:android="http://schemas.android.com/apk/res/android"> <translate android:duration="300" android:fromXDelta="100.0%" android:interpolator="@android:anim/decelerate_interpolator" android:toXDelta="0.0%"/> </set>
R.anim.base_slide_remain
<?xmlversion="1.0"encoding="utf-8"?> <setxmlns:android="http://schemas.android.com/apk/res/android"> <translate android:duration="300" android:fromXDelta="0" android:interpolator="@android:anim/decelerate_interpolator" android:toXDelta="0"/> </set>
R.anim.base_slide_right_out
<?xmlversion="1.0"encoding="utf-8"?> <setxmlns:android="http://schemas.android.com/apk/res/android"> <translate android:duration="300" android:fromXDelta="0.0%" android:interpolator="@android:anim/accelerate_interpolator" android:toXDelta="100.0%"/> </set>
shadow_left.png
使用的时候只需要继承自SwipeBackActivity就可以
相关文章推荐
- 注明的div+img 的3px bug
- 程序员的自我修养
- 第二周项目2 -程序的多文件组织
- 解决didRegisterForRemoteNotificationsWithDeviceToken不调用的问题
- iOS 生成静态库.a文件
- 体验复杂度
- 项目1--C/C++语言中函数参数传递的三种方式
- C++语言中函数参数传递的三种方式
- Compile、Make和Build的区别
- 剑指Offer系列---(18)反转链表(递归与非递归实现)
- ImageSpan的使用
- PHP数据库连接mysql与mysqli的区别与用法
- Andrew Ng机器学习课程9-补充
- 创业的第三十七天
- MySQL MyISAM/InnoDB
- Android 转场动画 windowAnimation和ActivityAnimation的区别
- 短信验证码自动填写
- 第二周项目3-程序的多文件组织
- 连连看第一更
- OC 内存管理