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

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实现的样子几乎相同了

  1. package com.example.testsildingfinishlayout;
  2.  
  3. import android.content.Context;
  4. import android.util.AttributeSet;
  5. import android.view.MotionEvent;
  6. import android.view.ViewConfiguration;
  7. import android.view.ViewGroup;
  8. import android.widget.RelativeLayout;
  9. import android.widget.Scroller;
  10.  
  11. /**
  12. * 自己定义能够滑动的RelativeLayout, 相似于IOS的滑动删除页面效果。当我们要使用
  13. * 此功能的时候,须要将该Activity的顶层布局设置为SildingFinishLayout
  14. * 要注意:android 触摸事件分发拦截(假设子View或者子ViewGroup里面还有事件监听方法要先排除)
  15. *
  16. * @email xiaoyizong@126.com
  17. *
  18. */
  19. public class SildingFinishLayout extends RelativeLayout{
  20. /**
  21. * SildingFinishLayout布局的父布局
  22. */
  23. private ViewGroup mParentView;
  24. /**
  25. * 滑动的最小距离
  26. */
  27. private int mTouchSlop;
  28. /**
  29. * 按下点的X坐标
  30. */
  31. private int downX;
  32. /**
  33. * 按下点的Y坐标
  34. */
  35. private int downY;
  36. /**
  37. * 暂时存储X坐标
  38. */
  39. private int tempX;
  40. /**
  41. * 滑动类
  42. */
  43. private Scroller mScroller;
  44. /**
  45. * SildingFinishLayout的宽度
  46. */
  47. private int viewWidth;
  48.  
  49. private boolean isSilding;
  50.  
  51. private OnSildingFinishListener onSildingFinishListener;
  52. private boolean isFinish;
  53. private int direction = -1;
  54. /**
  55. * 能否够向某个方向滚动
  56. */
  57. private boolean isSetLeft = false;
  58. private boolean isSetRight = false;
  59. private boolean isSetLeft_Right = false;
  60. /**
  61. * 是否是人工滚动回原来的地方
  62. */
  63. private boolean byPeople = false;
  64.  
  65. public SildingFinishLayout(Context context, AttributeSet attrs) {
  66. this(context, attrs, 0);
  67. }
  68.  
  69. public SildingFinishLayout(Context context, AttributeSet attrs, int defStyle) {
  70. super(context, attrs, defStyle);
  71.  
  72. mTouchSlop = ViewConfiguration.get(context).getScaledTouchSlop();
  73. mScroller = new Scroller(context);
  74. }
  75. /**
  76. * 1 代表向左滑动
  77. * 2代表向右
  78. * 3代表左右
  79. * @param direction
  80. */
  81. public void setSlidingDirection(int direction)
  82. {
  83. switch(direction){
  84. case 1:isSetLeft=true;break;
  85. case 2:isSetRight=true;break;
  86. case 3:isSetLeft_Right=true;break;
  87. default:return;
  88. }
  89.  
  90. }
  91. /**
  92. * 事件拦截操作
  93. */
  94. @Override
  95. public boolean onInterceptTouchEvent(MotionEvent ev) {
  96.  
  97. switch (ev.getAction()) {
  98. case MotionEvent.ACTION_DOWN:
  99. downX = tempX = (int) ev.getRawX();
  100. downY = (int) ev.getRawY();
  101. break;
  102. case MotionEvent.ACTION_MOVE:
  103. int moveX = (int) ev.getRawX();
  104. //满足此条件屏蔽SildingFinishLayout里面子类的touch事件
  105. if (Math.abs(moveX - downX) > mTouchSlop
  106. && Math.abs((int) ev.getRawY() - downY) < mTouchSlop
  107. && (isSetLeft||isSetRight||isSetLeft_Right)) {
  108. System.out.println("屏蔽子类的touch事件");
  109. return true;
  110. }
  111. break;
  112. }
  113.  
  114. return super.onInterceptTouchEvent(ev);
  115. }
  116.  
  117. @Override
  118. public boolean onTouchEvent(MotionEvent event) {
  119.  
  120. switch (event.getAction()) {
  121. case MotionEvent.ACTION_MOVE:
  122. int moveX = (int) event.getRawX();
  123. int deltaX = tempX - moveX;
  124. tempX = moveX;
  125. if (Math.abs(moveX - downX) > mTouchSlop
  126. && Math.abs((int) event.getRawY() - downY) < mTouchSlop) {
  127. System.out.println("isSilding == true;");
  128. isSilding = true;
  129. }
  130.  
  131. if (Math.abs(moveX - downX)>= 0 && isSilding) {
  132. System.out.println("mParentView.scrollBy("+deltaX+", 0);");
  133. System.out.println("moveX - downX = "+(moveX - downX));
  134. if(((moveX - downX) > 0 && isSetLeft) || ((moveX - downX) < 0 && isSetRight) || isSetLeft_Right)
  135. mParentView.scrollBy(deltaX, 0);
  136. }
  137. break;
  138. case MotionEvent.ACTION_UP:
  139. isSilding = false;
  140. System.out.println("mParentView.getScrollX() -->"+mParentView.getScrollX() );
  141. if (mParentView.getScrollX() <= -viewWidth / 2) {
  142. isFinish = true;
  143. direction = 1;
  144. scrollRight();
  145. } else if(mParentView.getScrollX() >= viewWidth / 2){
  146. isFinish = true;
  147. direction=2;
  148. scrollLeft();
  149. }else{
  150. isFinish = false;
  151. direction=0;
  152. scrollOrigin(false);
  153.  
  154. }
  155. break;
  156. }
  157. return true;
  158. }
  159.  
  160. @Override
  161. protected void onLayout(boolean changed, int l, int t, int r, int b) {
  162. super.onLayout(changed, l, t, r, b);
  163. if (changed) {
  164. // 获取SildingFinishLayout所在布局的父布局
  165. mParentView = (ViewGroup) this.getParent();
  166. viewWidth = this.getWidth();
  167. }
  168. }
  169.  
  170. /**
  171. * 设置OnSildingFinishListener, 在onSildingFinish()方法中finish Activity
  172. *
  173. * @param onSildingFinishListener
  174. */
  175. public void setOnSildingFinishListener(
  176. OnSildingFinishListener onSildingFinishListener) {
  177. this.onSildingFinishListener = onSildingFinishListener;
  178. }
  179.  
  180. /**
  181. * 从左向右滚动出界面
  182. */
  183. private void scrollRight() {
  184. final int delta = (viewWidth + mParentView.getScrollX());
  185. // 调用startScroll方法来设置一些滚动的參数。我们在computeScroll()方法中调用scrollTo来滚动item
  186. mScroller.startScroll(mParentView.getScrollX(), 0, -delta + 1, 0,
  187. Math.abs(delta));
  188. postInvalidate();
  189. }
  190.  
  191. /**
  192. * 从左向右滚动出界面
  193. */
  194. private void scrollLeft() {
  195. final int delta = (viewWidth - mParentView.getScrollX());
  196. // 调用startScroll方法来设置一些滚动的參数,我们在computeScroll()方法中调用scrollTo来滚动item
  197. mScroller.startScroll(mParentView.getScrollX(), 0, delta - 1, 0,
  198. Math.abs(delta));
  199. postInvalidate();
  200. }
  201.  
  202. /**
  203. * 滚动到起始位置
  204. */
  205. public void scrollOrigin(boolean byPeople) {
  206. //getScrollX() ---> Return the scrolled left position of this view(返回偏离了屏幕左边界多远 “正数(左边界|)负数”)
  207. this.byPeople = byPeople;
  208. int delta = mParentView.getScrollX();
  209. mScroller.startScroll(mParentView.getScrollX(), 0, -delta, 0,
  210. Math.abs(delta));
  211. postInvalidate();
  212. }
  213.  
  214. @Override
  215. public void computeScroll() {
  216. // 调用startScroll的时候scroller.computeScrollOffset()返回值为boolean。true说明滚动尚未完毕,false说明滚动已经完毕
  217. if (mScroller.computeScrollOffset()) {
  218. mParentView.scrollTo(mScroller.getCurrX(), mScroller.getCurrY());
  219. postInvalidate();
  220.  
  221. if (mScroller.isFinished() && isFinish) {
  222.  
  223. if (onSildingFinishListener != null) {
  224. if(!this.byPeople){
  225. onSildingFinishListener.onSildingFinish(direction);
  226. }
  227. this.byPeople = false;
  228.  
  229. }else{
  230. //没有设置OnSildingFinishListener,让其滚动到事实上位置
  231. scrollOrigin(false);
  232. isFinish = false;
  233. }
  234. }
  235. }
  236. }
  237.  
  238. public interface OnSildingFinishListener {
  239. /**
  240. * 从左向右滚动出界面 type=1
  241. * 从右向左滚动出界面 type=2
  242. * @param type
  243. */
  244. public void onSildingFinish(int type);
  245. }
  246.  
  247. }

