Android实现IOS向右滑动退出当前Activity
2016-04-24 21:08
1516 查看
首先,我们所需要的效果是当手指向右滑动的时候,当前的activity跟随手指移动,上一个activity也要跟随移动,只是速度稍慢,我们知道,activity有一个getWindow.getDecorView()方法,我们也知道这个方法的返回值是activity的根view,所以我们只需要那个这个根View的引用,同时移动这个View就ok了,其中有一个细节就是,我们需要把activity的根View的引用做一个全局的缓存,或者是在Onpause方法调用的时候缓存起来,我想,说道这里,已经有很多人知道该怎么做了,那在下就不废话了,直接上代码吧。
<span style="font-size:18px;">package com.example.activityanimotion;
import android.app.Activity;
import android.os.Handler;
import android.view.GestureDetector;
import android.view.GestureDetector.OnGestureListener;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
public class ActivityFinishUtils {
// 当前activity布局的根View,用于设置touch监听事件
private View view;
private GestureDetector detector;
private int verticalMinDistance = 20;
private int minVelocity = 0;
// 上一层view对象
private View mLastView;
// 当前view移动距离
private int mdistance = 0;
// 上一层view初始移动距离
private int mlastX = 0;
// 上一层view移动的距离
private int mLastDistance = 0;
// 当前的View
private View currentView;
private Activity mContext;
public void Init(Activity context, View view, OnGestureListener listener) {
verticalMinDistance = 20;
minVelocity = 0;
mdistance = 0;
mlastX = 0;
mLastDistance = 0;
mContext = context;
detector = new GestureDetector(mContext, listener);
this.view = view;
currentView = mContext.getWindow().getDecorView();
this.view.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View arg0, MotionEvent arg1) {
// TODO Auto-generated method stub
if (arg1.getAction() == MotionEvent.ACTION_UP) {
if (mdistance < currentView.getWidth() / 2) {
mLastView.scrollBy(mLastDistance - mlastX, 0);
currentView.scrollBy(mdistance, 0);
mdistance = 0;
mLastDistance = mlastX;
} else {
mContext.finish();
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
mLastView.scrollBy(mLastDistance, 0);
}
}, 120);
}
} else if (arg1.getAction() == MotionEvent.ACTION_DOWN) {
// currentView = mContext.getWindow().getDecorView();
}
return ActivityFinishUtils.this.detector.onTouchEvent(arg1);
}
});
this.view.setClickable(true);
this.view.setLongClickable(true);
new Handler().postDelayed(new Runnable() {
@Override
public void run() {</span>
需要注意的:1.需要滑动返回的activity背景记得设为透明,否则将看不见上一个activity
如果各位大神有什么更好的实现方式,欢迎留言交流!!
转载请注明出处!!
<span style="font-size:18px;">package com.example.activityanimotion;
import android.app.Activity;
import android.os.Handler;
import android.view.GestureDetector;
import android.view.GestureDetector.OnGestureListener;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
public class ActivityFinishUtils {
// 当前activity布局的根View,用于设置touch监听事件
private View view;
private GestureDetector detector;
private int verticalMinDistance = 20;
private int minVelocity = 0;
// 上一层view对象
private View mLastView;
// 当前view移动距离
private int mdistance = 0;
// 上一层view初始移动距离
private int mlastX = 0;
// 上一层view移动的距离
private int mLastDistance = 0;
// 当前的View
private View currentView;
private Activity mContext;
public void Init(Activity context, View view, OnGestureListener listener) {
verticalMinDistance = 20;
minVelocity = 0;
mdistance = 0;
mlastX = 0;
mLastDistance = 0;
mContext = context;
detector = new GestureDetector(mContext, listener);
this.view = view;
currentView = mContext.getWindow().getDecorView();
this.view.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View arg0, MotionEvent arg1) {
// TODO Auto-generated method stub
if (arg1.getAction() == MotionEvent.ACTION_UP) {
if (mdistance < currentView.getWidth() / 2) {
mLastView.scrollBy(mLastDistance - mlastX, 0);
currentView.scrollBy(mdistance, 0);
mdistance = 0;
mLastDistance = mlastX;
} else {
mContext.finish();
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
mLastView.scrollBy(mLastDistance, 0);
}
}, 120);
}
} else if (arg1.getAction() == MotionEvent.ACTION_DOWN) {
// currentView = mContext.getWindow().getDecorView();
}
return ActivityFinishUtils.this.detector.onTouchEvent(arg1);
}
});
this.view.setClickable(true);
this.view.setLongClickable(true);
new Handler().postDelayed(new Runnable() {
@Override
public void run() {</span>
<span style="font-size:18px;"> //我这里是在activity跳转的时候穿了classname,便于获得上一个activity的根view的引用,</span>
<span style="font-size:18px;"> 当然也可以从activity栈中区获取,这里是为了在activity进入的时候将上一个activity先向左yidong</span>
<span style="font-size:18px;"> 一半的距离,为了滑动的时候视觉上有速度的差别 String classname = mContext.getIntent().getStringExtra( "classname"); if (classname != null) { // TODO Auto-generated method stub mLastView = MainApplication.views.get(classname); if (mLastView != null) { mLastView.scrollBy(mLastView.getWidth() / 2, 0); mLastDistance = -(mLastView.getWidth() / 2); mlastX = -(mLastView.getWidth() / 2); } } } }, 500); } public void onBackPress() { // 按返回键返回时将上一层view归位 mLastView.scrollBy(mLastDistance, 0); } // 监听滚动 public void OnScroll(MotionEvent e1, MotionEvent e2, float velocityX) { // 向左移动 if (e1.getX() - e2.getX() > verticalMinDistance && Math.abs(velocityX) > minVelocity) { if (mdistance > 0) { float distance = e1.getX() - e2.getX(); currentView.scrollBy((int) distance, 0); mLastView.scrollBy((int) distance / 2, 0); mLastDistance -= (int) distance / 2; mdistance -= (int) distance; } } // 向右移动 else if (e2.getX() - e1.getX() > verticalMinDistance && Math.abs(velocityX) > minVelocity && e1.getX() <= 20) { float distance = e2.getX() - e1.getX(); currentView.scrollBy(-(int) distance, 0); mLastView.scrollBy(-(int) (distance / 2), 0); mLastDistance += (int) (distance / 2); mdistance += (int) distance; if (mdistance >= currentView.getWidth()) { mLastView.scrollBy(mLastDistance, 0); mContext.finish(); } } } } </span>
需要注意的:1.需要滑动返回的activity背景记得设为透明,否则将看不见上一个activity
如果各位大神有什么更好的实现方式,欢迎留言交流!!
转载请注明出处!!
相关文章推荐
- Android实现表情 抓取新浪表情
- 详解Android解析Xml的三种方式——DOM、SAX以及XMLpull
- android开发环境遇到adt无法启动的问题分析及解决方法
- Android开发 旋转屏幕导致Activity重建解决方法
- Android开发技巧之在a标签或TextView控件中单击链接弹出Activity(自定义动作)
- Android开发技巧之ViewStub控件惰性装载
- Android开发常用经典代码段集锦
- 分享10个很棒的学习Android开发的网站
- android开发之横向滚动/竖向滚动的ListView(固定列头)
- Android开发技巧之我的菜单我做主(自定义菜单)
- Windows下使用Apache Cordova开发ANDROID之HelloWorld
- 根据根据图片的url怎么取得图片ImageView对象
- [转] ADB server didn't ACK
- android开发的相关链接
- Android数据存储之SharedPreferences 共享首选项/偏好设置
- 基于NDK的Android防破解
- 麦子学院android开发笔记:Android更换RatingBar图片
- android开发入门知识之AIDL详解
- AutoCompleteTextView组件的功能和用法