Android特效专辑(二)——ViewPager渲染背景颜色渐变(引导页)

首页:http://blog.csdn.net/qq_26787115/article/details/50439020

首页里面也提到过,自己有意做一款杂七杂八的APP,就是自己喜欢什么就加上面,现在本文说的是引导页,我找了很久才觉得可以的开源项目,自己做了一下修改
开源地址:https://github.com/TaurusXi/GuideBackgroundColorAnimation
先来看看效果图吧!

图片用的是官方的,嘿嘿

  1. 这个做起来,其实也就是加了一个监听变色的效果,我们来写一下把;

layout_main.xml

  1. <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
  2. xmlns:tools="http://schemas.android.com/tools"
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent" >
  5. <com.lgl.viewpager.ColorAnimationView
  6. android:id="@+id/ColorAnimationView"
  7. android:layout_width="match_parent"
  8. android:layout_height="match_parent" />
  9. <android.support.v4.view.ViewPager
  10. android:id="@+id/viewPager"
  11. android:layout_width="match_parent"
  12. android:layout_height="match_parent"
  13. android:padding="30dp" />
  14. <RelativeLayout
  15. android:layout_width="match_parent"
  16. android:layout_height="match_parent" >
  17. <Button
  18. android:id="@+id/btn_go"
  19. android:layout_width="100dp"
  20. android:layout_height="wrap_content"
  21. android:layout_alignParentBottom="true"
  22. android:layout_centerHorizontal="true"
  23. android:layout_marginBottom="43dp"
  24. android:background="@drawable/colorbu"
  25. android:text="开始"
  26. android:visibility="gone" />
  27. </RelativeLayout>
  28. </FrameLayout>

MainActivity

  1. package com.lgl.viewpager;
  2. import android.annotation.SuppressLint;
  3. import android.os.Bundle;
  4. import android.support.v4.app.Fragment;
  5. import android.support.v4.app.FragmentActivity;
  6. import android.support.v4.app.FragmentManager;
  7. import android.support.v4.app.FragmentStatePagerAdapter;
  8. import android.support.v4.view.ViewPager;
  9. import android.util.Log;
  10. import android.view.LayoutInflater;
  11. import android.view.View;
  12. import android.view.ViewGroup;
  13. import android.widget.Button;
  14. import android.widget.ImageView;
  15. public class MainActivity extends FragmentActivity {
  16. private static final int[] resource = new int[] { R.drawable.welcome1,
  17. R.drawable.welcome4, R.drawable.welcome3, R.drawable.welcome4 };
  18. private static final String TAG = MainActivity.class.getSimpleName();
  19. private Button btn_go;
  20. @Override
  21. protected void onCreate(Bundle savedInstanceState) {
  22. super.onCreate(savedInstanceState);
  23. setContentView(R.layout.activity_main);
  24. btn_go = (Button) findViewById(R.id.btn_go);
  25. MyFragmentStatePager adpter = new MyFragmentStatePager(
  26. getSupportFragmentManager());
  27. ColorAnimationView colorAnimationView = (ColorAnimationView) findViewById(R.id.ColorAnimationView);
  28. ViewPager viewPager = (ViewPager) findViewById(R.id.viewPager);
  29. //设置adapter
  30. viewPager.setAdapter(adpter);
  31. //监听滑动
  32. colorAnimationView.setmViewPager(viewPager, resource.length);
  33. colorAnimationView
  34. .setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
  35. @Override
  36. public void onPageScrolled(int position,
  37. float positionOffset, int positionOffsetPixels) {
  38. Log.e("TAG", "onPageScrolled");
  39. }
  40. @Override
  41. public void onPageSelected(int position) {
  42. //Button显示或隐藏
  43. if (position == 3) {
  44. btn_go.setVisibility(View.VISIBLE);
  45. } else {
  46. btn_go.setVisibility(View.GONE);
  47. }
  48. Log.e("TAG", "onPageSelected");
  49. }
  50. @Override
  51. public void onPageScrollStateChanged(int state) {
  52. Log.e("TAG", "onPageScrollStateChanged");
  53. }
  54. });
  55. }
  56. public class MyFragmentStatePager extends FragmentStatePagerAdapter {
  57. public MyFragmentStatePager(FragmentManager fm) {
  58. super(fm);
  59. }
  60. @Override
  61. public Fragment getItem(int position) {
  62. return new MyFragment(position);
  63. }
  64. @Override
  65. public int getCount() {
  66. return resource.length;
  67. }
  68. }
  69. @SuppressLint("ValidFragment")
  70. public class MyFragment extends Fragment {
  71. private int position;
  72. public MyFragment(int position) {
  73. this.position = position;
  74. }
  75. @Override
  76. public View onCreateView(LayoutInflater inflater, ViewGroup container,
  77. Bundle savedInstanceState) {
  78. ImageView imageView = new ImageView(getActivity());
  79. imageView.setImageResource(resource[position]);
  80. return imageView;
  81. }
  82. }
  83. }

