文章开头先注明本滑动销毁是对

http://blog.csdn.net/xiaanming/article/details/20934541

这篇博客的内容进行一个小小的改动

添加向左滑动打开另外一个activity

能够通过设置向左向右设置回调效果,这个效果是我忘设置背景透明了

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveHl6NTM1NA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

如今开看一下基本的代码,略微改动了一下

具体能够开原博主的解析,解析已经非常具体了的

只是改着改着感觉这个功能有点鸡肋。跟viewpager实现的样子几乎相同了

package com.example.testsildingfinishlayout;

import android.content.Context;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.ViewConfiguration;
import android.view.ViewGroup;
import android.widget.RelativeLayout;
import android.widget.Scroller; /**
* 自己定义能够滑动的RelativeLayout, 相似于IOS的滑动删除页面效果。当我们要使用
* 此功能的时候,须要将该Activity的顶层布局设置为SildingFinishLayout
* 要注意:android 触摸事件分发拦截(假设子View或者子ViewGroup里面还有事件监听方法要先排除)
*
* @email xiaoyizong@126.com
*
*/
public class SildingFinishLayout extends RelativeLayout{
/**
* SildingFinishLayout布局的父布局
*/
private ViewGroup mParentView;
/**
* 滑动的最小距离
*/
private int mTouchSlop;
/**
* 按下点的X坐标
*/
private int downX;
/**
* 按下点的Y坐标
*/
private int downY;
/**
* 暂时存储X坐标
*/
private int tempX;
/**
* 滑动类
*/
private Scroller mScroller;
/**
* SildingFinishLayout的宽度
*/
private int viewWidth; private boolean isSilding; private OnSildingFinishListener onSildingFinishListener;
private boolean isFinish;
private int direction = -1;
/**
* 能否够向某个方向滚动
*/
private boolean isSetLeft = false;
private boolean isSetRight = false;
private boolean isSetLeft_Right = false;
/**
* 是否是人工滚动回原来的地方
*/
private boolean byPeople = false; public SildingFinishLayout(Context context, AttributeSet attrs) {
this(context, attrs, 0);
} public SildingFinishLayout(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle); mTouchSlop = ViewConfiguration.get(context).getScaledTouchSlop();
mScroller = new Scroller(context);
}
/**
* 1 代表向左滑动
* 2代表向右
* 3代表左右
* @param direction
*/
public void setSlidingDirection(int direction)
{
switch(direction){
case 1:isSetLeft=true;break;
case 2:isSetRight=true;break;
case 3:isSetLeft_Right=true;break;
default:return;
} }
/**
* 事件拦截操作
*/
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) { switch (ev.getAction()) {
case MotionEvent.ACTION_DOWN:
downX = tempX = (int) ev.getRawX();
downY = (int) ev.getRawY();
break;
case MotionEvent.ACTION_MOVE:
int moveX = (int) ev.getRawX();
//满足此条件屏蔽SildingFinishLayout里面子类的touch事件
if (Math.abs(moveX - downX) > mTouchSlop
&& Math.abs((int) ev.getRawY() - downY) < mTouchSlop
&& (isSetLeft||isSetRight||isSetLeft_Right)) {
System.out.println("屏蔽子类的touch事件");
return true;
}
break;
} return super.onInterceptTouchEvent(ev);
} @Override
public boolean onTouchEvent(MotionEvent event) { switch (event.getAction()) {
case MotionEvent.ACTION_MOVE:
int moveX = (int) event.getRawX();
int deltaX = tempX - moveX;
tempX = moveX;
if (Math.abs(moveX - downX) > mTouchSlop
&& Math.abs((int) event.getRawY() - downY) < mTouchSlop) {
System.out.println("isSilding == true;");
isSilding = true;
} if (Math.abs(moveX - downX)>= 0 && isSilding) {
System.out.println("mParentView.scrollBy("+deltaX+", 0);");
System.out.println("moveX - downX = "+(moveX - downX));
if(((moveX - downX) > 0 && isSetLeft) || ((moveX - downX) < 0 && isSetRight) || isSetLeft_Right)
mParentView.scrollBy(deltaX, 0);
}
break;
case MotionEvent.ACTION_UP:
isSilding = false;
System.out.println("mParentView.getScrollX() -->"+mParentView.getScrollX() );
if (mParentView.getScrollX() <= -viewWidth / 2) {
isFinish = true;
direction = 1;
scrollRight();
} else if(mParentView.getScrollX() >= viewWidth / 2){
isFinish = true;
direction=2;
scrollLeft();
}else{
isFinish = false;
direction=0;
scrollOrigin(false); }
break;
}
return true;
} @Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
super.onLayout(changed, l, t, r, b);
if (changed) {
// 获取SildingFinishLayout所在布局的父布局
mParentView = (ViewGroup) this.getParent();
viewWidth = this.getWidth();
}
} /**
* 设置OnSildingFinishListener, 在onSildingFinish()方法中finish Activity
*
* @param onSildingFinishListener
*/
public void setOnSildingFinishListener(
OnSildingFinishListener onSildingFinishListener) {
this.onSildingFinishListener = onSildingFinishListener;
} /**
* 从左向右滚动出界面
*/
private void scrollRight() {
final int delta = (viewWidth + mParentView.getScrollX());
// 调用startScroll方法来设置一些滚动的參数。我们在computeScroll()方法中调用scrollTo来滚动item
mScroller.startScroll(mParentView.getScrollX(), 0, -delta + 1, 0,
Math.abs(delta));
postInvalidate();
} /**
* 从左向右滚动出界面
*/
private void scrollLeft() {
final int delta = (viewWidth - mParentView.getScrollX());
// 调用startScroll方法来设置一些滚动的參数,我们在computeScroll()方法中调用scrollTo来滚动item
mScroller.startScroll(mParentView.getScrollX(), 0, delta - 1, 0,
Math.abs(delta));
postInvalidate();
} /**
* 滚动到起始位置
*/
public void scrollOrigin(boolean byPeople) {
//getScrollX() ---> Return the scrolled left position of this view(返回偏离了屏幕左边界多远 “正数(左边界|)负数”)
this.byPeople = byPeople;
int delta = mParentView.getScrollX();
mScroller.startScroll(mParentView.getScrollX(), 0, -delta, 0,
Math.abs(delta));
postInvalidate();
} @Override
public void computeScroll() {
// 调用startScroll的时候scroller.computeScrollOffset()返回值为boolean。true说明滚动尚未完毕,false说明滚动已经完毕
if (mScroller.computeScrollOffset()) {
mParentView.scrollTo(mScroller.getCurrX(), mScroller.getCurrY());
postInvalidate(); if (mScroller.isFinished() && isFinish) { if (onSildingFinishListener != null) {
if(!this.byPeople){
onSildingFinishListener.onSildingFinish(direction);
}
this.byPeople = false; }else{
//没有设置OnSildingFinishListener,让其滚动到事实上位置
scrollOrigin(false);
isFinish = false;
}
}
}
} public interface OnSildingFinishListener {
/**
* 从左向右滚动出界面 type=1
* 从右向左滚动出界面 type=2
* @param type
*/
public void onSildingFinish(int type);
} }

