1、设置style。
<style name="AppTheme" parent="android:Theme.Light"> <item name="android:windowNoTitle">true</item> <item name="android:windowBackground">@color/shdow</item> <item name="android:windowIsFloating">true</item> </style>
<color name="shdow">#dd000000</color>2、制作界面xml。<?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/frame_root" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="horizontal"><View android:id="@+id/back_view" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_gravity="center" android:background="@color/white" /></FrameLayout>说明:这里的View用来绘制背景是必须的(暂时没找到更好的替代方法)
3、Activity重写dispatchTouchEvent方法
/** * 获取当前窗口的最上层视图,设置铺满窗口 */View root= findViewById(R.id.frame_root);root = root.getRootView();DisplayMetrics displayMetrics=getResources().getDisplayMetrics(); ct = displayMetrics.widthPixels / 2; findViewById(R.id.back_view).setLayoutParams(new FrameLayout.LayoutParams(displayMetrics.widthPixels,displayMetrics.heightPixels));/** * 记录上一步骤的横坐标 */ float x; /** * 是否处于拖动状态,用于判断是否传递触摸事件 */ boolean drag; /** * 屏幕宽度的一半(在onCreate初始化) */ int ct; @Override public boolean dispatchTouchEvent(MotionEvent ev) { /** * 在屏幕左侧边缘10个像素的位置触摸设置为屏幕拖动状态 * */ if (ev.getAction() == MotionEvent.ACTION_DOWN && ev.getX() < 10) drag = true; if (drag) { switch (ev.getAction()) { case MotionEvent.ACTION_UP: if (root.getTranslationX() > ct) {// 滑过屏幕的一半 退出 if (root.getTranslationX() >= ct * 2) {//移出了屏幕直接退出 finish(); } else {//还没有完全移出,以动画方式移出 root.animate().translationX(ct * 2).setDuration(100).withEndAction(new Runnable() { @Override public void run() { finish(); } }); } } else {//回退到原始位置 root.animate().translationX(0).setDuration(500).translationY(0); } drag = false; break; case MotionEvent.ACTION_MOVE: float xx = root.getTranslationX() + (ev.getX() - x); if (xx >= 0) {//整体往右侧偏移时执行 root.setTranslationX(xx); } break; } x = ev.getX(); //处于拖动状态时拦截不往下传递触摸事件 return false; } return super.dispatchTouchEvent(ev); }