android系列微谈一之——仿微信6.0左右滑动渐变切换效果

来源:互联网 发布:哭声剧情解析 知乎 编辑:程序博客网 时间:2024/05/21 14:02
[java] view plaincopyprint?
  1. <pre name="code" class="java">  

  

----------------------------------------------------------------------------------------------------------介绍:BottomMenuSlideGradientSwipe是一个仿微信6.0左右滑动渐变切换效果的demo,特分享与大家探讨邮箱:lijunhuayc@sina.com QQ:190951132GitHub账户:lijunhuayc[目前上面只有一个自己写的自定义AlertDialog对话框,有兴趣的朋友可以看一下,当然肯定没得前段时间出来的那个专门的动画对话框好哈]群里很多网友多次讨论过新版微信6.0的滑动渐变导航[底部菜单渐变切换]的效果怎么做的,今儿个空了在网上搜了一下,几乎没搜到啥有用信息,唯独有一个说的是用高斯函数对图片进行渐变显隐藏[通过透明度],但这并不能达到效果。你是不是也想知道微信开发者是怎么实现的呢?那么请往下看……

针对于此问题,我特地自己来实现此效果。

先看效果图:

  

内容左右滑动我们可以用很成功的JazzyViewPager来实现,它自带多种动画,其中有一个方法animateFade()就是控制渐变的,但它受到一个属性mFadeEnabled的影响,所以初始化的时候要确保mFadeEnabled属性

的值为true

首先介绍一下使用到的开源库

master-JazzyViewPager主要就是用滑动渐变的viewpager

https://github.com/jfeinstein10/JazzyViewPager

NineOldAndroids-library超经典的一个动画库

https://github.com/JakeWharton/NineOldAndroids

----------------------------------------------------------------------------------------------------------

eclipse新建一个项目BottomMenuSlideGradientSwipe

1因为此实现需要修改一点点JazzyViewpager类的源码,所以这里引用方式是直接将master-JazzyViewPager下的所有资源文件和类文件拷贝到项目对应目录下

注意:jazzyviewpager的资源有好几个attrs.xmlcolor.xmlstrings.xml 这几个都别忘记了

2将NineOldAndroids-library的jar文件拷贝到libs目录下

3新建一个类MainActivity继承自Activity

先看看布局文件

----------------------------------------------------暂停了一下,唉,开始错了点小错误,现在搞定了。完美运行perfect---------哇咔咔咔咔-----------------------------------

先看布局文件:

activity_main.xml

[java] view plaincopyprint?
  1. <pre name="code" class="java"><span style="font-family: Arial, Helvetica, sans-serif;"><TabHost xmlns:android="http://schemas.android.com/apk/res/android"</span>  
[java] view plaincopyprint?
  1. android:id="@android:id/tabhost"  
  2. android:layout_width="fill_parent"  
  3. android:layout_height="fill_parent" >  
  4.   
  5. <LinearLayout  
  6.     android:layout_width="match_parent"  
  7.     android:layout_height="match_parent"  
  8.     android:orientation="vertical" >  
  9.   
  10.     <FrameLayout  
  11.         android:id="@android:id/tabcontent"  
  12.         android:layout_width="match_parent"  
  13.         android:layout_height="0dp"  
  14.         android:layout_weight="1"  
  15.         android:background="#FFFFFF"  
  16.         android:visibility="gone" >  
  17.     </FrameLayout>  
  18.   
  19.     <com.jfeinstein.jazzyviewpager.JazzyViewPager  
  20.         xmlns:app="http://schemas.android.com/apk/res/com.ycg.bottommenuslidegradientswipe"  
  21.         android:id="@+id/jazzyPager"  
  22.         app:style="standard"  
  23.         android:layout_width="match_parent"  
  24.         android:layout_height="0dp"  
  25.         android:layout_weight="1" />  
  26.   
  27.     <TabWidget  
  28.         android:id="@android:id/tabs"  
  29.         android:layout_width="match_parent"  
  30.         android:layout_height="50dp"  
  31.         android:background="@drawable/main_tabwidget_background"  
  32.         android:visibility="visible" />  
  33. </LinearLayout>  
  34.   
  35. /TabHost>  




说明:将tabhost用于显示内容的framelayout隐藏掉,然后用一个viewpager来代替 [此处用的是开源的 JazzyViewPager ,它自带很多滑动动画]



