android ViewFilpper(二)

来源:互联网 发布:网络的碳足迹是什么 编辑:程序博客网 时间:2024/05/17 14:24

这章是写关于N个View之间进行滑动

如果还是个上篇那样是不可以的,那么我们就需要动态的在java代码中添加View

1、首先来自定义一个ViewFilpper类,名为MyViewFlipper

MyViewFlipper.java

package com.viewflipper;import com.viewflipper.MyGestureListener.OnFlingListener;import android.content.Context;import android.util.AttributeSet;import android.view.GestureDetector;import android.view.MotionEvent;import android.view.View;import android.widget.ViewFlipper;public class MyViewFlipper extends ViewFlipper implements OnFlingListener{private GestureDetector mGestureDetector = null;      private OnViewFlipperListener mOnViewFlipperListener = null;     Context context;    public MyViewFlipper(Context context) {         super(context);         this.context = context;    }      public MyViewFlipper(Context context, AttributeSet attrs) {         super(context, attrs);         this.context = context;    }      public void setOnViewFlipperListener(OnViewFlipperListener mOnViewFlipperListener) {         this.mOnViewFlipperListener = mOnViewFlipperListener;         MyGestureListener myGestureListener = new MyGestureListener();         myGestureListener.setOnFlingListener(this);         mGestureDetector = new GestureDetector(context, myGestureListener);     }      @Override     public boolean onInterceptTouchEvent(MotionEvent ev) {         if (null != mGestureDetector) {             return mGestureDetector.onTouchEvent(ev);         } else {             return super.onInterceptTouchEvent(ev);         }     }      @Override     public void flingToNext() {         if (null != mOnViewFlipperListener) {             int childCnt = getChildCount();             if (childCnt == 2) {                 removeViewAt(1);             }             addView(mOnViewFlipperListener.getNextView(), 0);             if (0 != childCnt) {                 setInAnimation(getContext(), R.anim.left_in);                 setOutAnimation(getContext(), R.anim.left_out);                 setDisplayedChild(0);             }         }     }      @Override     public void flingToPrevious() {         if (null != mOnViewFlipperListener) {             int childCnt = getChildCount();             if (childCnt == 2) {                 removeViewAt(1);             }             addView(mOnViewFlipperListener.getPreviousView(), 0);             if (0 != childCnt) {                 setInAnimation(getContext(), R.anim.right_in);                 setOutAnimation(getContext(), R.anim.right_out);                 setDisplayedChild(0);             }         }     }      public interface OnViewFlipperListener {         View getNextView();          View getPreviousView();     } }

2、定义一个MyGestureListener类继承SimpleOnGestureListener

package com.viewflipper;import android.view.GestureDetector.SimpleOnGestureListener;import android.view.MotionEvent;public class MyGestureListener extends SimpleOnGestureListener {private OnFlingListener mOnFlingListener;      public OnFlingListener getOnFlingListener() {         return mOnFlingListener;     }      public void setOnFlingListener(OnFlingListener mOnFlingListener) {         this.mOnFlingListener = mOnFlingListener;     }      @Override     public final boolean onFling(final MotionEvent e1, final MotionEvent e2,             final float speedX, final float speedY) {         if (mOnFlingListener == null) {             return super.onFling(e1, e2, speedX, speedY);         }          float XFrom = e1.getX();         float XTo = e2.getX();         float YFrom = e1.getY();         float YTo = e2.getY();         // 左右滑动的X轴幅度大于100,并且X轴方向的速度大于100         if (Math.abs(XFrom - XTo) > 100.0f && Math.abs(speedX) > 100.0f) {             // X轴幅度大于Y轴的幅度             if (Math.abs(XFrom - XTo) >= Math.abs(YFrom - YTo)) {                 if (XFrom > XTo) {                     // 下一个                     mOnFlingListener.flingToNext();                 } else {                     // 上一个                     mOnFlingListener.flingToPrevious();                 }             }         } else {             return false;         }         return true;     }      public interface OnFlingListener {         void flingToNext();          void flingToPrevious();     }}

3、编写主界面 main.xml文件

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="fill_parent"    android:layout_height="fill_parent"    android:orientation="vertical" >    <com.viewflipper.MyViewFlipper         android:id="@+id/myViewFlipper"         android:layout_width="fill_parent"         android:layout_height="fill_parent"         android:background="@android:color/white"         android:gravity="center">     </com.viewflipper.MyViewFlipper></LinearLayout>

4、flipper_view.xml

<?xml version="1.0" encoding="utf-8"?><ScrollView xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="fill_parent"    android:layout_height="fill_parent"    android:scrollbars="none"  >    <LinearLayout        android:layout_width="fill_parent"         android:layout_height="wrap_content"         android:gravity="center"         android:orientation="vertical" >        <ImageView             android:layout_width="wrap_content"             android:layout_height="wrap_content"             android:src="@drawable/ic_launcher" />          <TextView             android:id="@+id/textView"             android:textSize="100dip"             android:layout_width="wrap_content"             android:layout_height="wrap_content" />     </LinearLayout>    </ScrollView>

5、编写左右滑动的xml

left_in.xml和left_out.xml在上一篇文章给出了,这里就不重复

right_in.xml

<?xml version="1.0" encoding="utf-8"?><set xmlns:android="http://schemas.android.com/apk/res/android">    <translate        android:fromXDelta="-100%p"        android:toXDelta="0"        android:duration="500"        /><alpha    android:fromAlpha="0.0"    android:toAlpha="1.0"    android:duration="500"    /></set>

right_out.xml

<?xml version="1.0" encoding="utf-8"?><set xmlns:android="http://schemas.android.com/apk/res/android">    <translate        android:fromXDelta="0"        android:toXDelta="100%p"        android:duration="500"        /><alpha    android:fromAlpha="1.0"    android:toAlpha="0.0"    android:duration="500"    /></set>

6、Activity类

package com.viewflipper;import com.viewflipper.MyViewFlipper.OnViewFlipperListener;import android.app.Activity;import android.os.Bundle;import android.view.LayoutInflater;import android.view.View;import android.widget.ScrollView;import android.widget.TextView;public class ViewFlipperActivity  extends Activity implements OnViewFlipperListener{private MyViewFlipper myViewFlipper;     private int currentNumber;    @Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.main);        currentNumber = 1;         myViewFlipper = (MyViewFlipper) findViewById(R.id.myViewFlipper);         myViewFlipper.setOnViewFlipperListener(this);         myViewFlipper.addView(creatView(currentNumber));     }@Overridepublic View getNextView() {currentNumber = currentNumber == 10 ? 1 : currentNumber + 1;         return creatView(currentNumber); }@Override public View getPreviousView() {currentNumber = currentNumber == 1 ? 10 : currentNumber - 1;         return creatView(currentNumber); }private View creatView(int currentNumber) {         LayoutInflater layoutInflater = LayoutInflater.from(this);         ScrollView resultView = (ScrollView) layoutInflater.inflate(R.layout.flipper_view, null);         ((TextView) resultView.findViewById(R.id.textView)).setText(currentNumber + "");         return resultView;     }     }

好了,效果自己运行出来就可以看到了