看一下这些activity里面的代码

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

  1. package com.example.testsildingfinishlayout;
  2.  
  3. import com.example.testsildingfinishlayout.SildingFinishLayout.OnSildingFinishListener;
  4.  
  5. import android.app.Activity;
  6. import android.content.Intent;
  7. import android.os.Bundle;
  8. import android.view.Menu;
  9. import android.view.MenuItem;
  10.  
  11. public class MainActivity extends Activity {
  12. SildingFinishLayout sildingFinishLayout=null;
  13. boolean flag = false;
  14. @Override
  15. protected void onCreate(Bundle savedInstanceState) {
  16. super.onCreate(savedInstanceState);
  17. setContentView(R.layout.activity_main);
  18.  
  19. sildingFinishLayout= (SildingFinishLayout) findViewById(R.id.num1);
  20. sildingFinishLayout
  21. .setOnSildingFinishListener(new OnSildingFinishListener() {
  22.  
  23. @Override
  24. public void onSildingFinish(int type) {
  25. if (type ==2){
  26. Intent fromSpiltOuttoPostIntent = new Intent();
  27. fromSpiltOuttoPostIntent.setClass(MainActivity.this,
  28. Num2Activity.class);
  29. startActivity(fromSpiltOuttoPostIntent);
  30.  
  31. }
  32.  
  33. }
  34. });
  35. //设置仅仅能向左滑动打开新的activity
  36. sildingFinishLayout.setSlidingDirection(2);
  37. }
  38.  
  39. @Override
  40. protected void onResume() {
  41. // TODO Auto-generated method stub
  42. super.onResume();
  43. //当从新显示当前页面的时候把sildingFinishLayout滚回到屏幕可视范围,之前已经滚出了屏幕
  44. if(flag)
  45. sildingFinishLayout.scrollOrigin(true);//将原来私有的滚会初始位置的方法设为public
  46. }
  47.  
  48. @Override
  49. protected void onStop() {
  50. // TODO Auto-generated method stub
  51. super.onStop();
  52. flag = true;
  53. }
  54.  
  55. @Override
  56. public boolean onCreateOptionsMenu(Menu menu) {
  57. // Inflate the menu; this adds items to the action bar if it is present.
  58. getMenuInflater().inflate(R.menu.main, menu);
  59. return true;
  60. }
  61.  
  62. @Override
  63. public boolean onOptionsItemSelected(MenuItem item) {
  64. // Handle action bar item clicks here. The action bar will
  65. // automatically handle clicks on the Home/Up button, so long
  66. // as you specify a parent activity in AndroidManifest.xml.
  67. int id = item.getItemId();
  68. if (id == R.id.action_settings) {
  69. return true;
  70. }
  71. return super.onOptionsItemSelected(item);
  72. }
  73. }

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

  1. package com.example.testsildingfinishlayout;
  2.  
  3. import com.example.testsildingfinishlayout.SildingFinishLayout.OnSildingFinishListener;
  4.  
  5. import android.support.v7.app.ActionBarActivity;
  6. import android.app.Activity;
  7. import android.content.Intent;
  8. import android.os.Bundle;
  9. import android.view.Menu;
  10. import android.view.MenuItem;
  11.  
  12. public class Num2Activity extends Activity {
  13. SildingFinishLayout sildingFinishLayout=null;
  14. boolean flag = false;
  15. @Override
  16. protected void onCreate(Bundle savedInstanceState) {
  17. super.onCreate(savedInstanceState);
  18. setContentView(R.layout.activity_num2);
  19.  
  20. sildingFinishLayout= (SildingFinishLayout) findViewById(R.id.num2);
  21. sildingFinishLayout
  22. .setOnSildingFinishListener(new OnSildingFinishListener() {
  23.  
  24. @Override
  25. public void onSildingFinish(int type) {
  26. if (type == 1)
  27. Num2Activity.this.finish();
  28. if (type ==2){
  29. Intent fromSpiltOuttoPostIntent = new Intent();
  30. fromSpiltOuttoPostIntent.setClass(Num2Activity.this,
  31. Num3Activity.class);
  32. startActivity(fromSpiltOuttoPostIntent);
  33.  
  34. }
  35.  
  36. }
  37. });
  38. sildingFinishLayout.setSlidingDirection(3);
  39. }
  40. @Override
  41. protected void onResume() {
  42. // TODO Auto-generated method stub
  43. super.onResume();
  44. if(flag)
  45. sildingFinishLayout.scrollOrigin(true);
  46. }
  47. @Override
  48. protected void onStop() {
  49. // TODO Auto-generated method stub
  50. super.onStop();
  51. flag = true;
  52. }
  53. @Override
  54. public boolean onCreateOptionsMenu(Menu menu) {
  55. // Inflate the menu; this adds items to the action bar if it is present.
  56. getMenuInflater().inflate(R.menu.num2, menu);
  57. return true;
  58. }
  59.  
  60. @Override
  61. public boolean onOptionsItemSelected(MenuItem item) {
  62. // Handle action bar item clicks here. The action bar will
  63. // automatically handle clicks on the Home/Up button, so long
  64. // as you specify a parent activity in AndroidManifest.xml.
  65. int id = item.getItemId();
  66. if (id == R.id.action_settings) {
  67. return true;
  68. }
  69. return super.onOptionsItemSelected(item);
  70. }
  71. }

