Android 滑动关闭Activity 示例

来源:互联网 发布:.eps用什么软件打开 编辑:程序博客网 时间:2024/06/07 06:26

先看效果图 :

要用到的 知识点 :1. 滑动处理 

       2.滑动冲突处理

       3.设置Activity的主题

       4. 位移动画 

       5. 滑动的监听


  明显可以看出,它是一个ViewGrope , 而且肯定是在能看到的视图最上层.(不然滑动过去了,背景不是透明的)。

那么让它继承 RelativeLayout 并重写其构造方法。

public class MySlipFinishView extends RelativeLayout {    public MySlipFinishView(Context context) {        super(context);    }    public MySlipFinishView(Context context, AttributeSet attrs) {        super(context, attrs);    }    public MySlipFinishView(Context context, AttributeSet attrs, int defStyleAttr) {        super(context, attrs, defStyleAttr);    }}
然后重写 onTouchEvent  方法:

 int startX = 0;    int startY = 0;    @Override    public boolean onTouchEvent(MotionEvent event) {        switch (event.getAction()) {            case MotionEvent.ACTION_DOWN:                startX = (int) event.getRawX();                startY = (int) event.getRawY();                break;            case MotionEvent.ACTION_MOVE:                offX = (int) (event.getRawX() - startX);                int offy = (int) (event.getRawX() - startY);                if (Math.abs(offX) > ViewConfiguration.get(mContext).getScaledTouchSlop()) {                    slipView(offX);                }                break;            case MotionEvent.ACTION_UP:                if (Math.abs(offX) > (width / 2 - 5)) {//                    Toast.makeText(mContext, "此时应该关闭当前Activity", Toast.LENGTH_SHORT).show();                    if (mylayoutlisten != null) {                        mylayoutlisten.closeActivitySlipListener();                    }                } else {                    startObjectAnimation();                }                break;            default:                break;        }        return super.onTouchEvent(event);    }
在此方法中 确定滑动距离 , 然后根据距离判断手抬起时,是否关闭当前Activity。 

说明 : 1.ViewConfiguration.get(mContext).getScaledTouchSlop() 获取滑动最小距离。这样体验会好一点。

    2. width 是屏幕的宽度

 @Override    protected void onLayout(boolean changed, int l, int t, int r, int b) {        super.onLayout(changed, l, t, r, b);        width = getWidth();    }

下面来实现 视图根据手指滑动而滑动。我们常用的滑动有那么几种(layout ,偏移,layoutParams,scrollToscrollBy , 动画 等),这里使用属性动画比较合适,因为此控件是整体滑动,而不是内容滑动!

属性动画代码如下:( 要导入 com.nineoldandroids:library:2.4.0  jar)

private void slipViewGrope(int offX) {        if (offX < 0) {            offX = 0;        }        ViewHelper.setTranslationX(this, offX);    }

 /**     * 恢复到初始位置     */    private void startObjectAnimation() {        ObjectAnimator objectAnimator = ObjectAnimator.ofFloat(this, "translationX", 0);        objectAnimator.setDuration(300);        objectAnimator.start();    }

 

设置监听 : 要想使用还必须设置监听,来监听什么时候关闭Activity。

public interface SlipActivityListener {    void closeActivitySlipListener();}

在控件中使用:

private SlipActivityListener myLayoutListener;
    public void setListener(SlipActivityListener listener) {        this.myLayoutListener = listener;    }
好了! 下面只要给Activity设置透明主题就行了 (透明不透明 随个人 ,关键滑动了 Activity ,想看到什么)

使用的Activity 要    <item name="windowBackground">@color/transparent</item>                        <item name="colorBackgroundCacheHint">@null</item>                        <item name="windowIsTranslucent">true</item>       要设置

如 :
<activity            android:name=".SecondActivity"            android:theme="@android:style/Theme.Translucent.NoTitleBar">        </activity>

这样基本就可以了。但是还有个问题没有处理,滑动冲突。

添加如下代码就可以了。(判断是否拦截)

 @Override    public boolean onInterceptTouchEvent(MotionEvent event) {        switch (event.getAction()) {            case MotionEvent.ACTION_DOWN:                startX = (int) event.getRawX();                startY = (int) event.getRawY();                break;            case MotionEvent.ACTION_MOVE:                offX = (int) (event.getRawX() - startX);                offY = (int) (event.getRawY() - startY);                if (offX < 0) {                    offX = 0;                }                if (Math.abs(offX) > (Math.abs(offY) + 10)) {                    return true;                } else {                    return false;                }        }        return super.onInterceptTouchEvent(event);    }

到这里就结束了,有什么不对的,还请指出!

我在项目中使用的背景是:

  <item name="android:windowBackground">@color/transparent_left</item>        <item name="android:colorBackgroundCacheHint">@color/transparent</item>        <item name="android:windowIsTranslucent">true</item>

 
 <color name="transparent_left">#50000000</color>    <color name="transparent">#00000000</color>


0 0
原创粉丝点击