看一下这些activity里面的代码

第一个activity仅仅能向左滑动打开新的activity

package com.example.testsildingfinishlayout;

import com.example.testsildingfinishlayout.SildingFinishLayout.OnSildingFinishListener;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem; public class MainActivity extends Activity {
SildingFinishLayout sildingFinishLayout=null;
boolean flag = false;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); sildingFinishLayout= (SildingFinishLayout) findViewById(R.id.num1);
sildingFinishLayout
.setOnSildingFinishListener(new OnSildingFinishListener() { @Override
public void onSildingFinish(int type) {
if (type ==2){
Intent fromSpiltOuttoPostIntent = new Intent();
fromSpiltOuttoPostIntent.setClass(MainActivity.this,
Num2Activity.class);
startActivity(fromSpiltOuttoPostIntent); } }
});
//设置仅仅能向左滑动打开新的activity
sildingFinishLayout.setSlidingDirection(2);
} @Override
protected void onResume() {
// TODO Auto-generated method stub
super.onResume();
//当从新显示当前页面的时候把sildingFinishLayout滚回到屏幕可视范围,之前已经滚出了屏幕
if(flag)
sildingFinishLayout.scrollOrigin(true);//将原来私有的滚会初始位置的方法设为public
} @Override
protected void onStop() {
// TODO Auto-generated method stub
super.onStop();
flag = true;
} @Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
} @Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
}

第二个activity能够向右滑动finish掉自己,也能够向左滑动打开第三个activity

package com.example.testsildingfinishlayout;

import com.example.testsildingfinishlayout.SildingFinishLayout.OnSildingFinishListener;

import android.support.v7.app.ActionBarActivity;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem; public class Num2Activity extends Activity {
SildingFinishLayout sildingFinishLayout=null;
boolean flag = false;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_num2); sildingFinishLayout= (SildingFinishLayout) findViewById(R.id.num2);
sildingFinishLayout
.setOnSildingFinishListener(new OnSildingFinishListener() { @Override
public void onSildingFinish(int type) {
if (type == 1)
Num2Activity.this.finish();
if (type ==2){
Intent fromSpiltOuttoPostIntent = new Intent();
fromSpiltOuttoPostIntent.setClass(Num2Activity.this,
Num3Activity.class);
startActivity(fromSpiltOuttoPostIntent); } }
});
sildingFinishLayout.setSlidingDirection(3);
}
@Override
protected void onResume() {
// TODO Auto-generated method stub
super.onResume();
if(flag)
sildingFinishLayout.scrollOrigin(true);
}
@Override
protected void onStop() {
// TODO Auto-generated method stub
super.onStop();
flag = true;
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.num2, menu);
return true;
} @Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
}