ColorAnimationView

  1. package com.lgl.viewpager;
  2. import android.animation.Animator;
  3. import android.animation.ArgbEvaluator;
  4. import android.animation.ObjectAnimator;
  5. import android.animation.ValueAnimator;
  6. import android.content.Context;
  7. import android.support.v4.view.ViewPager;
  8. import android.util.AttributeSet;
  9. import android.view.View;
  10. public class ColorAnimationView extends View implements
  11. ValueAnimator.AnimatorUpdateListener, Animator.AnimatorListener {
  12. private static final int RED = 0xffFF8080;
  13. private static final int BLUE = 0xff8080FF;
  14. private static final int WHITE = 0xffffffff;
  15. private static final int GREEN = 0xff80ff80;
  16. private static final int DURATION = 3000;
  17. ValueAnimator colorAnim = null;
  18. private PageChangeListener mPageChangeListener;
  19. ViewPager.OnPageChangeListener onPageChangeListener;
  20. public void setOnPageChangeListener(
  21. ViewPager.OnPageChangeListener onPageChangeListener) {
  22. this.onPageChangeListener = onPageChangeListener;
  23. }
  24. /**
  25. * 这是你唯一需要关心的方法
  26. *
  27. * @param mViewPager
  28. * 你必须在设置 Viewpager 的 Adapter 这后,才能调用这个方法。
  29. * @param obj
  30. * ,这个obj实现了 ColorAnimationView.OnPageChangeListener ,实现回调
  31. * @param count
  32. * ,viewpager 数据的数量
  33. * @param colors
  34. * int... colors ,你需要设置的颜色变化值~~ 如何你传人 空,那么触发默认设置的颜色动画
  35. * */
  36. public void setmViewPager(ViewPager mViewPager, int count, int... colors) {
  37. if (mViewPager.getAdapter() == null) {
  38. throw new IllegalStateException(
  39. "ViewPager does not have adapter instance.");
  40. }
  41. mPageChangeListener.setViewPagerChildCount(count);
  42. mViewPager.setOnPageChangeListener(mPageChangeListener);
  43. if (colors.length == 0) {
  44. createDefaultAnimation();
  45. } else {
  46. createAnimation(colors);
  47. }
  48. }
  49. public ColorAnimationView(Context context) {
  50. this(context, null, 0);
  51. }
  52. public ColorAnimationView(Context context, AttributeSet attrs) {
  53. this(context, attrs, 0);
  54. }
  55. public ColorAnimationView(Context context, AttributeSet attrs,
  56. int defStyleAttr) {
  57. super(context, attrs, defStyleAttr);
  58. mPageChangeListener = new PageChangeListener();
  59. }
  60. private void seek(long seekTime) {
  61. if (colorAnim == null) {
  62. createDefaultAnimation();
  63. }
  64. colorAnim.setCurrentPlayTime(seekTime);
  65. }
  66. private void createAnimation(int... colors) {
  67. if (colorAnim == null) {
  68. colorAnim = ObjectAnimator.ofInt(this, "backgroundColor", colors);
  69. colorAnim.setEvaluator(new ArgbEvaluator());
  70. colorAnim.setDuration(DURATION);
  71. colorAnim.addUpdateListener(this);
  72. }
  73. }
  74. private void createDefaultAnimation() {
  75. colorAnim = ObjectAnimator.ofInt(this, "backgroundColor", WHITE, RED,
  76. BLUE, GREEN, WHITE);
  77. colorAnim.setEvaluator(new ArgbEvaluator());
  78. colorAnim.setDuration(DURATION);
  79. colorAnim.addUpdateListener(this);
  80. }
  81. @Override
  82. public void onAnimationStart(Animator animation) {
  83. }
  84. @Override
  85. public void onAnimationEnd(Animator animation) {
  86. }
  87. @Override
  88. public void onAnimationCancel(Animator animation) {
  89. }
  90. @Override
  91. public void onAnimationRepeat(Animator animation) {
  92. }
  93. @Override
  94. public void onAnimationUpdate(ValueAnimator animation) {
  95. invalidate();
  96. }
  97. private class PageChangeListener implements ViewPager.OnPageChangeListener {
  98. private int viewPagerChildCount;
  99. public void setViewPagerChildCount(int viewPagerChildCount) {
  100. this.viewPagerChildCount = viewPagerChildCount;
  101. }
  102. public int getViewPagerChildCount() {
  103. return viewPagerChildCount;
  104. }
  105. @Override
  106. public void onPageScrolled(int position, float positionOffset,
  107. int positionOffsetPixels) {
  108. int count = getViewPagerChildCount() - 1;
  109. if (count != 0) {
  110. float length = (position + positionOffset) / count;
  111. int progress = (int) (length * DURATION);
  112. ColorAnimationView.this.seek(progress);
  113. }
  114. if (onPageChangeListener != null) {
  115. onPageChangeListener.onPageScrolled(position, positionOffset,
  116. positionOffsetPixels);
  117. }
  118. }
  119. @Override
  120. public void onPageSelected(int position) {
  121. if (onPageChangeListener != null) {
  122. onPageChangeListener.onPageSelected(position);
  123. }
  124. }
  125. @Override
  126. public void onPageScrollStateChanged(int state) {
  127. if (onPageChangeListener != null) {
  128. onPageChangeListener.onPageScrollStateChanged(state);
  129. }
  130. }
  131. }
  132. }

扁平化Button

  1. 大家看到这个button是不是挺好看的,这里用到了一个shape属性
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <selector xmlns:android="http://schemas.android.com/apk/res/android">
  3. <item android:state_pressed="true"><shape>
  4. <solid android:color="#5cb57c" />
  5. <corners android:radius="8dp" />
  6. </shape></item>
  7. <item android:state_pressed="false"><shape>
  8. <solid android:color="#80ff80" />
  9. <corners android:radius="8dp" />
  10. </shape></item>
  11. </selector>

Demo下载地址:http://download.csdn.net/detail/qq_26787115/9391782