main_tabwidget_layout.xml

[html] view plaincopyprint?
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:layout_width="match_parent"  
  4.     android:layout_height="match_parent"  
  5.     android:padding="5dp" >  
  6.   
  7.     <LinearLayout  
  8.         android:id="@+id/normalLayout"  
  9.         android:layout_width="match_parent"  
  10.         android:layout_height="match_parent"  
  11.         android:gravity="center"  
  12.         android:orientation="vertical" >  
  13.   
  14.         <ImageView  
  15.             android:id="@+id/normalImg"  
  16.             android:layout_width="wrap_content"  
  17.             android:layout_height="wrap_content"  
  18.             android:src="@drawable/scan_book" />  
  19.   
  20.         <TextView  
  21.             android:id="@+id/normalTV"  
  22.             android:layout_width="wrap_content"  
  23.             android:layout_height="wrap_content"  
  24.             android:text="扫书" />  
  25.     </LinearLayout>  
  26.   
  27.     <LinearLayout  
  28.         android:id="@+id/selectedLayout"  
  29.         android:layout_width="match_parent"  
  30.         android:layout_height="match_parent"  
  31.         android:gravity="center"  
  32.         android:orientation="vertical" >  
  33.   
  34.         <ImageView  
  35.             android:id="@+id/selectedImage"  
  36.             android:layout_width="wrap_content"  
  37.             android:layout_height="wrap_content"  
  38.             android:src="@drawable/scan_book_hl" />  
  39.   
  40.         <TextView  
  41.             android:id="@+id/selectedTV"  
  42.             android:layout_width="wrap_content"  
  43.             android:layout_height="wrap_content"  
  44.             android:text="扫书"  
  45.             android:textColor="#00FF00"  
  46.             android:textSize="20sp" />  
  47.     </LinearLayout>  
  48.   
  49. </RelativeLayout>  

说明:此布局文件是tabwidget 的tab项的布局[我们tabwidget的tab用自定义布局实现,后面会详细说明]

布局中有一个normalLayout 是tab未选中状态 ,一个selectedLayout是tab的选中状态

注意了:有人会问,为什么不用两张图来实现? 问的好,这就是这篇文章的关键点,详情请继续深入......


我们先修改一下啊JazzyViewpager.java 的源码

打开java文件,给jazzyviewpager类添加如下静态内部接口、属性和方法:

[java] view plaincopyprint?
  1. public static interface SlideCallback {  
  2.     void callBack(int position, float positionOffset);  
  3. }  
  4. private SlideCallback slideCallback = null;  
  5. public void setSlideCallBack(SlideCallback slideCallBack) {  
  6.     this.slideCallback = slideCallBack;  
  7. }  
用static的原因我相信你看的懂,避免引用的时候去调用外部类的实例。

SlideCallback 接口的作用是在pager滑动的过程中回调改变tab的渐变显示


接着找到 protected void animateFade(View left, View right, float positionOffset) 方法并修改一下


原来的:

[java] view plaincopyprint?
  1. protected void animateFade(View left, View right, float positionOffset) {  
  2.     if (left != null) {  
  3.         ViewHelper.setAlpha(left, 1 - positionOffset);  
  4.     }  
  5.     if (right != null) {  
  6.         ViewHelper.setAlpha(right, positionOffset);  
  7.     }  
  8. }  



修改后的:

[java] view plaincopyprint?
  1. protected void animateFade(View left, View right, float positionOffset, int position) {  
  2.     if (left != null) {  
  3.         ViewHelper.setAlpha(left, 1 - positionOffset);  
  4.         if (slideCallback != null) {  
  5.             slideCallback.callBack(position, 1 - positionOffset);  
  6.         }  
  7.     }  
  8.     if (right != null) {  
  9.         ViewHelper.setAlpha(right, positionOffset);  
  10.         if (slideCallback != null) {  
  11.             slideCallback.callBack(position + 1, positionOffset);  
  12.         }  
  13.     }  
  14. }  


animateFade方法的作用就是在页面切换的过程中使用 NineOldAndroids 库设置透明渐变,所以我们就在它渐变的地方调用我们的回调函数来改变界面tab的渐变

animateFade调用的地方只有一个 在onPageScrolled 方法中


将调用方式

animateFade(mLeft, mRight, effectOffset);
改为:animateFade(mLeft, mRight, effectOffset, position); 参数position即为onPageScrolled方法的position参数


