package com.wind.gifassistant.ui.naviwelcome;
import java.util.ArrayList;
import java.util.List;
import com.wind.gifassistant.R;
import com.wind.gifassistant.ui.MainActivity;
import com.chenupt.springindicator.SpringIndicator;
import com.ryanharter.viewpager.PagerAdapter;
import com.ryanharter.viewpager.ViewPager;
import com.ryanharter.viewpager.ViewPager.OnPageChangeListener;
import android.animation.AnimatorInflater;
import android.animation.AnimatorSet;
import android.animation.ObjectAnimator;
import android.animation.PropertyValuesHolder;
import android.content.Intent;
import android.graphics.drawable.AnimationDrawable;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.v4.app.FragmentActivity;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewTreeObserver.OnGlobalLayoutListener;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.view.animation.CycleInterpolator;
import android.view.animation.LinearInterpolator;
import android.widget.Button;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.RelativeLayout;
public class NavigationWelcomeActivity extends FragmentActivity implements
OnPageChangeListener {
private ViewPager mViewPager;
private VerticalFragementPagerAdapter mPagerAdapter;
SpringIndicator mSpringIndicator;
private List<View> mViewPagersList = new ArrayList<View>();
private static int VIEW_PAGER_1 = 0;
private static int VIEW_PAGER_2 = 1;
private static int VIEW_PAGER_3 = 2;
private static int VIEW_PAGER_4 = 3;
private static int VIEW_PAGER_MAX = 65535;
private int mPreViewPagerIndex = VIEW_PAGER_1;
private AnimationDrawable mNav1TimeShowAnimationDrawable;
/**
* 定义第一个引导界面里的动画VIEW,都是以imageview进行定义 再使用PropertyAnimation作用于VIEW
*/
// 时间变换动画
private ImageView mNav1TimeShowImageView;
// 旋转的电池图标
private ImageView mNav1BatteryImageView;
// 顶上的固定图片,以缩放动画出现,之后固定不变
private ImageView mNav1TopStaticImageView;
/**
* 定义第二个引导页面的动画VIEW
*/
// 顶上渐入的静态图片
private ImageView mNav2TopStaticImageView;
// 中间部分膨大显示的图片
private ImageView mNav2MiddleEveryThingShowImageView;
/**
* 定义第三个引导页面的动画VIEW,该动画中有移动的云彩,
* 而且是在中间一块特定区域内,所以需要在布局加载后计算位置再应用动画
*/
// 顶部静态图片
private ImageView mNav3TopStaticImageView;
// 4张云彩图片
private ImageView mNav3CloudImageView1;
private ImageView mNav3CloudImageView2;
private ImageView mNav3CloudImageView3;
private ImageView mNav3CloudImageView4;
// 火箭
private ImageView mRocketImageView;
// 中间火箭所在区域
private RelativeLayout mRocketAreaCenterLayout;
// 动画位移坐标
private int mCloudFromX1, mCloudFromY1, mCloudToX1, mCloudToY1;
private int mCloudFromX2, mCloudFromY2, mCloudToX2, mCloudToY2;
private int mCloudFromX3, mCloudFromY3, mCloudToX3, mCloudToY3;
private int mCloudFromX4, mCloudFromY4, mCloudToX4, mCloudToY4;
private ObjectAnimator mCloudTransAnimationX1, mCloudTransAnimationY1;
private ObjectAnimator mCloudTransAnimation2;
private ObjectAnimator mCloudTransAnimation3;
private ObjectAnimator mCloudTransAnimation4;
private boolean mCurrentPager3Flag = false;
private int mCurrentPagerPosition;
private AnimationDrawable mRocketAnimationDrawable;
/**
* 定义第四个引导页面的动画VIEW
*/
private ImageView mNav4TopImageView;
private ImageView mNav4bottomTextImageView;
private Button mNav4Button;
/**
* SKIP BUTTON AREA
*/
private FrameLayout mSkipArea;
private Button mSkipWelcomButton;
private boolean mMouseMoving = false;
/**
* 程序首次使用引导界面 争取做到酷炫
*/
public NavigationWelcomeActivity() {
// TODO Auto-generated constructor stub
}
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO 检查是否是第一次启动,如果不是,说明已经运行过引导
// 接跳转到正常界面
super.onCreate(savedInstanceState);
setContentView(R.layout.navigation_welcome_activity);
mViewPager = (ViewPager) findViewById(R.id.navigation_welcome_viewpager);
initViewPagers();
// view pager adapter
mPagerAdapter = new VerticalFragementPagerAdapter();
mViewPager.setAdapter(mPagerAdapter);
mViewPager.setOnPageChangeListener(this);
mSpringIndicator = (SpringIndicator) findViewById(R.id.indicator);
mSpringIndicator.setViewPager(mViewPager);
mSkipArea = (FrameLayout) findViewById(R.id.skip_backgroud_area);
mSkipWelcomButton = (Button) mSkipArea.findViewById(R.id.skip_wlecom_button);
mSkipWelcomButton.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
Intent intent = new Intent(NavigationWelcomeActivity.this, MainActivity.class);
NavigationWelcomeActivity.this.startActivity(intent);
NavigationWelcomeActivity.this.finish();
}
});
doAnimAction(VIEW_PAGER_1);
}
private void initViewPagers() {
initPager1();
initPager2();
initPager3();
initPager4();
}
private void initPager1() {
// 初始化第一页
View navView1 = LayoutInflater.from(this).inflate(R.layout.navigation_1_layout, null);
mNav1TimeShowImageView = (ImageView) navView1.findViewById(R.id.nav_1_time_show);
mNav1BatteryImageView = (ImageView) navView1.findViewById(R.id.nav_1_battery_show);
mNav1TopStaticImageView = (ImageView) navView1.findViewById(R.id.nav_1_static_image);
mViewPagersList.add(navView1);
}
private void initPager2() {
// 初始化第二页
View navView2 = LayoutInflater.from(this).inflate(R.layout.navigation_2_layout, null);
mNav2TopStaticImageView = (ImageView) navView2.findViewById(R.id.nav_2_top_static);
mNav2MiddleEveryThingShowImageView = (ImageView) navView2.findViewById(R.id.nav_2_everything_show);
mViewPagersList.add(navView2);
}
private void initPager3() {
// 初始化第三页
View navView3 = LayoutInflater.from(this).inflate(R.layout.navigation_3_layout, null);
mNav3TopStaticImageView = (ImageView) navView3.findViewById(R.id.nav_3_top_static);
mRocketImageView = (ImageView) navView3.findViewById(R.id.rocket_view);
mNav3CloudImageView1 = (ImageView) navView3.findViewById(R.id.nav_3_cloud_1);
mNav3CloudImageView2 = (ImageView) navView3.findViewById(R.id.nav_3_cloud_2);
mNav3CloudImageView3 = (ImageView) navView3.findViewById(R.id.nav_3_cloud_3);
mNav3CloudImageView4 = (ImageView) navView3.findViewById(R.id.nav_3_cloud_4);
mRocketAreaCenterLayout = (RelativeLayout) navView3.findViewById(R.id.center_rocket_area);
mViewPagersList.add(navView3);
// 增加layout listener,以便在layout结束后计算坐标
navView3.getViewTreeObserver().addOnGlobalLayoutListener(
new OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
// TODO Auto-generated method stub
int rocketAreaHeightTop = mRocketAreaCenterLayout
.getTop();
int rocketAreaHeightBottom = mRocketAreaCenterLayout
.getBottom();
// 获取屏幕的宽度
DisplayMetrics dm = getApplicationContext()
.getResources().getDisplayMetrics();
int screenWidth = dm.widthPixels;
mCloudFromX1 = mNav3CloudImageView1.getTop() + mNav3CloudImageView1.getHeight();
mCloudFromY1 = -mNav3CloudImageView1.getTop() - mNav3CloudImageView1.getHeight();
mCloudToX1 = -mNav3CloudImageView1.getWidth() - mNav3CloudImageView1.getLeft();
mCloudToY1 = mNav3CloudImageView1.getTop() + mNav3CloudImageView1.getLeft()
+ mNav3CloudImageView1.getWidth();
mCloudFromX2 = mNav3CloudImageView2.getTop() + mNav3CloudImageView2.getHeight();
mCloudFromY2 = -mNav3CloudImageView2.getTop() - mNav3CloudImageView2.getHeight();
mCloudToX2 = -mNav3CloudImageView2.getWidth() - mNav3CloudImageView2.getLeft();
mCloudToY2 = mNav3CloudImageView2.getTop() + mNav3CloudImageView2.getLeft()
+ mNav3CloudImageView2.getWidth();
mCloudFromX3 = screenWidth - mNav3CloudImageView3.getLeft();
mCloudFromY3 = -(screenWidth - mNav3CloudImageView3.getLeft());
mCloudToX3 = -(rocketAreaHeightBottom - rocketAreaHeightTop - mNav3CloudImageView3.getTop());
mCloudToY3 = rocketAreaHeightBottom - rocketAreaHeightTop - mNav3CloudImageView3.getTop();
mCloudFromX4 = screenWidth - mNav3CloudImageView4.getLeft();
mCloudFromY4 = -(screenWidth - mNav3CloudImageView4.getLeft());
mCloudToX4 = -(rocketAreaHeightBottom - rocketAreaHeightTop - mNav3CloudImageView4.getTop());
mCloudToY4 = rocketAreaHeightBottom - rocketAreaHeightTop - mNav3CloudImageView4.getTop();
}
});
}
private void initPager4() {
// 初始化第四页
View navView4 = LayoutInflater.from(this).inflate(R.layout.navigation_4_layout, null);
mNav4TopImageView = (ImageView) navView4.findViewById(R.id.nav_4_zhaopai);
mNav4bottomTextImageView = (ImageView) navView4.findViewById(R.id.nav_4_bottom_text);
mNav4Button = (Button) navView4.findViewById(R.id.nav_4_button);
mNav4Button.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
Intent intent = new Intent(NavigationWelcomeActivity.this, MainActivity.class);
NavigationWelcomeActivity.this.startActivity(intent);
NavigationWelcomeActivity.this.finish();
}
});
mViewPagersList.add(navView4);
}
private class VerticalFragementPagerAdapter extends PagerAdapter {
@Override
public int getCount() {
// TODO Auto-generated method stub
return mViewPagersList.size();
}
@Override
public boolean isViewFromObject(View view, Object o) {
return view == o;
}
@Override
public Object instantiateItem(ViewGroup container, int position) {
container.addView(mViewPagersList.get(position));
return mViewPagersList.get(position);
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
container.removeView((View) object);
}
}
@Override
public void onPageScrolled(int position, float positionOffset,
int positionOffsetPixels) {
// TODO Auto-generated method stub
mSpringIndicator.onPageScrolled(position, positionOffset,
positionOffsetPixels);
if (positionOffset == 0 && positionOffsetPixels == 0) {
mMouseMoving = false;
} else {
mMouseMoving = true;
}
//Log.d("Djia", "position = " + position + ", positionOffset = " + positionOffset + ", positionOffsetPixels = " + positionOffsetPixels);
}
@Override
public void onPageSelected(int position) {
// TODO Auto-generated method stub
// 进入ViewPager某一页开始动画,position标示哪一页
//Log.v("Djia", "onPageSelected, position = " + position);
mCurrentPagerPosition = position;
if (position == 3) {
mSkipArea.setVisibility(View.INVISIBLE);
} else {
mSkipArea.setVisibility(View.VISIBLE);
}
mSpringIndicator.onPageSelected(position);
doAnimAction(position);
}
@Override
public void onPageScrollStateChanged(int state) {
// TODO Auto-generated method stub
//Log.e("Djia", "onPageScrollStateChanged, state = " + state);
//hideSkipAreaWhenScrolling(state);
mSpringIndicator.onPageScrollStateChanged(state);
}
private AnimatorSet mSkipButtonShow;
private void hideSkipAreaWhenScrolling(int state) {
if (state == 1 && mMouseMoving) {
mSkipArea.setVisibility(View.INVISIBLE);
} else {
if (mSkipArea.getVisibility() == View.VISIBLE) {
return;
}
if (mSkipButtonShow != null && mSkipButtonShow.isRunning()) {
return;
}
mSkipButtonShow = (AnimatorSet) AnimatorInflater
.loadAnimator(NavigationWelcomeActivity.this,
R.anim.nav_2_everything_show);
mSkipArea.setVisibility(View.VISIBLE);
mSkipButtonShow
.setTarget(mSkipArea);
mSkipButtonShow.start();
}
}
private void doAnimAction(int pagerIndex) {
switch (pagerIndex) {
case 0:
doViewPagerAnimation1(pagerIndex);
break;
case 1:
doViewPagerAnimation2(pagerIndex);
break;
case 2:
doViewPagerAnimation3(pagerIndex);
break;
case 3:
doViewPagerAnimation4(pagerIndex);
break;
default:
break;
}
mPreViewPagerIndex = pagerIndex;
}
private AnimatorSet mNavBatteryRotateAnimationSet;
private AnimatorSet mNavTopStaticAnimationSet;
private void doViewPagerAnimation1(int pagerIndex) {
if (mPreViewPagerIndex > pagerIndex) {
mNav2MiddleEveryThingShowImageView.setVisibility(View.INVISIBLE);
}
// 时间变换动画
mNav1TimeShowImageView
.setImageResource(R.drawable.nav_1_time_show_animation);
mNav1TimeShowAnimationDrawable = (AnimationDrawable) mNav1TimeShowImageView
.getDrawable();
mNav1TimeShowAnimationDrawable.start();
// 电池图标旋转动画
mNavBatteryRotateAnimationSet = (AnimatorSet) AnimatorInflater
.loadAnimator(NavigationWelcomeActivity.this,
R.anim.nav_1_battery_rotate);
LinearInterpolator lin = new LinearInterpolator();
mNavBatteryRotateAnimationSet.setInterpolator(lin);
mNav1BatteryImageView.setVisibility(View.VISIBLE);
mNavBatteryRotateAnimationSet.setTarget(mNav1BatteryImageView);
mNavBatteryRotateAnimationSet.start();
// 上部图片进入动画
mNavTopStaticAnimationSet = (AnimatorSet) AnimatorInflater
.loadAnimator(NavigationWelcomeActivity.this,
R.anim.nav_1_zoom_top);
mNavTopStaticAnimationSet.setTarget(mNav1TopStaticImageView);
mNavTopStaticAnimationSet.start();
}
private AnimatorSet mNav2AnimationEverythingShow;
private void doViewPagerAnimation2(int pagerIndex) {
if (mPreViewPagerIndex > pagerIndex) {
// 从图3退到了图2,需要停止图3上的动画
mCurrentPager3Flag = false;
if (mCloudTransAnimationX1.isRunning()) {
mCloudTransAnimationX1.cancel();
mCloudTransAnimationY1.cancel();
mCloudTransAnimation2.cancel();
mCloudTransAnimation3.cancel();
mCloudTransAnimation4.cancel();
}
mNav3CloudImageView1.setVisibility(View.INVISIBLE);
mNav3CloudImageView2.setVisibility(View.INVISIBLE);
mNav3CloudImageView3.setVisibility(View.INVISIBLE);
mNav3CloudImageView4.setVisibility(View.INVISIBLE);
mRocketAnimationDrawable.stop();
} else {
// 是从图1前进到图2,所以要停止图1上的动画
mNav1TimeShowAnimationDrawable.stop();
mNavBatteryRotateAnimationSet.cancel();
mNav1BatteryImageView.setVisibility(View.INVISIBLE);
}
mNav2AnimationEverythingShow = (AnimatorSet) AnimatorInflater
.loadAnimator(NavigationWelcomeActivity.this,
R.anim.nav_2_everything_show);
mNav2MiddleEveryThingShowImageView.setVisibility(View.VISIBLE);
mNav2AnimationEverythingShow
.setTarget(mNav2MiddleEveryThingShowImageView);
mNav2AnimationEverythingShow.start();
mNavTopStaticAnimationSet.setTarget(mNav2TopStaticImageView);
mNavTopStaticAnimationSet.start();
}
private void doViewPagerAnimation3(int pagerIndex) {
mRocketImageView.setImageResource(R.drawable.nav_3_rocket_animation);
mRocketAnimationDrawable = (AnimationDrawable) mRocketImageView
.getDrawable();
mCloudTransAnimationX1 = ObjectAnimator.ofFloat(mNav3CloudImageView1,
"translationX", mCloudFromX1, mCloudToX1);
mCloudTransAnimationX1.setDuration(800);
mCloudTransAnimationX1.setRepeatCount(Animation.INFINITE);// Animation.INFINITE
mCloudTransAnimationX1.setRepeatMode(Animation.RESTART);
mCloudTransAnimationX1.setInterpolator(new LinearInterpolator());
mCloudTransAnimationY1 = ObjectAnimator.ofFloat(mNav3CloudImageView1,
"translationY", mCloudFromY1, mCloudToY1);
mCloudTransAnimationY1.setDuration(800);
mCloudTransAnimationY1.setRepeatCount(Animation.INFINITE);// Animation.INFINITE
mCloudTransAnimationY1.setRepeatMode(Animation.RESTART);
mCloudTransAnimationY1.setInterpolator(new LinearInterpolator());
PropertyValuesHolder pvhX3 = PropertyValuesHolder.ofFloat(
"translationX", mCloudFromX2, mCloudToX2);
PropertyValuesHolder pvhY3 = PropertyValuesHolder.ofFloat(
"translationY", mCloudFromY2, mCloudToY2);
mCloudTransAnimation2 = ObjectAnimator.ofPropertyValuesHolder(
mNav3CloudImageView2, pvhX3, pvhY3);
mCloudTransAnimation2.setDuration(1200);
mCloudTransAnimation2.setRepeatCount(Animation.INFINITE);
mCloudTransAnimation2.setRepeatMode(Animation.RESTART);
mCloudTransAnimation2.setInterpolator((new LinearInterpolator()));
PropertyValuesHolder pvhX4 = PropertyValuesHolder.ofFloat(
"translationX", mCloudFromX3, mCloudToX3);
PropertyValuesHolder pvhY4 = PropertyValuesHolder.ofFloat(
"translationY", mCloudFromY3, mCloudToY3);
mCloudTransAnimation3 = ObjectAnimator.ofPropertyValuesHolder(
mNav3CloudImageView3, pvhX4, pvhY4);
mCloudTransAnimation3.setDuration(1200);
mCloudTransAnimation3.setRepeatCount(Animation.INFINITE);
mCloudTransAnimation3.setRepeatMode(Animation.RESTART);
mCloudTransAnimation3.setInterpolator((new LinearInterpolator()));
PropertyValuesHolder pvhX5 = PropertyValuesHolder.ofFloat(
"translationX", mCloudFromX4, mCloudToX4);
PropertyValuesHolder pvhY5 = PropertyValuesHolder.ofFloat(
"translationY", mCloudFromY4, mCloudToY4);
mCloudTransAnimation4 = ObjectAnimator.ofPropertyValuesHolder(
mNav3CloudImageView4, pvhX5, pvhY5);
mCloudTransAnimation4.setDuration(800);
mCloudTransAnimation4.setRepeatCount(Animation.INFINITE);
mCloudTransAnimation4.setRepeatMode(Animation.RESTART);
mCloudTransAnimation4.setInterpolator((new LinearInterpolator()));
mCurrentPager3Flag = true;
// 延迟1秒
new Handler() {
@Override
public void dispatchMessage(Message msg) {
// TODO Auto-generated method stub
if (mCurrentPager3Flag)
super.dispatchMessage(msg);
}
public void handleMessage(android.os.Message msg) {
if (msg.what == 1) {
mNav3CloudImageView1.setVisibility(View.VISIBLE);
mNav3CloudImageView2.setVisibility(View.VISIBLE);
mNav3CloudImageView3.setVisibility(View.VISIBLE);
mNav3CloudImageView4.setVisibility(View.VISIBLE);
mCloudTransAnimationX1.start();
mCloudTransAnimationY1.start();
mCloudTransAnimation2.start();
mCloudTransAnimation3.start();
mCloudTransAnimation4.start();
mRocketAnimationDrawable.start();
}
};
}.sendEmptyMessageDelayed(1, 1000);// 1秒
mNavTopStaticAnimationSet.setTarget(mNav3TopStaticImageView);
mNavTopStaticAnimationSet.start();
}
private void doViewPagerAnimation4(int pagerIndex) {
// 停掉页面3的动画及显示
mCurrentPager3Flag = false;
if (mCloudTransAnimationX1.isRunning()) {
mCloudTransAnimationX1.cancel();
mCloudTransAnimationY1.cancel();
mCloudTransAnimation2.cancel();
mCloudTransAnimation3.cancel();
mCloudTransAnimation4.cancel();
}
mNav3CloudImageView1.setVisibility(View.INVISIBLE);
mNav3CloudImageView2.setVisibility(View.INVISIBLE);
mNav3CloudImageView3.setVisibility(View.INVISIBLE);
mNav3CloudImageView4.setVisibility(View.INVISIBLE);
mRocketAnimationDrawable.stop();
ObjectAnimator objAnim = ObjectAnimator.ofFloat(mNav4TopImageView, "rotation", 0f, 10f);
CycleInterpolator interpolator = new CycleInterpolator(3.0f);
objAnim.setStartDelay(500);
objAnim.setDuration(3000);
objAnim.setRepeatCount(Animation.INFINITE);// Animation.INFINITE
objAnim.setRepeatMode(Animation.RESTART);
objAnim.setInterpolator(interpolator);
mNav4TopImageView.setPivotX(mNav4TopImageView.getWidth()*0.47f);
mNav4TopImageView.setPivotY(mNav4TopImageView.getHeight()*0.05f);
objAnim.start();
mNavTopStaticAnimationSet.setTarget(mNav4bottomTextImageView);
mNavTopStaticAnimationSet.start();
}
}