Android学習ノート_21_ViewFlipper使用の詳細
一、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の間に、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
layout01.xml
layout02.xml
ViewFlipperDemoActivity.java
slide_in_right.xml
slide_out_left.xml
上の例では、レイアウトファイルにViewFlipper固定に2つのViewが追加されていますが、現在NつのViewがある場合はどうしますか?JavaコードにViewを動的に追加する必要があります.次のセクションです.
main.xmlレイアウトファイル
flipper_view.xmlレイアウトファイル
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