JazzyViewpager修改完毕

--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

下面开始界面activity的编写:


这里介绍一个工具库:x-utils-master  一个实现了android中 Ioc 开源库,里面主要有四个类 详细转--github

详情请点击我跳转到另一篇博客【xUtils的使用】

备用连接


----------------------------------------------


MainActivity:如下


完整代码如下:

[java] view plaincopyprint?
  1. package com.ycg.bottommenuslidegradientswipe;  
  2.   
  3. import java.util.ArrayList;  
  4. import java.util.HashMap;  
  5. import java.util.List;  
  6. import java.util.Map;  
  7.   
  8. import android.app.ActionBar;  
  9. import android.app.Activity;  
  10. import android.content.Context;  
  11. import android.graphics.Color;  
  12. import android.os.Bundle;  
  13. import android.support.v4.view.PagerAdapter;  
  14. import android.support.v4.view.ViewPager.OnPageChangeListener;  
  15. import android.view.Gravity;  
  16. import android.view.LayoutInflater;  
  17. import android.view.Menu;  
  18. import android.view.MenuItem;  
  19. import android.view.View;  
  20. import android.view.ViewGroup;  
  21. import android.view.ViewGroup.LayoutParams;  
  22. import android.widget.ImageView;  
  23. import android.widget.TabHost;  
  24. import android.widget.TabHost.OnTabChangeListener;  
  25. import android.widget.TextView;  
  26.   
  27. import com.jfeinstein.jazzyviewpager.JazzyViewPager;  
  28. import com.jfeinstein.jazzyviewpager.JazzyViewPager.SlideCallback;  
  29. import com.jfeinstein.jazzyviewpager.JazzyViewPager.TransitionEffect;  
  30. import com.jfeinstein.jazzyviewpager.OutlineContainer;  
  31. import com.lidroid.xutils.ViewUtils;  
  32. import com.lidroid.xutils.view.annotation.ViewInject;  
  33. import com.nineoldandroids.view.ViewHelper;  
  34.   
  35. public class MainActivity extends Activity {  
  36.     @ViewInject(R.id.jazzyPager)  
  37.     private JazzyViewPager jazzyPager;  
  38.     List<Map<String, View>> tabViews = new ArrayList<Map<String, View>>();  
  39.     Context context;  
  40.     public TabHost tabHost;  
  41.   
  42.     @Override  
  43.     protected void onCreate(Bundle savedInstanceState) {  
  44.         super.onCreate(savedInstanceState);  
  45.         setContentView(R.layout.activity_main);  
  46.         ViewUtils.inject(this);  
  47.         context = this;  
  48.         ActionBar actionBar = getActionBar();  
  49.         actionBar.setTitle("BottomMenuSlideGradientSwipe");  
  50.         // --------------------  
  51.         tabHost = (TabHost) findViewById(android.R.id.tabhost);  
  52.         tabHost.setup();  
  53.         tabHost.addTab(tabHost.newTabSpec("0").setIndicator(createTab("主页"0)).setContent(android.R.id.tabcontent));  
  54.         tabHost.addTab(tabHost.newTabSpec("1").setIndicator(createTab("统计"1)).setContent(android.R.id.tabcontent));  
  55.         tabHost.addTab(tabHost.newTabSpec("2").setIndicator(createTab("消息"2)).setContent(android.R.id.tabcontent));  
  56.         tabHost.addTab(tabHost.newTabSpec("3").setIndicator(createTab("设置"3)).setContent(android.R.id.tabcontent));  
  57.         // 点击tabHost 来切换不同的消息  
  58.         tabHost.setOnTabChangedListener(new OnTabChangeListener() {  
  59.             @Override  
  60.             public void onTabChanged(String tabId) {  
  61.                 int index = Integer.parseInt(tabId);  
  62.                 setTabSelectedState(index, 4);  
  63.                 tabHost.getTabContentView().setVisibility(View.GONE);// 隐藏content  
  64.                 switch (index) {  
  65.                     case 0:  
  66.                         break;  
  67.                     case 1:  
  68.                         break;  
  69.                     case 2:  
  70.                         break;  
  71.                     case 3:  
  72.                         break;  
  73.                 }  
  74.             }  
  75.         });  
  76.         tabHost.setCurrentTab(0);  
  77.         initJazzyPager(TransitionEffect.Standard);  
  78.     }  
  79.   
  80.     /** 
  81.      * 动态创建 TabWidget 的Tab项,并设置normalLayout的alpha为1,selectedLayout的alpha为0[显示normal,隐藏selected] 
  82.      * @param tabLabelText 
  83.      * @param tabIndex 
  84.      * @return 
  85.      */  
  86.     private View createTab(String tabLabelText, int tabIndex) {  
  87.         View tabIndicator = LayoutInflater.from(this).inflate(R.layout.main_tabwidget_layout, null);  
  88.         ImageView normalImg = (ImageView) tabIndicator.findViewById(R.id.normalImg);  
  89.         ImageView selectedImg = (ImageView) tabIndicator.findViewById(R.id.selectedImage);  
  90.         TextView normalTV = (TextView) tabIndicator.findViewById(R.id.normalTV);  
  91.         TextView selectedTV = (TextView) tabIndicator.findViewById(R.id.selectedTV);  
  92.         normalTV.setText(tabLabelText);  
  93.         selectedTV.setText(tabLabelText);  
  94.         switch (tabIndex) {  
  95.             case 0:  
  96.                 normalImg.setImageResource(R.drawable.scan_book);  
  97.                 selectedImg.setImageResource(R.drawable.scan_book_hl);  
  98.                 break;  
  99.             case 1:  
  100.                 normalImg.setImageResource(R.drawable.scan_qr);  
  101.                 selectedImg.setImageResource(R.drawable.scan_qr_hl);  
  102.                 break;  
  103.             case 2:  
  104.                 normalImg.setImageResource(R.drawable.scan_street);  
  105.                 selectedImg.setImageResource(R.drawable.scan_street_hl);  
  106.                 break;  
  107.             case 3:  
  108.                 normalImg.setImageResource(R.drawable.scan_word);  
  109.                 selectedImg.setImageResource(R.drawable.scan_word_hl);  
  110.                 break;  
  111.         }  
  112.         View normalLayout = tabIndicator.findViewById(R.id.normalLayout);  
  113.         normalLayout.setAlpha(1f);// 透明度显示  
  114.         View selectedLayout = tabIndicator.findViewById(R.id.selectedLayout);  
  115.         selectedLayout.setAlpha(0f);// 透明的隐藏  
  116.         Map<String, View> map = new HashMap<String, View>();  
  117.         map.put("normal", normalLayout);  
  118.         map.put("selected", selectedLayout);  
  119.         tabViews.add(map);  
  120.         return tabIndicator;  
  121.     }  
  122.   
  123.     /** 
  124.      * 设置tab状态选中 
  125.      * @param index 
  126.      */  
  127.     private void setTabSelectedState(int index, int tabCount) {  
  128.         for (int i = 0; i < tabCount; i++) {  
  129.             if (i == index) {  
  130.                 tabViews.get(i).get("normal").setAlpha(0f);  
  131.                 tabViews.get(i).get("selected").setAlpha(1f);  
  132.             } else {  
  133.                 tabViews.get(i).get("normal").setAlpha(1f);  
  134.                 tabViews.get(i).get("selected").setAlpha(0f);  
  135.             }  
  136.         }  
  137.         jazzyPager.setCurrentItem(index, false);// false表示 代码切换 pager  
  138.                                                 // 的时候不带scroll动画  
  139.     }  
  140.   
  141.     @Override  
  142.     protected void onResume() {  
  143.         super.onResume();  
  144.         setTabSelectedState(tabHost.getCurrentTab(), 4);  
  145.     }  
  146.       
  147.     private void initJazzyPager(TransitionEffect effect) {  
  148.         jazzyPager.setTransitionEffect(effect);  
  149.         jazzyPager.setAdapter(new MainAdapter());  
  150.         jazzyPager.setPageMargin(30);  
  151.         jazzyPager.setFadeEnabled(true);  
  152.         jazzyPager.setSlideCallBack(new SlideCallback() {  
  153.             @Override  
  154.             public void callBack(int position, float positionOffset) {  
  155.                 Map<String, View> map = tabViews.get(position);  
  156.                 ViewHelper.setAlpha(map.get("selected"), positionOffset);  
  157.                 ViewHelper.setAlpha(map.get("normal"), 1 - positionOffset);  
  158.             }  
  159.         });  
  160.         jazzyPager.setOnPageChangeListener(new OnPageChangeListener() {  
  161.             @Override  
  162.             public void onPageSelected(int position) {  
  163.                 tabHost.setCurrentTab(position);  
  164.             }  
  165.   
  166.             @Override  
  167.             public void onPageScrolled(int paramInt1, float paramFloat, int paramInt2) {  
  168.             }  
  169.   
  170.             @Override  
  171.             public void onPageScrollStateChanged(int paramInt) {  
  172.             }  
  173.         });  
  174.     }  
  175.   
  176.     @Override  
  177.     public boolean onCreateOptionsMenu(Menu menu) {  
  178.         menu.add("Toggle Fade");  
  179.         String[] effects = this.getResources().getStringArray(R.array.jazzy_effects);  
  180.         for (String effect : effects)  
  181.             menu.add(effect);  
  182.         return true;  
  183.     }  
  184.   
  185.     @Override  
  186.     public boolean onOptionsItemSelected(MenuItem item) {  
  187.         if (item.getTitle().toString().equals("Toggle Fade")) {  
  188.             jazzyPager.setFadeEnabled(!jazzyPager.getFadeEnabled());  
  189.         } else {  
  190.             TransitionEffect effect = TransitionEffect.valueOf(item.getTitle().toString());  
  191.             initJazzyPager(effect);  
  192.         }  
  193.         return true;  
  194.     }  
  195.   
  196.     private class MainAdapter extends PagerAdapter {  
  197.         @Override  
  198.         public Object instantiateItem(ViewGroup container, final int position) {  
  199.             TextView text = new TextView(MainActivity.this);  
  200.             text.setGravity(Gravity.CENTER);  
  201.             text.setTextSize(30);  
  202.             text.setTextColor(Color.WHITE);  
  203.             text.setText("Page " + position);  
  204.             text.setPadding(30303030);  
  205.             int bg = Color.rgb((int) Math.floor(Math.random() * 128) + 64, (int) Math.floor(Math.random() * 128) + 64, (int) Math.floor(Math.random() * 128) + 64);  
  206.             text.setBackgroundColor(bg);  
  207.             container.addView(text, LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);  
  208.             jazzyPager.setObjectForPosition(text, position);  
  209.             return text;  
  210.         }  
  211.   
  212.         @Override  
  213.         public void destroyItem(ViewGroup container, int position, Object obj) {  
  214.             container.removeView(jazzyPager.findViewFromObject(position));  
  215.         }  
  216.   
  217.         @Override  
  218.         public int getCount() {  
  219.             return 4;  
  220.         }  
  221.   
  222.         @Override  
  223.         public boolean isViewFromObject(View view, Object obj) {  
  224.             if (view instanceof OutlineContainer) {  
  225.                 return ((OutlineContainer) view).getChildAt(0) == obj;  
  226.             } else {  
  227.                 return view == obj;  
  228.             }  
  229.         }  
  230.     }  
  231.   
  232. }  

