您的位置:首页 > 其它

侧滑实现

2015-09-11 09:10 344 查看
找了很多种侧滑的实现,个人觉得这种实现简单,支持的更多,代码也容易看懂,原理一目了然。

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就可以


                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: