滑动切换界面---单Activity
PS:该方式,只是Activity里面的layout在切换,Activity始终只有一个MainActivity,∴ 控件在MainActivity中都可以得到,因此 不涉及 Activity间传值的问题。
一、检测 手指的滑动
1、
实现 Activity 的 onTouchEvent 事件:
@Override public boolean onTouchEvent(MotionEvent event) { return super.onTouchEvent(event); }
2、
2.1、实现接口 android.view.GestureDetector.OnGestureListener
public class MainActivity extends Activity implements android.view.GestureDetector.OnGestureListener
2.2、实现 该接口的 6个函数
@Override public boolean onDown(MotionEvent e) { // TODO Auto-generated method stub return false; } @Override public void onShowPress(MotionEvent e) { // TODO Auto-generated method stub } @Override public boolean onSingleTapUp(MotionEvent e) { // TODO Auto-generated method stub return false; } @Override public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) { // TODO Auto-generated method stub return false; } @Override public void onLongPress(MotionEvent e) { // TODO Auto-generated method stub } @Override public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { // TODO Auto-generated method stub return false; }
这里,别的 函数都不用管,只要关注 方法onFling 就可以了。
3、编程
3.1、MainActivity 添加私有变量:
private GestureDetector FgestureDetector;
3.2、MainActivity 的 onCreate 中创建 GestureDetector对象:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); FgestureDetector = new GestureDetector(MainActivity.this, this); }
3.3、MainActivity 的 onTouchEvent 中调用GestureDetector.onTouchEvent :
@Override public boolean onTouchEvent(MotionEvent event) { return FgestureDetector.onTouchEvent(event); //return super.onTouchEvent(event); }
3.4、onFling 的实现改成如下:
@Override public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { float fDelta = 120; if (e2.getX() - e1.getX() > fDelta) { //new AlertDialog.Builder(this).setTitle("Android 提示").setMessage("==> ==>").show(); Toast.makeText(getApplication(), "==> ==>", Toast.LENGTH_LONG).show(); return true; } else if (e2.getX() - e1.getX() < (-fDelta)) { //new AlertDialog.Builder(this).setTitle("Android 提示").setMessage("<== <==").show(); Toast.makeText(getApplication(), "<== <==", Toast.LENGTH_LONG).show(); return true; } return true; //return false; }
4、这样就能检测到 手指的滑动了。
二、页面的切换:
1、MainActivity 中添加 变量:
private ViewFlipper Fvf01;
2、MainActivity 的 onCreate事件中创建 ViewFlipper 对象
Fvf01 = (ViewFlipper) this.findViewById(R.id.viewFlipper1);
3、MainActivity 的onTouchEvent事件中添加代码,使之变成如下形式:
@Override public boolean onTouchEvent(MotionEvent event) { Fvf01.stopFlipping(); Fvf01.setAutoStart(false); return FgestureDetector.onTouchEvent(event); }
4、MainActivity 的 onFling事件中添加代码,使之变成如下形式:
1 @Override 2 public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) 3 { 4 float fDelta = 120; 5 if (e2.getX() - e1.getX() > fDelta) 6 { 7 //new AlertDialog.Builder(this).setTitle("Android 提示").setMessage("==> ==>").show(); 8 Toast.makeText(getApplication(), "==> ==>", Toast.LENGTH_LONG).show(); 9 10 Animation rInAnim = AnimationUtils.loadAnimation(this, R.anim.push_right_in); 11 Animation rOutAnim = AnimationUtils.loadAnimation(this, R.anim.push_right_out); 12 13 Fvf01.setInAnimation(rInAnim); 14 Fvf01.setOutAnimation(rOutAnim); 15 Fvf01.showPrevious(); 16 return true; 17 } 18 else if (e2.getX() - e1.getX() < (-fDelta)) 19 { 20 //new AlertDialog.Builder(this).setTitle("Android 提示").setMessage("<== <==").show(); 21 Toast.makeText(getApplication(), "<== <==", Toast.LENGTH_LONG).show(); 22 23 Animation lInAnim = AnimationUtils.loadAnimation(this, R.anim.push_left_in); 24 Animation lOutAnim = AnimationUtils.loadAnimation(this, R.anim.push_left_out); 25 26 Fvf01.setInAnimation(lInAnim); 27 Fvf01.setOutAnimation(lOutAnim); 28 Fvf01.showNext(); 29 return true; 30 } 31 //return true; 32 return false; 33 }
5、项目-->res -->新建文件夹"anim" --> 里面放入4个xml文件:
push_left_in.xml、push_left_out.xml、push_right_in.xml、push_right_out.xml
它们的内容分别为:
5.1、push_left_in.xml :
1 <?xml version="1.0" encoding="utf-8"?> 2 <set xmlns:android="http://schemas.android.com/apk/res/android" > 3 <translate 4 android:duration="500" 5 android:fromXDelta="100%p" 6 android:toXDelta="0" /> 7 8 <alpha 9 android:duration="500" 10 android:fromAlpha="0.1" 11 android:toAlpha="1.0" /> 12 </set>
5.2、push_left_out.xml :
1 <?xml version="1.0" encoding="utf-8"?> 2 <set xmlns:android="http://schemas.android.com/apk/res/android" > 3 <translate 4 android:duration="500" 5 android:fromXDelta="0" 6 android:toXDelta="-100%p" /> 7 8 <alpha 9 android:duration="500" 10 android:fromAlpha="1.0" 11 android:toAlpha="0.1" /> 12 </set>
5.3、push_right_in.xml :
1 <?xml version="1.0" encoding="utf-8"?> 2 <set xmlns:android="http://schemas.android.com/apk/res/android" > 3 <translate 4 android:duration="500" 5 android:fromXDelta="-100%p" 6 android:toXDelta="0" /> 7 8 <alpha 9 android:duration="500" 10 android:fromAlpha="0.1" 11 android:toAlpha="1.0" /> 12 </set>
5.4、push_right_out.xml :
1 <?xml version="1.0" encoding="utf-8"?> 2 <set xmlns:android="http://schemas.android.com/apk/res/android" > 3 <translate 4 android:duration="500" 5 android:fromXDelta="0" 6 android:toXDelta="100%p" /> 7 8 <alpha 9 android:duration="500" 10 android:fromAlpha="1.0" 11 android:toAlpha="0.1" /> 12 </set>
三、修改界面layout
1、在 项目-->res-->layout 目录下,新建2个界面xml文件:
zc_layout_1.xml、zc_layout_2.xml
内容为:
1.1、zc_layout_1.xml :
1 <?xml version="1.0" encoding="utf-8"?> 2 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 android:layout_width="match_parent" 4 android:layout_height="match_parent" > 5 6 <TextView 7 android:id="@+id/textView1" 8 android:layout_width="wrap_content" 9 android:layout_height="wrap_content" 10 android:layout_alignParentRight="true" 11 android:layout_alignParentTop="true" 12 android:text="zc_layout_1" /> 13 14 <EditText 15 android:id="@+id/editText1" 16 android:layout_width="wrap_content" 17 android:layout_height="wrap_content" 18 android:layout_alignParentLeft="true" 19 android:layout_alignParentRight="true" 20 android:layout_below="@+id/textView1" 21 android:ems="10" 22 android:gravity="center_vertical|top" 23 android:inputType="textMultiLine" 24 android:minLines="10" > 25 26 <requestFocus /> 27 </EditText> 28 29 30 </RelativeLayout>
1.2、zc_layout_2.xml :
1 <?xml version="1.0" encoding="utf-8"?> 2 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 android:layout_width="match_parent" 4 android:layout_height="match_parent" > 5 6 <TextView 7 android:id="@+id/textView1" 8 android:layout_width="wrap_content" 9 android:layout_height="wrap_content" 10 android:layout_alignParentLeft="true" 11 android:layout_alignParentTop="true" 12 android:text="zc_layout_2" /> 13 14 15 16 </RelativeLayout>
2、
原来的 activity_main.xml 内容为:
1 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 2 xmlns:tools="http://schemas.android.com/tools" 3 android:layout_width="match_parent" 4 android:layout_height="match_parent" 5 android:paddingBottom="@dimen/activity_vertical_margin" 6 android:paddingLeft="@dimen/activity_horizontal_margin" 7 android:paddingRight="@dimen/activity_horizontal_margin" 8 android:paddingTop="@dimen/activity_vertical_margin" 9 tools:context="com.example.slideandroidz.MainActivity" > 10 11 <TextView 12 android:layout_width="wrap_content" 13 android:layout_height="wrap_content" 14 android:text="@string/hello_world" /> 15 16 </RelativeLayout>
现在 修改为:
1 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 2 xmlns:tools="http://schemas.android.com/tools" 3 android:layout_width="match_parent" 4 android:layout_height="match_parent" 5 android:paddingBottom="@dimen/activity_vertical_margin" 6 android:paddingLeft="@dimen/activity_horizontal_margin" 7 android:paddingRight="@dimen/activity_horizontal_margin" 8 android:paddingTop="@dimen/activity_vertical_margin" 9 tools:context="com.example.slideandroidz.MainActivity" > 10 11 <ViewFlipper 12 android:id="@+id/viewFlipper1" 13 android:layout_width="match_parent" 14 android:layout_height="match_parent" > 15 16 <include layout="@layout/zc_layout_1" /> 17 18 <include layout="@layout/zc_layout_2" /> 19 20 </ViewFlipper> 21 22 </RelativeLayout>
这样修改后, activity_main.xml 就不负责显示具体的控件了,它只是用来负责容纳 zc_layout_1和zc_layout_2。
然后切换的时候,是 zc_layout_1和zc_layout_2 在切换,activity_main.xml 并不参与其中。
100、
我的代码 保存于:百度云 -->codeskill33 -->“全部文件 > Code__Demo_Test > Android手指滑动_切换界面_单Activity” --> SlideAndroidZ
PS:完整的代码的例子:
1 package com.example.commandandroidz; 2 3 import android.app.Activity; 4 import android.os.Bundle; 5 import android.view.GestureDetector; 6 import android.view.Menu; 7 import android.view.MenuItem; 8 import android.view.MotionEvent; 9 import android.view.animation.Animation; 10 import android.view.animation.AnimationUtils; 11 import android.widget.ViewFlipper; 12 13 public class MainActivity extends Activity implements android.view.GestureDetector.OnGestureListener 14 { 15 16 @Override 17 protected void onCreate(Bundle savedInstanceState) 18 { 19 super.onCreate(savedInstanceState); 20 setContentView(R.layout.activity_main); 21 22 23 FgestureDetector = new GestureDetector(MainActivity.this, this); 24 Fvf01 = (ViewFlipper) this.findViewById(R.id.viewFlipper1); 25 } 26 27 @Override 28 public boolean onCreateOptionsMenu(Menu menu) { 29 // Inflate the menu; this adds items to the action bar if it is present. 30 getMenuInflater().inflate(R.menu.main, menu); 31 return true; 32 } 33 34 @Override 35 public boolean onOptionsItemSelected(MenuItem item) { 36 // Handle action bar item clicks here. The action bar will 37 // automatically handle clicks on the Home/Up button, so long 38 // as you specify a parent activity in AndroidManifest.xml. 39 int id = item.getItemId(); 40 if (id == R.id.action_settings) { 41 return true; 42 } 43 return super.onOptionsItemSelected(item); 44 } 45 46 // *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** 47 // *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** 48 49 @Override 50 public boolean onTouchEvent(MotionEvent event) 51 { 52 Fvf01.stopFlipping(); 53 Fvf01.setAutoStart(false); 54 return FgestureDetector.onTouchEvent(event); 55 //return super.onTouchEvent(event); 56 } 57 58 // *** *** *** 59 60 private GestureDetector FgestureDetector; 61 private ViewFlipper Fvf01; 62 63 @Override 64 public boolean onDown(MotionEvent e) 65 {return false;} 66 67 @Override 68 public void onShowPress(MotionEvent e) 69 {} 70 71 @Override 72 public boolean onSingleTapUp(MotionEvent e) 73 {return false;} 74 75 @Override 76 public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) 77 {return false;} 78 79 @Override 80 public void onLongPress(MotionEvent e) 81 {} 82 83 @Override 84 public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) 85 { 86 float fDelta = 120; 87 if (e2.getX() - e1.getX() > fDelta) 88 { 89 //new AlertDialog.Builder(this).setTitle("Android 提示").setMessage("==> ==>").show(); 90 //Toast.makeText(getApplication(), "==> ==>", Toast.LENGTH_LONG).show(); 91 92 Animation rInAnim = AnimationUtils.loadAnimation(this, R.anim.push_right_in); 93 Animation rOutAnim = AnimationUtils.loadAnimation(this, R.anim.push_right_out); 94 95 Fvf01.setInAnimation(rInAnim); 96 Fvf01.setOutAnimation(rOutAnim); 97 Fvf01.showPrevious(); 98 return true; 99 } 100 else if (e2.getX() - e1.getX() < (-fDelta)) 101 { 102 //new AlertDialog.Builder(this).setTitle("Android 提示").setMessage("<== <==").show(); 103 //Toast.makeText(getApplication(), "<== <==", Toast.LENGTH_LONG).show(); 104 105 Animation lInAnim = AnimationUtils.loadAnimation(this, R.anim.push_left_in); 106 Animation lOutAnim = AnimationUtils.loadAnimation(this, R.anim.push_left_out); 107 108 Fvf01.setInAnimation(lInAnim); 109 Fvf01.setOutAnimation(lOutAnim); 110 Fvf01.showNext(); 111 return true; 112 } 113 //return true; 114 return false; 115 } 116 }
PS:
1 EditText edtMsg01 = (EditText)findViewById(R.id.editMsg01); 2 edtMsg01.setOnTouchListener(new View.OnTouchListener() 3 { 4 @Override 5 public boolean onTouch(View v, MotionEvent event) 6 { 7 Fvf01.stopFlipping(); 8 Fvf01.setAutoStart(false); 9 return FgestureDetector.onTouchEvent(event); 10 //return false; 11 } 12 });
B