成员变量:

@ViewInject(R.id.jazzyPager)
private JazzyViewPager jazzyPager;   这里采用了注解来初始化view,[xUtils的功能,以后再也不用写findviewbyid了] 

 List<Map<String, View>> tabViews 是给pagerAdapter提供资源的


oncreate方法:

ViewUtils.inject(this);//必须在setContentView(R.layout.activity_main);之后就调用,否则可能会出现上面注解初始化失败,导致nullpointexcepter异常

接下来的

[java] view plaincopyprint?
  1. tabHost = (TabHost) findViewById(android.R.id.tabhost);  
  2. tabHost.setup();  
  3. tabHost.addTab(tabHost.newTabSpec("0").setIndicator(createTab("主页"0)).setContent(android.R.id.tabcontent));  
  4. tabHost.addTab(tabHost.newTabSpec("1").setIndicator(createTab("统计"1)).setContent(android.R.id.tabcontent));  
  5. tabHost.addTab(tabHost.newTabSpec("2").setIndicator(createTab("消息"2)).setContent(android.R.id.tabcontent));  
  6. tabHost.addTab(tabHost.newTabSpec("3").setIndicator(createTab("设置"3)).setContent(android.R.id.tabcontent));  
  7. // 点击tabHost 来切换不同的消息  
  8. tabHost.setOnTabChangedListener(new OnTabChangeListener() {  
  9.     @Override  
  10.     public void onTabChanged(String tabId) {  
  11.         int index = Integer.parseInt(tabId);  
  12.         setTabSelectedState(index, 4);  
  13.         tabHost.getTabContentView().setVisibility(View.GONE);// 隐藏content  
  14.     }  
  15. });  
  16. tabHost.setCurrentTab(0);  
  17. initJazzyPager(TransitionEffect.Standard);  
