public class SlidingLayout extends FrameLayout {
// 页面边缘阴影的宽度默认值
private static final int SHADOW_WIDTH = 16;
private Activity mActivity;
private Scroller mScroller;
// 页面边缘的阴影图
private Drawable mLeftShadow;
// 页面边缘阴影的宽度
private int mShadowWidth;
private int mInterceptDownX;
private int mLastInterceptX;
private int mLastInterceptY;
private int mTouchDownX;
private int mLastTouchX;
private int mLastTouchY;
private boolean isConsumed = false;
private String tagStr="";
public SlidingLayout(Context context) {
this(context, null);
}
public SlidingLayout(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public SlidingLayout(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
initView(context);
}
private void initView(Context context) {
mScroller = new Scroller(context);
mLeftShadow = getResources().getDrawable(R.drawable.left_shadow);
int density = (int) getResources().getDisplayMetrics().density;
mShadowWidth = SHADOW_WIDTH * density;
tagStr="";
}
/**
* 绑定Activity
*/
public void bindActivity(Activity activity) {
mActivity = activity;
ViewGroup decorView = (ViewGroup) mActivity.getWindow().getDecorView();
View child = decorView.getChildAt(0);
decorView.removeView(child);
addView(child);
decorView.addView(this);
}
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
boolean intercept = false;
int x = (int) ev.getX();
int y = (int) ev.getY();
switch (ev.getAction()) {
case MotionEvent.ACTION_DOWN:
intercept = false;
mInterceptDownX = x;
mLastInterceptX = x;
mLastInterceptY = y;
break;
case MotionEvent.ACTION_MOVE:
int deltaX = x - mLastInterceptX;
int deltaY = y - mLastInterceptY;
// 手指处于屏幕边缘,且横向滑动距离大于纵向滑动距离时,拦截事件
if (mInterceptDownX < (getWidth() / 10) && Math.abs(deltaX) > Math.abs(deltaY)) {
intercept = true;
} else {
intercept = false;
}
mLastInterceptX = x;
mLastInterceptY = y;
break;
case MotionEvent.ACTION_UP:
intercept = false;
mInterceptDownX = mLastInterceptX = mLastInterceptY = 0;
break;
}
return intercept;
}
@Override
public boolean onTouchEvent(MotionEvent ev) {
int x = (int) ev.getX();
int y = (int) ev.getY();
switch (ev.getAction()) {
case MotionEvent.ACTION_DOWN:
mTouchDownX = x;
mLastTouchX = x;
mLastTouchY = y;
break;
case MotionEvent.ACTION_MOVE:
int deltaX = x - mLastTouchX;
int deltaY = y - mLastTouchY;
if (!isConsumed && mTouchDownX < (getWidth() / 10) && Math.abs(deltaX) > Math.abs(deltaY)) {
isConsumed = true;
}
if (isConsumed) {
int rightMovedX = mLastTouchX - (int) ev.getX();
// 左侧即将滑出屏幕
if (getScrollX() + rightMovedX >= 0) {
scrollTo(0, 0);
} else {
scrollBy(rightMovedX, 0);
}
}
mLastTouchX = x;
mLastTouchY = y;
break;
case MotionEvent.ACTION_UP:
isConsumed = false;
mTouchDownX = mLastTouchX = mLastTouchY = 0;
// 根据手指释放时的位置决定回弹还是关闭
if (-getScrollX() < getWidth() / 3) {
scrollBack();
} else {
scrollClose();
}
break;
}
return true;
}
/**
* 滑动返回
*/
private void scrollBack() {
int startX = getScrollX();
int dx = -getScrollX();
mScroller.startScroll(startX, 0, dx, 0, 300);
invalidate();
}
public void setActivityTag(String tagstr)
{
tagStr=tagstr;
}
/**
* 滑动关闭
*/
private void scrollClose() {
int startX = getScrollX();
int dx = -getScrollX() - getWidth();
mScroller.startScroll(startX, 0, dx, 0, 300);
invalidate();
}
@Override
public void computeScroll() {
if (mScroller.computeScrollOffset()) {
scrollTo(mScroller.getCurrX(), 0);
postInvalidate();
} else if (-getScrollX() >= getWidth())
{
mActivity.finish();
}
}
@Override
protected void dispatchDraw(Canvas canvas) {
super.dispatchDraw(canvas);
drawShadow(canvas);
}
/**
* 绘制边缘的阴影
*/
private void drawShadow(Canvas canvas) {
mLeftShadow.setBounds(0, 0, mShadowWidth, getHeight());
canvas.save();
canvas.translate(-mShadowWidth, 0);
mLeftShadow.draw(canvas);
canvas.restore();
}
}
需要利用这个工具类
在BaseActivity里面
public abstract class BaseActivity extends AppCompatActivity implements View.OnClickListener{
private SlidingLayout slidinglayout;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
AutoUtils.setSize(this, false, 1920, 1080);
AutoUtils.auto(this);
setContentView(setContentiew());
slidinglayout = new SlidingLayout(this);
slidinglayout.bindActivity(this);
ButterKnife.bind(this);
initView();
setClikListener();
}
protected abstract int setContentiew();
protected abstract void setClikListener();
protected abstract void initView();
然后需要侧滑的activity继承这个base就可以了,另外需要自定义style主题风格才实现侧滑透明
<!--继承Theme.AppCompat.NoActionBar,不显示标题栏-->
<style name="TransparentTheme" parent="Theme.AppCompat.NoActionBar">
<!--不设置activity进入和退出动画样式-->
<item name="android:windowAnimationStyle">@null</item>
<!--设置窗口的背景为透明,设置透明背景必须要设置此项-->
<item name="android:windowBackground">@android:color/transparent</item>
<!--设置窗口的背景是否为半透明,设置透明背景必须要设置此项-->
<item name="android:windowIsTranslucent">true</item>
<!--设置状态栏的背景为半透明-->
<item name="android:windowTranslucentStatus">true</item>
</style>
然后在清单文件更改activity的风格
android:theme="@style/TransparentTheme"