Android学習ノート_21_ViewFlipper使用の詳細

37789 ワード

一、ViewFilpperクラスの紹介
1.1画面切り替え
画面切り替えとは、同じActivity内で画面を切り替えることであり、最も長い場合は、1つのFrameLayout内に複数のページ、例えばシステム設定ページがある.パーソナライズされた設定ページ.
1.2 ViewFilpperクラス
     ViewFlipper extends ViewAnimator
 
 
java.lang.Object
   ↳
android.view.View
 
   ↳
android.view.ViewGroup
 
 
   ↳
android.widget.FrameLayout
 
 
 
   ↳
android.widget.ViewAnimator
 
 
 
 
   ↳
android.widget.ViewFlipper
Class Overview
Simple  ViewAnimator  that will animate between two or more views that have been added to it. Only one child is shown at a time. If requested, can automatically flip between each child at a regular interval.
簡単なViewAnimatorの間に、2つ以上のviewにアニメーション効果を加えます.1人の子供だけが1時間表示されます.必要に応じて、各子供は自動的に一定の時間間隔で反転することができます.
このクラスはFramelayoutクラスを継承し、ViewAnimatorクラスの役割はFrameLayoutの中のView切り替えにアニメーション効果を提供することです.
このクラスには、アニメーションに関連するいくつかの関数があります.
setInAnimation:Viewが画面に入るときに使用するアニメーションを設定します.この関数には2つのバージョンがあり、1つは単一のパラメータを受け入れ、タイプはandroidです.view.animation.Animation;1つは、ContextオブジェクトとAnimationを定義するresourceIDの2つのパラメータを受け入れます. 
setoutAnimation:Viewが画面を終了するときに使用するアニメーションを設定します.パラメータsetInAnimation関数と同じです.
showNext:この関数を呼び出してFrameLayoutの次のViewを表示します.
showPrevious:この関数を呼び出してFrameLayoutの前のViewを表示します.
シンプルなViewFlipperの応用
二、ViewFlipperの複雑な応用
2.1複数のViewを動的に追加
次はDemoでViewFlipperの使い方を知ります
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" > 
 
    <ViewFlipper 
        android:id="@+id/viewFlipper" 
        android:layout_width="fill_parent" 
        android:layout_height="fill_parent" > 
 
        <include 
            android:id="@+id/layout01" 
            layout="@layout/layout01" /> 
 
        <include 
            android:id="@+id/layout02" 
            layout="@layout/layout02" /> 
    ViewFlipper> 
 
LinearLayout> 

  layout01.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" > 
 
    <TextView 
        android:layout_width="fill_parent" 
        android:layout_height="fill_parent" 
        android:gravity="center" 
        android:text="  TextView" 
        android:textSize="40dip" /> 
 
LinearLayout> 

  layout02.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" > 
 
    <LinearLayout 
        android:layout_width="fill_parent" 
        android:layout_height="fill_parent" 
        android:gravity="center" 
        android:orientation="vertical" > 
 
        <ImageView 
            android:layout_width="wrap_content" 
            android:layout_height="wrap_content" 
            android:src="@drawable/ic_launcher" /> 
 
        <TextView 
            android:layout_width="wrap_content" 
            android:layout_height="wrap_content" 
            android:text="  TextView +   ImageView" 
            android:textSize="20dip" /> 
    LinearLayout> 
 
LinearLayout> 

  ViewFlipperDemoActivity.java
package com.tianjf; 
 
import android.app.Activity; 
import android.os.Bundle; 
import android.view.MotionEvent; 
import android.view.View; 
import android.view.View.OnTouchListener; 
import android.view.animation.AnimationUtils; 
import android.widget.ViewFlipper; 
 