第三个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. 华为上机测试题(地铁换乘-java)

    PS:自己写的,自测试OK,供大家参考. /* 高级题样题:地铁换乘描述:已知2条地铁线路,其中A为环线,B为东西向线路,线路都是双向的.经过的站点名分别如下,两条线交叉的换乘点用T1.T2表示.编写 ...

  2. python requests高级耍法

    昨天,我们更多的讨论了request的基础API,让我们对它有了基础的认知.学会上一课程,我们已经能写点基本的爬虫了.但是还不够,因为,很多站点是需要登录的,在站点的各个请求之间,是需要保持回话状态的 ...

  3. JMeter乱码问题的解决

    一.JMeter返回数据是乱码 解决办法是: 在JMeter安装路径的bin目录下,以记事本打开文件jmeter.properties, 找到Sampleresult.default.encoding ...

  4. .apache.commons.io 源代码学习(二)FilenameUtils类

    FilenameUtils是apache common io中一个独立的工具类,对其他没有依赖,看其源代码的import即可知道. import java.io.File;import java.io ...

  5. [thinkphp] APP_DEBUG开启之后session不稳定

    有时候在一个方法中写入了session, 在另一个方法中打印却什么都没有. 我这次的情况是网页上通过ajax传值到一个php函数,然后php把值写入session中.然后我在另一个php方法中打印se ...

  6. springMVC笔记:@ResponseBody

    使用@ResponseBody的方式,将Map形返回值转为json,用作POST请求的返回值.为了解决406 Not Acceptable错误,需要检查以下几项: 1. 依赖包中包含jackson-m ...

  7. db2字符串截取方法及常用函数

    select substr(index_code, 1, locate('-', index_code)-1) from report_data substr(str,m,n)表示从str中的m个字符 ...

  8. 第八章 android-布局

    常用的布局实现方式:线性布局,框架布局,表格布局,相对布局,绝对布局 1,线性布局 (1)线性布局是一种很重要的布局,也是经常用到的一种布局 (2)在线性布局中,所有的元素都按照水平竖直的顺序在界面上 ...

  9. 关于android主线程异常NetworkOnMainThread不能访问网络

    在Android开发中,如果你使用的是Android4.0以后,那你会发现,只要是写在主线程(就是Activity)中的HTTP请求,运行时都会报错,这是因为Android在4.0以后为了防止应用的A ...

  10. delphi程序全屏显示无标题栏覆盖整个屏幕

    delphi 简单实现程序全屏显示无标题栏,覆盖整个屏幕,这个在做工控机或屏保时有用的,具体代码如下,感兴趣的朋友可以参考下哈 delphi 程序全屏显示无标题栏,覆盖整个屏幕,这个在做工控机或屏保时 ...