这段时间断断续续的抽时间模仿了下知乎Andorid的引导页面,觉得知乎做的更活泼一些吧。对动画,对NineOld实践也就到此告一段落了,再往深挖无非就是一些插值估值等基础的数学知识了。(在这里我要吐槽下知乎的UI设计师,我搞了好久发现2,3,4页面每个页面中的3张图片一直高度被拉伸,最后发现是图片本身就不一样高!)
我发现知乎好像是用了多个布局文件来加载每页的布局,但是我算比较懒,全塞到一个里面了。demo的Git地址(可能注释的不够明了)
https://github.com/qtstsq55/SimilarKonwLedgeWizard.git
先看下效果图:

源码:

package com.example.zhwizard;import android.app.Activity;
import android.graphics.Color;
import android.os.Bundle;
import android.os.Parcelable;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.view.LayoutInflater;
import android.view.View;
import android.view.animation.AccelerateDecelerateInterpolator;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;import com.example.animator.AnimationFactory;
import com.example.animator.AnimatorValue;
import com.example.animator.AnimatorValueImplements;
import com.example.view.FirstView;
import com.nineoldandroids.animation.Animator;import java.util.ArrayList;
import java.util.List;public class MainActivity extends Activity {private ViewPager viewager;private LinearLayout layout,layout_look,layout_qq,layout_sina;private ArrayList<View> list_views;public static final  int LENGTH=6;private static final float SHOWFROM =0.4f ;private   int  temp,index,status=-1;private FirstView firImage;private View layout_bg;private int red=9,green=42,blue=91;private int redEnd=0,greenEnd=150,blueEnd=255;private float pageDistance;private ImageView im_page_press;private TextView tv_guide_01;private String guideString[]=new String[]{"观而思-知乎漫游指南","思而动-知乎漫游指南","动而问-知乎漫游指南","问而答-知乎漫游指南","答而得-知乎漫游指南"};@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);findViews();initValue();}private void findViews() {viewager=(ViewPager)findViewById(R.id.viewpager);//ViewPagerlayout_bg=  findViewById(R.id.layout_bg);//最外层背景颜色Viewim_page_press= (ImageView) findViewById(R.id.im_pagepress_01);//移动的滑块tv_guide_01= (TextView) findViewById(R.id.tv_guide_01);//底部的引导文字pageDistance=im_page_press.getWidth()+dip2px(3);//滑块移动距离layout_look= (LinearLayout) findViewById(R.id.layout_look);layout_qq= (LinearLayout) findViewById(R.id.layout_qq);layout_sina= (LinearLayout) findViewById(R.id.layout_sina);}private void initValue() {LayoutInflater  inflater = (LayoutInflater)getSystemService(LAYOUT_INFLATER_SERVICE);list_views=new ArrayList<View>();//反射加载6个引导页面布局for(int i=0;i<LENGTH;i++){View view = inflater.inflate(R.layout.wizard_image_item,null);list_views.add(view);}viewager.setAdapter(new MyPagerAdapter(list_views));viewager.setOnPageChangeListener(new MyPageChangeListener());}private void animateNormal(int position,float showFrom,int showPix,int tempPosition){ArrayList<View> curList=new ArrayList<View>();//当前页面的View控件ArrayList<View> nextList=new ArrayList<View>();//下一个页面的View控件ArrayList<AnimatorValue> list_ani=new ArrayList<AnimatorValue>();View nextView=null,curView=null;if(tempPosition>0){curView = list_views.get(index);}else{curView = list_views.get(position);}if(index+1<list_views.size()) {nextView = list_views.get(index +1);}//加入每个页面需要动画的控件if(nextView!=null) {nextList.add(nextView.findViewById(R.id.im_0));nextList.add(nextView.findViewById(R.id.im_1_1));nextList.add(nextView.findViewById(R.id.im_1_2));nextList.add(nextView.findViewById(R.id.im_1_3));nextList.add(nextView.findViewById(R.id.im_2_1));nextList.add(nextView.findViewById(R.id.im_3_1));nextList.add(nextView.findViewById(R.id.im_3_2));nextList.add(nextView.findViewById(R.id.im_3_3));}if(curView!=null) {curList.add(curView.findViewById(R.id.im_0));curList.add(curView.findViewById(R.id.im_1_1));curList.add(curView.findViewById(R.id.im_1_2));curList.add(curView.findViewById(R.id.im_1_3));curList.add(curView.findViewById(R.id.im_2_1));curList.add(curView.findViewById(R.id.im_3_1));curList.add(curView.findViewById(R.id.im_3_2));curList.add(curView.findViewById(R.id.im_3_3));}//当前页面加载动画的实现if(tempPosition>0){if(status==2){for(int i=0;i<curList.size();i++){AnimatorValue a=new  AnimatorValueImplements(curList.get(i),"TranslationX",(float)((i+1)*(temp*(1-showFrom))));list_ani.add(a);}}else {for (int i = 0; i < curList.size(); i++) {AnimatorValue a = new AnimatorValueImplements(curList.get(i), "TranslationX", (float) ((showPix * (i + 1) * (1 - showFrom))));list_ani.add(a);}}}else{for (int i = 0; i < curList.size(); i++) {AnimatorValue a = new AnimatorValueImplements(curList.get(i), "TranslationX", (float) (-(showPix * (curList.size() - i))));list_ani.add(a);}}//下一个页面加载动画的实现,SHOWFROM代表当前页面划过30%,加载下一个动画,具体可以自己设置if(showFrom<SHOWFROM){if(status==2){for (int i = 0; i < nextList.size(); i++) {AnimatorValue a = new AnimatorValueImplements(nextList.get(i), "TranslationX", (float) ((showPix * (i + 1) * (1 - showFrom))));list_ani.add(a);}}else{for(int i=0;i<nextList.size();i++){AnimatorValue a=new  AnimatorValueImplements(nextList.get(i),"TranslationX",(float)(showPix*(i+1)));list_ani.add(a);}temp=showPix;}}else{for(int i=0;i<nextList.size();i++){AnimatorValue a=new  AnimatorValueImplements(nextList.get(i),"TranslationX",(float)((i+1)*(temp*(1-showFrom))));list_ani.add(a);}}//背景动画,蓝色逐渐变淡AnimatorValue b1=new  AnimatorValueImplements(layout_bg,"backgroundColor", Color.rgb(red,green,blue),Color.rgb( (int) (red-(redEnd-red)/list_views.size()*(position+showFrom)), (int) (green+(greenEnd-green)/list_views.size()*(position+showFrom)), (int) (blue+(blueEnd-blue)/list_views.size()*(position+showFrom))));list_ani.add(b1);//滑块动画AnimatorValue b2=new  AnimatorValueImplements(im_page_press,"TranslationX",(pageDistance+im_page_press.getWidth())*(position+showFrom));list_ani.add(b2);//设置执行时间为0,也就是随着滑动实时动画AnimationFactory.getInstance().createEngine().startTogether(0,null,list_ani);}private  class MyPageChangeListener implements ViewPager.OnPageChangeListener {@Overridepublic void onPageScrollStateChanged(int arg0) {status=arg0;}@Overridepublic void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {//判断左右滑方向,这里凭借这个是不准的,需要与status配合(这里加上TouchListener会更好理解,有机会再加吧)int tempPosition=index-position;//加载动画animateNormal(position, positionOffset, positionOffsetPixels, tempPosition);}@Overridepublic void onPageSelected(int arg0) {index=arg0;if(index>0){tv_guide_01.setText(guideString[index-1]);}if(index==list_views.size()-1){layout_look.setVisibility(View.VISIBLE);layout_qq.setVisibility(View.VISIBLE);layout_sina.setVisibility(View.VISIBLE);}else{layout_look.setVisibility(View.GONE);layout_qq.setVisibility(View.GONE);layout_sina.setVisibility(View.GONE);}int height=tv_guide_01.getHeight();int width=tv_guide_01.getWidth();//底部引导文字动画,从下到上,从上到下AnimatorValue c1=new  AnimatorValueImplements(tv_guide_01,"TranslationY",-height/4f,-height/2f,-height*3/4f,(float)-height);c1.getAnimator().setDuration(100);c1.getAnimator().addListener(new Animator.AnimatorListener() {@Overridepublic void onAnimationStart(Animator animator) {}@Overridepublic void onAnimationEnd(Animator animator) {if (index< guideString.length) {tv_guide_01.setText(guideString[index]);} else {tv_guide_01.setText("");}}@Overridepublic void onAnimationCancel(Animator animator) {}@Overridepublic void onAnimationRepeat(Animator animator) {}});ArrayList<AnimatorValue> list=new ArrayList<AnimatorValue>();AnimatorValue c2=new  AnimatorValueImplements(tv_guide_01,"TranslationY",(float)height,height*3/4f,height/2f,height/4f,0);c2.before(c1);c2.getAnimator().setDuration(100);list.add(c1);list.add(c2);//最后一个页面的动画if(index==5){AnimatorValue d1=new  AnimatorValueImplements(layout_qq,"TranslationX",(float)width/2);AnimatorValue d2=new  AnimatorValueImplements(layout_sina,"TranslationX",(float)-width/2);d1.before(c2);d1.getAnimator().setDuration(1000);d2.getAnimator().setDuration(1000);list.add(d1);list.add(d2);ImageView im_0= (ImageView) list_views.get(index).findViewById(R.id.im_0);AnimatorValue e1=new  AnimatorValueImplements(im_0,"TranslationY",-55f);e1.before(d1);e1.getAnimator().setInterpolator(new AccelerateDecelerateInterpolator());e1.getAnimator().setDuration(1000);list.add(e1);}AnimationFactory.getInstance().createEngine().startTogetherByLink(null,list.toArray(new AnimatorValue[list.size()]));}}class MyPagerAdapter extends PagerAdapter {public List<View> mListViews;public MyPagerAdapter(List<View> mListViews) {this.mListViews=mListViews;}@Overridepublic int getItemPosition(Object object) {return POSITION_NONE;}@Overridepublic void destroyItem(View arg0, int arg1, Object arg2) {if(getCount()>1){//第一个页面的逐步显示图标的View,具体就是如前两篇博文写的一样,利用了自己重写的插值器来计算显示位置,缩放率等if(arg1==0){FirstView image = (FirstView)(mListViews.get(arg1).findViewById(R.id.item_image));image.clearimages();}((ViewPager) arg0).removeView(mListViews.get(arg1));}}@Overridepublic void finishUpdate(View arg0) {}@Overridepublic int getCount() {return mListViews.size();}@Overridepublic Object instantiateItem(View arg0, int arg1) {layout= (LinearLayout) mListViews.get(arg1).findViewById(R.id.layout);firImage = (FirstView) (mListViews.get(arg1).findViewById(R.id.item_image));ImageView im_0= (ImageView) mListViews.get(arg1).findViewById(R.id.im_0);ImageView im_1_1= (ImageView) mListViews.get(arg1).findViewById(R.id.im_1_1);ImageView im_1_2= (ImageView) mListViews.get(arg1).findViewById(R.id.im_1_2);ImageView im_1_3= (ImageView) mListViews.get(arg1).findViewById(R.id.im_1_3);ImageView im_2_1= (ImageView) mListViews.get(arg1).findViewById(R.id.im_2_1);ImageView im_3_1= (ImageView) mListViews.get(arg1).findViewById(R.id.im_3_1);ImageView im_3_2= (ImageView) mListViews.get(arg1).findViewById(R.id.im_3_2);ImageView im_3_3= (ImageView) mListViews.get(arg1).findViewById(R.id.im_3_3);//这里推荐使用异步加载ImageLoader等,不然OOM谁也受不了switch (arg1){case 0:layout.setVisibility(View.GONE);firImage.startAnimation();break;case 1:layout.setVisibility(View.VISIBLE);im_0.setBackgroundResource(0);im_1_1.setBackgroundResource(R.drawable.ic_guide_second_01);im_2_1.setBackgroundResource(R.drawable.ic_guide_second_02);im_3_1.setBackgroundResource(R.drawable.ic_guide_second_03);break;case 2:layout.setVisibility(View.VISIBLE);im_0.setBackgroundResource(R.drawable.ic_guide_third_01);im_1_1.setBackgroundResource(R.drawable.ic_guide_third_02);im_2_1.setBackgroundResource(R.drawable.ic_guide_third_03);im_3_1.setBackgroundResource(R.drawable.ic_guide_third_04);break;case 3:layout.setVisibility(View.VISIBLE);im_0.setBackgroundResource(R.drawable.ic_guide_fourth_01);im_1_1.setBackgroundResource(R.drawable.ic_guide_fourth_02);im_2_1.setBackgroundResource(R.drawable.ic_guide_fourth_03);im_3_1.setBackgroundResource(R.drawable.ic_guide_fourth_04);break;case 4:layout.setVisibility(View.VISIBLE);im_0.setBackgroundResource(R.drawable.ic_guide_fifth_01);im_1_1.setBackgroundResource(R.drawable.ic_guide_fifth_02);im_1_2.setBackgroundResource(R.drawable.ic_guide_fifth_03);im_1_3.setBackgroundResource(R.drawable.ic_guide_fifth_04);im_2_1.setBackgroundResource(R.drawable.ic_guide_fifth_05);im_2_1.setScaleX(0.5f);im_3_1.setBackgroundResource(R.drawable.ic_guide_fifth_06);im_3_2.setBackgroundResource(R.drawable.ic_guide_fifth_07);im_3_3.setBackgroundResource(R.drawable.ic_guide_fifth_08);break;case 5:im_0.setBackgroundResource(R.drawable.guide_logo);break;}((ViewPager)arg0).addView(mListViews.get(arg1));return mListViews.get(arg1);}@Overridepublic boolean isViewFromObject(View arg0, Object arg1) {return arg0 == (arg1);}@Overridepublic void restoreState(Parcelable arg0, ClassLoader arg1) {}@Overridepublic Parcelable saveState() {return null;}@Overridepublic void startUpdate(View arg0) {}}private int dip2px(float dpValue){float scale=getResources().getDisplayMetrics().density;return (int) (dpValue*scale+.5f);}}

高仿知乎Android客户端欢迎引导动画相关推荐

  1. 高仿知乎android客户端,仿知乎分享界面

    前言 最近在做一个资讯类的APP,上面需要一个分享功能,项目不大,如果去使用官方的SDK还需要审查之类的,感觉太麻烦.偶然看到知乎的分享界面做得不错,拿到我这个项目中正合适,在网上查了一下资料,使用B ...

  2. 高仿喜马拉雅听Android客户端,Zhumulangma

    ### 注意:请将lib_common下manifest中喜马拉雅key替换为自己的,不然会提示访问超过限制. https://github.com/TanZhiL/Zhumulangma 本项目仅 ...

  3. 高仿优酷Android客户端图片左右滑动(自动切换)

    本例是用ViewPager去做的实现,支持自动滑动和手动滑动,不仅优酷网,实际上有很多商城和门户网站都有类似的实现: 具体思路: 1. 工程中需要添加android-support-v4.jar,才能 ...

  4. 高仿知乎android,Android高仿知乎首页Behavior

    Android自定义Behavior实现跟随手势滑动,显示隐藏标题栏.底部导航栏及悬浮按钮 Android Design包下的CoordinatorLayout是相当重要的一个控件,它让许多动画的实现 ...

  5. 高仿陌陌android+gradle 客户端 源代码含IM即时通信UI

    高仿陌陌android客户端包含 动态.留言本.相册.IM即时聊天等功能, 相关技术: 使用rxperssion 进行权限的动态申请. 使用butterknife将xml元素绑定带对象 源码开源,地址 ...

  6. android仿疯狂猜图源码,Android开发实现高仿优酷的客户端图片左右滑动切换功能实例【附源码下载】...

    本文实例讲述了Android开发实现高仿优酷的客户端图片左右滑动切换功能.分享给大家供大家参考,具体如下: 本例是用ViewPager去做的实现,支持自动滑动和手动滑动,不仅优酷网,实际上有很多商城和 ...

  7. android 仿网易标签切换,高仿网易云音乐客户端的Home页面切换Tabhost-IT蓝豹

    1.高仿网易云音乐客户端的Home页面切换Tabhost 高仿网易云音乐客户端的Home页面切换Tabhost,并且三角形是透明的, 实现方式,自定义AnimTabsView继承 RelativeLa ...

  8. android 开机动画 渐变,[Parallax Animation]实现知乎 Android 客户端启动页视差滚动效果...

    前言 Parallax Scrolling (视差滚动),是一种常见的动画效果.视差一词来源于天文学,但在日常生活中也有它的身影.在疾驰的动车上看风景时,会发现越是离得近的,相对运动速度越快,而远处的 ...

  9. 实现知乎 Android 客户端启动页视差滚动效果

    http://ryanhoo.github.io/blog/2014/07/16/step-by-step-implement-parallax-animation-for-splash-screen ...

最新文章

  1. ie6下常见的bug 调整页面兼容性
  2. Ubuntu下常用但是我容易忘记的命令总结(未完待续)
  3. Java与Excel的交互!-
  4. 【Android 插件化】VirtualApp 接入 ( 安装 APK 插件应用 | 启动插件 APK 应用 | MainActivity 安装启动插件完整代码 )
  5. 【配置】成本组件结构定义(OKTZ)
  6. Ubuntu下Topcoder配置
  7. Underscore.js 的模板功能
  8. 产品经理学SQL—前言
  9. 安装pytorch步骤
  10. CString转化问题
  11. php 框架效率测试,2017 非标准 PHP 框架性能测试比较
  12. 解决centos6.4 启动dell omsa 失败
  13. 几个常用的dos命令
  14. JakartaEE 文件的上传和下载
  15. 配置RADIUS服务器
  16. win7万能声卡驱动_黑苹果AppleALC声卡驱动教程详解
  17. 【硬件测评】电脑测评工具箱及方法汇总
  18. 【论文解读】文本分类上分利器:Bert微调trick大全
  19. Nginx证书配置:cer文件和jks文件转nginx证书.crt和key文件
  20. python 代理ip池_GitHub - xuan525/proxy_pool: Python爬虫代理IP池(proxy pool)

热门文章

  1. cocos2d-x 从win32到android移植的全套解决方案
  2. 共享充电宝方案原理,具体部件组成以及主控MUC参数
  3. Launching app Install failed. Installation failed <a href=‘rerun‘>Rerun</a>
  4. 非线性规划与KTT(一)
  5. 由KTT展开的一系列知识点
  6. mx450属于什么档次的显卡
  7. IP地址和服务器之间的联系,都了解吗?
  8. WeX5 APP发布及版本升级注意事项
  9. 常见apn类型说明及配置
  10. JTS Java空间几何计算、距离、最近点、subLine等 稳健的一比,持续更新中