添加tab的时候,


setContent有三个,我们用第一个【第三个没用过不知道,第二个是以前用activitygroup的时候用的现在不需要】,参数设置为前面xml中隐藏掉的fragmentlayout,它的id是用的系统提供的id,注意引用方式androud.R.id.tabcontent


这里有个方法setTabSelectedState(int,int) 的作用是设置tab的显示状态为选中状态[我们约定normalLayout未选中,selectedLayout选中][两者的显示/隐藏不通过setVisiblty来设置,而是通过setAlpha来控制吗,以便达到我们要的渐变效果]


[java] view plaincopyprint?
  1. /** 
  2.  * 设置tab状态选中 
  3.  * @param index 
  4.  */  
  5. private void setTabSelectedState(int index, int tabCount) {  
  6.     for (int i = 0; i < tabCount; i++) {  
  7.         if (i == index) {  
  8.             tabViews.get(i).get("normal").setAlpha(0f);  
  9.             tabViews.get(i).get("selected").setAlpha(1f);  
  10.         } else {  
  11.             tabViews.get(i).get("normal").setAlpha(1f);  
  12.             tabViews.get(i).get("selected").setAlpha(0f);  
  13.         }  
  14.     }  
  15.     jazzyPager.setCurrentItem(index, false);// false表示 代码切换 pager 的时候不带scroll动画  
  16. }  
