【AndroidのViewを制する】 ViewAnimatorを使いこなしてViewを切り替える
今回、紹介するViewAnimatorはFrameLayoutを継承していて、自身のViewツリーにある複数の子Viewを切り替えて表示することができます。
また、切り替える時にアニメーションを付けることができます。
ViewAnimator#addViewを使ってViewを追加する
ViewAnimatorはFrameLayoutを継承したクラスのため、Viewを追加するaddViewはたくさんあります。ViewAnimatorで追加されたaddViewは下記の引数を持ちます。
- View child : 追加する子Viewを設定する
- int index : 何番目の子Viewとして追加するかを指定する
- ViewGroup.LayoutParams params : 子Viewに適用するレイアウトパラムス
// ViewAnimatorをインスタンス化
final ViewAnimator viewAnimator = new ViewAnimator(this);
// TextViewを5つ追加する
for (int i = 0; i < 5; i++) {
FrameLayout.LayoutParams layoutParams =
new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT , ViewGroup.LayoutParams.MATCH_PARENT);
layoutParams.setMargins(50,50,50,50);
TextView textView = new TextView(this);
textView.setText((i + 1) + "個目のTextView");
textView.setTextSize(30);
textView.setGravity(Gravity.CENTER);
// TextViewを追加する
viewAnimator.addView(textView, 0 , layoutParams);
}
// ViewAnimatorを設定したViewを表示する。
setContentView(viewAnimator);
ViewAnimator#showPreviousとViewAnimator#showNextを使って子Viewを切り替える
ViewAnimator#showPreviousは現在表示している子Viewの前にある子Viewに切り替える、先頭のViewが表示されている場合は、末尾のViewが表示されます。ViewAnimator#showNextは現在表示している子Viewの後にある子Viewに切り替える、末尾のViewが表示されている場合は、先頭のViewが表示されます。
LinearLayout linearLayout = new LinearLayout(this);
linearLayout.setOrientation(LinearLayout.VERTICAL);
// ViewAnimatorをインスタンス化
final ViewAnimator viewAnimator = new ViewAnimator(this);
// TextViewを5つ追加する
for (int i = 0; i < 5; i++) {
FrameLayout.LayoutParams layoutParams =
new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT , ViewGroup.LayoutParams.MATCH_PARENT);
layoutParams.setMargins(50,50,50,50);
TextView textView = new TextView(this);
textView.setText((i + 1) + "個目のTextView");
textView.setTextSize(30);
textView.setGravity(Gravity.CENTER);
// TextViewを追加する
viewAnimator.addView(textView, i , layoutParams);
}
// showNextを使って後の子Viewに切り替える
Button nextButton = new Button(this);
nextButton.setText("次へ");
nextButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
viewAnimator.showNext();
}
});
// showPreviousを使って前の子Viewに切り替える
Button previousButton = new Button(this);
previousButton.setText("前へ");
previousButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
viewAnimator.showPrevious();
}
});
linearLayout.addView(viewAnimator);
linearLayout.addView(nextButton);
linearLayout.addView(previousButton);
// ViewAnimatorを設定したViewを表示する。
setContentView(linearLayout);
ViewAnimator#setOutAnimationとViewAnimator#setInAnimationでアニメーションを追加する ViewAnimator#getOutAnimationとViewAnimator#getInAnimationでアニメーションを取得する
ViewAnimator#setOutAnimationを使うことで現在表示されている子Viewが切り替わる時のアニメーションを設定することができます。ViewAnimator#setInAnimationを使うことで次に表示される子Viewが切り替わる時のアニメーションを設定することができます。
ViewAnimator#getOutAnimationを使うことで現在表示されている子Viewに設定されているアニメーションを取得することができます。
ViewAnimator#getInAnimationを使うことで次に表示される子Viewに設定されているアニメーションを取得することができます。
LinearLayout linearLayout = new LinearLayout(this);
linearLayout.setOrientation(LinearLayout.VERTICAL);
// ViewAnimatorをインスタンス化
final ViewAnimator viewAnimator = new ViewAnimator(this);
// TextViewを5つ追加する
for (int i = 0; i < 5; i++) {
FrameLayout.LayoutParams layoutParams =
new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT , ViewGroup.LayoutParams.MATCH_PARENT);
layoutParams.setMargins(50,50,50,50);
TextView textView = new TextView(this);
textView.setText((i + 1) + "個目のTextView");
textView.setTextSize(30);
textView.setGravity(Gravity.CENTER);
// TextViewを追加する
viewAnimator.addView(textView, i , layoutParams);
}
// showNextを使って後の子Viewに切り替える
Button nextButton = new Button(this);
nextButton.setText("次へ");
nextButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
viewAnimator.showNext();
}
});
// フェードアウトアニメーションを作成
AlphaAnimation outAnimation = new AlphaAnimation(1,0);
outAnimation.setDuration(500);
// フェードアウトアニメーションを設定する
viewAnimator.setOutAnimation(outAnimation);
// フェードインアニメーションを作成
AlphaAnimation inAnimation = new AlphaAnimation(0,1);
inAnimation.setDuration(500);
inAnimation.setStartOffset(500);
// フェードインアニメーションを設定する
viewAnimator.setInAnimation(inAnimation);
linearLayout.addView(viewAnimator);
linearLayout.addView(nextButton);
// ViewAnimatorを設定したViewを表示する。
setContentView(linearLayout);
ViewAnimator#setDisplayedChildを使ってViewを切り替える
ViewAnimator#setDisplayedChildは子Viewのindexを指定して、子Viewを切り替えます。
LinearLayout linearLayout = new LinearLayout(this);
linearLayout.setOrientation(LinearLayout.VERTICAL);
// ViewAnimatorをインスタンス化
final ViewAnimator viewAnimator = new ViewAnimator(this);
// TextViewを5つ追加する
for (int i = 0; i < 5; i++) {
FrameLayout.LayoutParams layoutParams =
new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT , ViewGroup.LayoutParams.MATCH_PARENT);
layoutParams.setMargins(50,50,50,50);
TextView textView = new TextView(this);
textView.setText((i + 1) + "個目のTextView");
textView.setTextSize(30);
textView.setGravity(Gravity.CENTER);
// TextViewを追加する
viewAnimator.addView(textView, i , layoutParams);
}
// showNextを使って前の子Viewに切り替える
Button nextButton = new Button(this);
nextButton.setText("次へ");
nextButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
viewAnimator.showNext();
}
});
// setDisplayedChildを使って先頭の子Viewに切り替える
Button firstViewButton = new Button(this);
firstViewButton.setText("最初のViewへ");
firstViewButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
viewAnimator.setDisplayedChild(0);
}
});
linearLayout.addView(viewAnimator);
linearLayout.addView(nextButton);
linearLayout.addView(firstViewButton);
// ViewAnimatorを設定したViewを表示する。
setContentView(linearLayout);
ViewAnimator#getCurrentViewを使ってViewを取得する
ViewAnimator#getCurrentViewは現在表示されている子Viewインスタンスを返却します。
LinearLayout linearLayout = new LinearLayout(this);
linearLayout.setOrientation(LinearLayout.VERTICAL);
// ViewAnimatorをインスタンス化
final ViewAnimator viewAnimator = new ViewAnimator(this);
// TextViewを5つ追加する
for (int i = 0; i < 5; i++) {
FrameLayout.LayoutParams layoutParams =
new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT , ViewGroup.LayoutParams.MATCH_PARENT);
layoutParams.setMargins(50,50,50,50);
TextView textView = new TextView(this);
textView.setText((i + 1) + "個目のTextView");
textView.setTextSize(30);
textView.setGravity(Gravity.CENTER);
// TextViewを追加する
viewAnimator.addView(textView, i , layoutParams);
}
// showNextを使って前の子Viewに切り替える
Button nextButton = new Button(this);
nextButton.setText("次へ");
nextButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
viewAnimator.showNext();
}
});
// getCurrentViewを使って現在表示されている子Viewのテキストを表示する
Button currentTextButton = new Button(this);
currentTextButton.setText("現在のTextViewの文字列を表示");
currentTextButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(ViewAnimatorActivity.this, "テキスト : " + ((TextView)viewAnimator.getCurrentView()).getText().toString() , Toast.LENGTH_SHORT).show();
}
});
linearLayout.addView(viewAnimator);
linearLayout.addView(nextButton);
linearLayout.addView(currentTextButton);
// ViewAnimatorを設定したViewを表示する。
setContentView(linearLayout);
ViewAnimator#getDisplayedChildを使ってインデックスを取得する
ViewAnimator#getDisplayedChildは現在表示されている子Viewのインデックスを返却します。
LinearLayout linearLayout = new LinearLayout(this);
linearLayout.setOrientation(LinearLayout.VERTICAL);
// ViewAnimatorをインスタンス化
final ViewAnimator viewAnimator = new ViewAnimator(this);
// TextViewを5つ追加する
for (int i = 0; i < 5; i++) {
FrameLayout.LayoutParams layoutParams =
new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT , ViewGroup.LayoutParams.MATCH_PARENT);
layoutParams.setMargins(50,50,50,50);
TextView textView = new TextView(this);
textView.setText((i + 1) + "個目のTextView");
textView.setTextSize(30);
textView.setGravity(Gravity.CENTER);
// TextViewを追加する
viewAnimator.addView(textView, i , layoutParams);
}
// showNextを使って前の子Viewに切り替える
Button nextButton = new Button(this);
nextButton.setText("次へ");
nextButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
viewAnimator.showNext();
Toast.makeText(ViewAnimatorActivity.this, "getDisplayedChild : " + viewAnimator.getDisplayedChild() , Toast.LENGTH_SHORT).show();
}
});
linearLayout.addView(viewAnimator);
linearLayout.addView(nextButton);
// ViewAnimatorを設定したViewを表示する。
setContentView(linearLayout);
ViewAnimator#removeAllViewsを使ってViewを除去する
ViewAnimator#removeAllViewsは子Viewをすべて除去します。
LinearLayout linearLayout = new LinearLayout(this);
linearLayout.setOrientation(LinearLayout.VERTICAL);
// ViewAnimatorをインスタンス化
final ViewAnimator viewAnimator = new ViewAnimator(this);
// TextViewを5つ追加する
for (int i = 0; i < 5; i++) {
FrameLayout.LayoutParams layoutParams =
new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT , ViewGroup.LayoutParams.MATCH_PARENT);
layoutParams.setMargins(50,50,50,50);
TextView textView = new TextView(this);
textView.setText((i + 1) + "個目のTextView");
textView.setTextSize(30);
textView.setGravity(Gravity.CENTER);
// TextViewを追加する
viewAnimator.addView(textView, i , layoutParams);
}
// showNextを使って後の子Viewに切り替える
Button nextButton = new Button(this);
nextButton.setText("次へ");
nextButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
viewAnimator.showNext();
}
});
// showPreviousを使って前の子Viewに切り替える
Button previousButton = new Button(this);
previousButton.setText("前へ");
previousButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
viewAnimator.showPrevious();
}
});
linearLayout.addView(viewAnimator);
linearLayout.addView(nextButton);
linearLayout.addView(previousButton);
// ViewAnimatorを設定したViewを表示する。
setContentView(linearLayout);
viewAnimator.removeAllViews();
ViewAnimator#removeViewとViewAnimator#removeViewInLayoutを使ってViewを除去する
ViewAnimator#removeViewとViewAnimator#removeViewInLayoutは子Viewインスタンスを指定してViewを除去します。この二つのメソッドの違いはわかりませんでした。
LinearLayout linearLayout = new LinearLayout(this);
linearLayout.setOrientation(LinearLayout.VERTICAL);
// ViewAnimatorをインスタンス化
final ViewAnimator viewAnimator = new ViewAnimator(this);
// TextViewを5つ追加する
TextView textView = null;
for (int i = 0; i < 5; i++) {
FrameLayout.LayoutParams layoutParams =
new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT , ViewGroup.LayoutParams.MATCH_PARENT);
layoutParams.setMargins(50,50,50,50);
TextView textView = new TextView(this);
textView.setText((i + 1) + "個目のTextView");
textView.setTextSize(30);
textView.setGravity(Gravity.CENTER);
// TextViewを追加する
viewAnimator.addView(textView, i , layoutParams);
}
// Viewを除去する
viewAnimator.removeView(textView);
// showNextを使って後の子Viewに切り替える
Button nextButton = new Button(this);
nextButton.setText("次へ");
nextButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
viewAnimator.showNext();
}
});
// showPreviousを使って前の子Viewに切り替える
Button previousButton = new Button(this);
previousButton.setText("前へ");
previousButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
viewAnimator.showPrevious();
}
});
linearLayout.addView(viewAnimator);
linearLayout.addView(nextButton);
linearLayout.addView(previousButton);
// ViewAnimatorを設定したViewを表示する。
setContentView(linearLayout);
ViewAnimator#removeViewAtを使ってViewを除去する
ViewAnimator#removeViewAtは子Viewのインデックスを指定してViewを除去します。
LinearLayout linearLayout = new LinearLayout(this);
linearLayout.setOrientation(LinearLayout.VERTICAL);
// ViewAnimatorをインスタンス化
final ViewAnimator viewAnimator = new ViewAnimator(this);
// TextViewを5つ追加する
for (int i = 0; i < 5; i++) {
FrameLayout.LayoutParams layoutParams =
new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT , ViewGroup.LayoutParams.MATCH_PARENT);
layoutParams.setMargins(50,50,50,50);
TextView textView = new TextView(this);
textView.setText((i + 1) + "個目のTextView");
textView.setTextSize(30);
textView.setGravity(Gravity.CENTER);
// TextViewを追加する
viewAnimator.addView(textView, i , layoutParams);
}
// showNextを使って後の子Viewに切り替える
Button nextButton = new Button(this);
nextButton.setText("次へ");
nextButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
viewAnimator.showNext();
}
});
// showPreviousを使って前の子Viewに切り替える
Button previousButton = new Button(this);
previousButton.setText("前へ");
previousButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
viewAnimator.showPrevious();
}
});
linearLayout.addView(viewAnimator);
linearLayout.addView(nextButton);
linearLayout.addView(previousButton);
// ViewAnimatorを設定したViewを表示する。
setContentView(linearLayout);
// 0番目の子Viewを除去
viewAnimator.removeViewAt(0);
ViewAnimator#removeViewsとViewAnimator#removeViewsInLayoutを使ってViewを除去する
ViewAnimator#removeViewsとViewAnimator#removeViewsInLayoutは開始インデックスと削除する個数を引数に渡します。この二つのメソッドの違いはわかりませんでした。
LinearLayout linearLayout = new LinearLayout(this);
linearLayout.setOrientation(LinearLayout.VERTICAL);
// ViewAnimatorをインスタンス化
final ViewAnimator viewAnimator = new ViewAnimator(this);
// TextViewを5つ追加する
for (int i = 0; i < 5; i++) {
FrameLayout.LayoutParams layoutParams =
new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT , ViewGroup.LayoutParams.MATCH_PARENT);
layoutParams.setMargins(50,50,50,50);
TextView textView = new TextView(this);
textView.setText((i + 1) + "個目のTextView");
textView.setTextSize(30);
textView.setGravity(Gravity.CENTER);
// TextViewを追加する
viewAnimator.addView(textView, i , layoutParams);
}
// showNextを使って後の子Viewに切り替える
Button nextButton = new Button(this);
nextButton.setText("次へ");
nextButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
viewAnimator.showNext();
}
});
// showPreviousを使って前の子Viewに切り替える
Button previousButton = new Button(this);
previousButton.setText("前へ");
previousButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
viewAnimator.showPrevious();
}
});
linearLayout.addView(viewAnimator);
linearLayout.addView(nextButton);
linearLayout.addView(previousButton);
// ViewAnimatorを設定したViewを表示する。
setContentView(linearLayout);
// 0番目から2個のViewを削除する
viewAnimator.removeViews(0,2);
ViewAnimator#getAnimateFirstViewとViewAnimator#setAnimateFirstView
ViewAnimator#setAnimateFirstViewは一つ目の子Viewが追加された時にアニメーションを行うかどうかを設定できます。ViewAnimator#getAnimateFirstViewは一つ目の子Viewが追加された時にアニメーションを行うかどうかを取得できます。
LinearLayout linearLayout = new LinearLayout(this);
linearLayout.setOrientation(LinearLayout.VERTICAL);
// ViewAnimatorをインスタンス化
final ViewAnimator viewAnimator = new ViewAnimator(this);
// アニメーションを有効にする
viewAnimator.setAnimateFirstView(true);
// フェードアウトアニメーションを作成
AlphaAnimation outAnimation = new AlphaAnimation(1,0);
outAnimation.setDuration(500);
// フェードアウトアニメーションを設定する
viewAnimator.setOutAnimation(outAnimation);
// フェードインアニメーションを作成
AlphaAnimation inAnimation = new AlphaAnimation(0,1);
inAnimation.setDuration(500);
inAnimation.setStartOffset(500);
// フェードインアニメーションを設定する
viewAnimator.setInAnimation(inAnimation);
linearLayout.addView(viewAnimator);
// ViewAnimatorを設定したViewを表示する。
setContentView(linearLayout);
linearLayout.postDelayed(new Runnable() {
@Override
public void run() {
// TextViewを5つ追加する
TextView textView = null;
for (int i = 0; i < 5; i++) {
FrameLayout.LayoutParams layoutParams =
new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT , ViewGroup.LayoutParams.MATCH_PARENT);
layoutParams.setMargins(50,50,50,50);
textView = new TextView(this);
textView.setText((i + 1) + "個目のTextView");
textView.setTextSize(30);
textView.setGravity(Gravity.CENTER);
viewAnimator.addView(textView, i , layoutParams);
}
}
},1000);