package com.yokmama.learn10.chapter07.lesson34.ui;
import com.yokmama.learn10.chapter07.lesson34.R;
import android.animation.Animator;
import android.animation.AnimatorInflater;
import android.animation.AnimatorSet;
import android.animation.ObjectAnimator;
import android.annotation.TargetApi;
import android.app.Activity;
import android.os.Build;
import android.os.Bundle;
import android.view.View;
import android.view.animation.AnimationUtils;
import android.view.animation.Interpolator;
import android.widget.Button;
import android.widget.GridLayout;
import android.widget.ImageButton;
@TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH)
public class PropertyAnimationActivity extends Activity implements View.OnClickListener {
private ImageButton mBtnXXml;
private ImageButton mBtnXCode;
private GridLayout mGridLayout;
private boolean isShowingGridLayout = true;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_property_animation);
mBtnXXml = (ImageButton) findViewById(R.id.btn_x_xml);
mBtnXCode = (ImageButton) findViewById(R.id.btn_x_code);
mGridLayout = (GridLayout) findViewById(R.id.grid);
findViewById(R.id.btn_grid).setOnClickListener(this);
mBtnXXml.setOnClickListener(this);
mBtnXCode.setOnClickListener(this);
// GridLayoutにボタンを複数追加
int maxChild = mGridLayout.getRowCount() * mGridLayout.getColumnCount();
for (int i = 0; i < maxChild; i++) {
Button button = (Button) getLayoutInflater().inflate(R.layout.activity_main_button, mGridLayout, false);
button.setText(i + "");
mGridLayout.addView(button);
}
}
@Override
public void onClick(View v) {
int id = v.getId();
if (id == R.id.btn_x_xml) {
doAnimationToBtnXXml();
} else if (id == R.id.btn_x_code) {
doAnimationToBtnXCode();
} else if (id == R.id.btn_grid) {
doAnimationToGridLayout();
}
}
/** GridLayout のアニメーション */
private void doAnimationToGridLayout() {
for (int i = 0, iL = mGridLayout.getChildCount(); i < iL; i++) {
// 左上を基準として、距離を計算する。
int vi = i % mGridLayout.getColumnCount();
int hi = i / mGridLayout.getRowCount();
int dist = vi + hi;
// childを読み込み
View childAt = mGridLayout.getChildAt(i);
// アニメーション読み込み、設定
Animator anim = (isShowingGridLayout)
? AnimatorInflater.loadAnimator(this, R.animator.activity_property_animation_grid_hide)
: AnimatorInflater.loadAnimator(this, R.animator.activity_property_animation_grid_show);
anim.setTarget(childAt);
anim.setStartDelay(dist * 60);
anim.start();
}
isShowingGridLayout = !isShowingGridLayout;
}
/** XMLで定義したプロパティアニメーションを実行 */
private void doAnimationToBtnXXml() {
Animator anim = AnimatorInflater.loadAnimator(
this,R.animator.activity_property_animation_move_x);
anim.setTarget(mBtnXXml);
anim.start();
}
/** プログラムで定義したプロパティアニメーションを実行 */
private void doAnimationToBtnXCode() {
Interpolator interpolator = AnimationUtils.loadInterpolator(
this, android.R.interpolator.decelerate_quint);
// 右向き、左向きのアニメーションをそれぞれ作成
ObjectAnimator animStart = ObjectAnimator.ofFloat(mBtnXCode, "translationX", 0.f, 500.f).setDuration(500);
ObjectAnimator animEnd = ObjectAnimator.ofFloat(mBtnXCode, "translationX", 500.f, 0.f).setDuration(500);
animStart.setInterpolator(interpolator);
animEnd.setInterpolator(interpolator);
// 順番に実行
AnimatorSet set = new AnimatorSet();
set.playSequentially(animStart, animEnd);
set.start();
}
}