注意:代码切换pager的时候如果传入了第二个参数的话,true代表有切换动画,false代表取消切换动画


接下来在初始化tabhoust后调用一下设置currentTab为0



然后是初始化JazzyPager  默认是用标准动画,就是普通的左右滑动

重点在:

[java] view plaincopyprint?
  1. jazzyPager.setPageMargin(30);  
  2. jazzyPager.setFadeEnabled(true);  
  3. jazzyPager.setSlideCallBack(new SlideCallback() {  
  4.     @Override  
  5.     public void callBack(int position, float positionOffset) {  
  6.         Map<String, View> map = tabViews.get(position);  
  7.         ViewHelper.setAlpha(map.get("selected"), positionOffset);  
  8.         ViewHelper.setAlpha(map.get("normal"), 1 - positionOffset);  
  9.     }  
  10. });  
  11. jazzyPager.setOnPageChangeListener(new OnPageChangeListener() {  
  12.     @Override  
  13.     public void onPageSelected(int position) {  
  14.         tabHost.setCurrentTab(position);  
  15.     }  
  16.   
  17.     @Override  
  18.     public void onPageScrolled(int paramInt1, float paramFloat, int paramInt2) {  
  19.     }  
  20.   
  21.     @Override  
  22.     public void onPageScrollStateChanged(int paramInt) {  
  23.     }  
  24. });  

重点来了:

还记得上面的修改的animateFade方法么

回调函数中通过jazzyviewpager的animateFade方法内调用回调函数传递过来的position去获取tabView,然后设置对应的normalLayout和selectedLayout的alpha值即可


pagerAdapter内给每个页面构造了一个文本框,没啥说的,看看代码就懂了,这里就不说了


代码:

[java] view plaincopyprint?
  1. @Override  
  2. protected void onResume() {  
  3.     super.onResume();  
  4.     setTabSelectedState(tabHost.getCurrentTab(), 4);  
  5. }  
当页面滑动的过程中回到桌面后再进入APP,底部的tab会出现文章开头的第二幅图的样纸,有一个tab还是半隐的状态,onResume中加上上面的一行可以解决


onCreateOptionsMenu 和onOptionsItemSelected 是切换JazzyViewPager页面的滑动动画的菜单。没啥好说的,看看就懂



-----------------------------------------------------------------------------------------------------------------------------------------------------------

就这么点代码实现了微信6.0的滑动渐变效果有木有啊?~~喀喀喀 ^_^ ~~~


源代码打包[点我下载] 


我的资源列表


转载请注明出处:http://blog.csdn.net/lijunhuayc/article/details/40543237









0 0