public class ViewFlipperDemoActivity extends Activity implements 
        OnTouchListener { 
 
    private ViewFlipper viewFlipper; 
 
    //           X   
    private float touchDownX; 
    //           X   
    private float touchUpX; 
 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState); 
        setContentView(R.layout.main); 
 
        viewFlipper = (ViewFlipper) findViewById(R.id.viewFlipper); 
        viewFlipper.setOnTouchListener(this); 
    } 
 
    @Override 
    public boolean onTouch(View v, MotionEvent event) { 
        if (event.getAction() == MotionEvent.ACTION_DOWN) { 
            //             X   
            touchDownX = event.getX(); 
            return true; 
        } else if (event.getAction() == MotionEvent.ACTION_UP) { 
            //             X   
            touchUpX = event.getX(); 
            //     ,    View 
            if (touchUpX - touchDownX > 100) { 
                //   View      
                viewFlipper.setInAnimation(AnimationUtils.loadAnimation(this, 
                        android.R.anim.slide_in_left)); 
                viewFlipper.setOutAnimation(AnimationUtils.loadAnimation(this, 
                        android.R.anim.slide_out_right)); 
                //      View 
                viewFlipper.showPrevious(); 
                //     ,    View 
            } else if (touchDownX - touchUpX > 100) { 
                //   View      
                //   Android    slide_out_left slide_in_right,    slide_in_left slide_out_right   slide_out_left slide_in_right 
                viewFlipper.setInAnimation(AnimationUtils.loadAnimation(this, 
                        R.anim.slide_in_right)); 
                viewFlipper.setOutAnimation(AnimationUtils.loadAnimation(this, 
                        R.anim.slide_out_left)); 
                //      View 
                viewFlipper.showNext(); 
            } 
            return true; 
        } 
        return false; 
    } 
} 

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

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

上の例では、レイアウトファイルにViewFlipper固定に2つのViewが追加されていますが、現在NつのViewがある場合はどうしますか?JavaコードにViewを動的に追加する必要があります.次のセクションです.
  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.tianjf.MyViewFlipper 
        android:id="@+id/myViewFlipper" 
        android:layout_width="fill_parent" 
        android:layout_height="fill_parent" 
        android:background="@android:color/white" 
        android:gravity="center" > 
    com.tianjf.MyViewFlipper> 
 
LinearLayout> 

    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> 

 
package com.tianjf; 
 
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(); 
    } 
} 
MyViewFlipper.java
[java]
package com.tianjf; 
 
import com.tianjf.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; 
 
    public MyViewFlipper(Context context) { 
        super(context); 
    } 
 
    public MyViewFlipper(Context context, AttributeSet attrs) { 
        super(context, attrs); 
    } 
 
    public void setOnViewFlipperListener(OnViewFlipperListener mOnViewFlipperListener) { 
        this.mOnViewFlipperListener = mOnViewFlipperListener; 
        MyGestureListener myGestureListener = new MyGestureListener(); 
        myGestureListener.setOnFlingListener(this); 
        mGestureDetector = new GestureDetector(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_slip_in); 
                setOutAnimation(getContext(), R.anim.left_slip_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_slip_in); 
                setOutAnimation(getContext(), R.anim.right_slip_out); 
                setDisplayedChild(0); 
            } 
        } 
    } 
 
    public interface OnViewFlipperListener { 
        View getNextView(); 
 
        View getPreviousView(); 
    } 
} 

ViewFlipperDemoActivity.java
[java]
package com.tianjf; 
 
import com.tianjf.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 ViewFlipperDemoActivity 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)); 
    } 
 
    @Override 
    public 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; 
    } 
} 

 
  ViewFilpper showPrevious()   showNext()                    View,             ViewFlipper  View,  showPrevious()   showNext()       。             View ?      ?
   ,         MyViewFlipper       ,         。    MyViewFlipper  OnTouchListener  ,    onTouch  ,    MotionEvent.ACTION_DOWN MotionEvent.ACTION_UP            ,  ImageSwitcher      (http://blog.csdn.net/tianjf0514/article/details/7556487)
               ,  Android                       ?   :   。OnGestureListener  onFling             。             MyViewFlipper  OnGestureListener  ,   onFling  。       ,    OnGestureListener        onFling  ,         (onDown()、onShowPress()、onSingleTapUp()、onScroll()、onLongPress()),             ,         。
          ,Android      SimpleOnGestureListener     OnGestureListener   OnDoubleTapListener  ,        。             MyGestureListener.java   SimpleOnGestureListener,             (       onFling  )。
    ,            ,                    。              ?     MyViewFlipper    ?
    onFling  ,      :    View   onFling    ,   ,  flipper_view.xml          LinearLayout,      onFling  ,          ScrollView,      OnFling     。
      flingToNext   flingToPrevious       childCnt,   2, removeViewAt(1);,   addView(mOnViewFlipperListener.getNextView(), 0);。       ImageSwitcher   ,ViewFlipper    ImageSwitcher  ,    2  View,          View     。index 0        ,index 1       。         :    ,        View,   View        2,          childCnt == 2,    index == 1   View(     View) Remove ,       View   index == 0 。          。

OK,                。                   。
            (          ),         View。
  onFling    mOnFlingListener.flingToNext();
flingToNext       MyViewFlipper  ,  flingToNext   addView(mOnViewFlipperListener.getNextView(), 0);
getNextView    ViewFlipperDemoActivity