第三个activity就不贴代码了,就是那回事

升级滑动销毁activity,随着手势的滑动而滑动的效果的更多相关文章

  1. Android的Activity屏幕切换动画(一)-左右滑动切换

    (国内知名Android开发论坛eoe开发者社区推荐:http://www.eoeandroid.com/) Android的Activity屏幕切换动画(一)-左右滑动切换 在Android开发过程 ...

  2. ImageView 会盖掉ScrollView的OnTouchListener,监听Activity的手势

    当Activity的高度不够滑动的时候,ImageView会盖掉ScrollView的OnTouchListener监听. 这个时候须要设置Activity的(或者想直接监听Activity的手势也能 ...

  3. Android入门开发之销毁activity

    使用: 销毁.关闭页面activity 如果打开下个页面的同时销毁了本页面,在下个页面无法返回本页面,每次打开APP应用就会先显示一张APP的介绍图.或者LOGO页面,延时几秒进入应用,进入后无法再返 ...

  4. 启动与销毁Activity

    启动与销毁Activity 编写:kesenhoo - 原文:http://developer.android.com/training/basics/activity-lifecycle/start ...

  5. Android 向右滑动销毁(finish)Activity, 随着手势的滑动而滑动的效果

    http://blog.csdn.net/xiaanming/article/details/20934541

  6. 手势滑动结束 Activity(一)基本功能的实现

    喜欢听音乐的朋友可能都看过天天动听这款 app, 这款 app 有一个亮点就是在切换页面(Fragment)的时候能够通过手势滑动来结束当前页面.这里先说一下,我为什么会这么关心这个功能呢,由于前两天 ...

  7. Android 用Activity的onTouchEvent来监听滑动手势

    package com.example.activityOnTouchEvent; import android.app.Activity; import android.os.Bundle; imp ...

  8. android 判断左右滑动,上下滑动的GestureDetector简单手势检测

    直接加入监听GestureDetector放在需要判断滑动手势的地方: import android.app.Activity; import android.os.Bundle; import an ...

  9. 滑动关闭activity

    // 手指上下滑动时的最小速度 private static final int YSPEED_MIN = 1000; // 手指向右滑动时的最小距离 private static final int ...

随机推荐

  1. 总结DSP28335的程序设计的方法

    对DSP进行开发时,需要对其底层的硬件及外设进行相应的配置,当配置完成后才可以将其相应模块激活,才可以在其内部进行程序编写及调试处理.下面对程序配置及操作进行简单的整理,仅供参考. 第一步:初始化系统 ...

  2. python笔记-用python解决小学生数学题【转载】

    本篇转自博客:上海-悠悠 原文地址:http://www.cnblogs.com/yoyoketang/tag/python/ 前几天有人在群里给小编出了个数学题: 假设你有无限数量的邮票,面值分别为 ...

  3. SPRING CLOUD服务网关之ZUUL

    服务网关是微服务架构中一个不可或缺的部分.通过服务网关统一向外系统提供REST API的过程中,除了具备服务路由.均衡负载功能之外,它还具备了权限控制等功能.Spring Cloud Netflix中 ...

  4. AC日记——[HNOI2008]水平可见直线 bzoj 1007

    1007 思路: 维护一个下凸壳: 用单调栈来维护这玩意儿: 先将斜率排序: 然后判断栈顶元素和当前元素的交点x是否小于栈顶元素和栈顶上一个元素的交点x: 注意: 人神共愤的精度问题和输出空格问题: ...

  5. java中的BigInteger

    头文件 import java.io.*; import java.math.*; 读入 Scanner cin = Scann(System.in); while(cin.hasNext()) &l ...

  6. CV

    Business Analyst Resume Name:  Zhou Heng Cell:  15821661982  Email :  jackyzhouheng@gmail.com Self A ...

  7. Uva 11077 Find the Permutation

    可以发现最优的方案就是一个循环节内互换. 所以一个有n个元素,c个循环节的置换的交换次数(最少)是n-c. 然后就可以递推了,把i插入到前i-1个元素构成的置换中,要么新成立一个循环,要么加入到之前的 ...

  8. 【bzoj4720】【noip2016】【换座位】期望dp+Floyd

    [pixiv] https://www.pixiv.net/member_illust.php?mode=medium&illust_id=62370736 wa...已经快一年了,重新来做这 ...

  9. iOS中正则表达式的基本使用方法

    一.第三方框架RegexKitLite的使用 在ios项目中可以借用第三方框架RegexKitLite来简化对正则表达式的使用,使用方法如下 1.去RegexKitLite下载类库,解压出来会有一个例 ...

  10. linux PHP 安装及 GD库安装

    linux GD库安装 GD 安裝 第一部需要做的是先要安裝 GD 到系統內,而安裝 GD 前需要安裝 jpeg-6b, libpng, zlib, freetype.以下是下载网址:GD 2.0.3 ...