最近终于从繁忙的网络爬虫项目中解脱出来,回到久违的Android开发岗位,有时间研究Android 4.0的一些新特性,例如Fragment和ViewPager,参考了一些他人的代码,做出来了Google Play 首页的效果,在这里跟大家分享一下!


[java]view plaincopy

  1. packagecom.example.playtabtest;

  2. importandroid.os.Bundle;

  3. importandroid.support.v4.app.Fragment;

  4. importandroid.support.v4.app.FragmentActivity;

  5. importandroid.support.v4.app.FragmentManager;

  6. importandroid.support.v4.app.FragmentPagerAdapter;

  7. importandroid.support.v4.view.ViewPager;

  8. importandroid.support.v4.view.ViewPager.OnPageChangeListener;

  9. importandroid.util.DisplayMetrics;

  10. importandroid.view.LayoutInflater;

  11. importandroid.view.Menu;

  12. importandroid.view.ViewGroup.LayoutParams;

  13. importandroid.view.animation.LinearInterpolator;

  14. importandroid.view.animation.TranslateAnimation;

  15. importandroid.widget.ImageView;

  16. importandroid.widget.RadioButton;

  17. importandroid.widget.RadioGroup;

  18. importandroid.widget.RadioGroup.OnCheckedChangeListener;

  19. importandroid.widget.RelativeLayout;

  20. importcom.example.playtabtest.fragment.CommonUIFragment;

  21. importcom.example.playtabtest.fragment.LaunchUIFragment;

  22. importcom.example.playtabtest.view.SyncHorizontalScrollView;

  23. publicclassMainActivityextendsFragmentActivity{

  24. publicstaticfinalStringARGUMENTS_NAME="arg";

  25. privateRelativeLayoutrl_nav;

  26. privateSyncHorizontalScrollViewmHsv;

  27. privateRadioGrouprg_nav_content;

  28. privateImageViewiv_nav_indicator;

  29. privateImageViewiv_nav_left;

  30. privateImageViewiv_nav_right;

  31. privateViewPagermViewPager;

  32. privateintindicatorWidth;

  33. publicstaticString[]tabTitle={"选项1","选项2","选项3","选项4","选项5"};//标题

  34. privateLayoutInflatermInflater;

  35. privateTabFragmentPagerAdaptermAdapter;

  36. privateintcurrentIndicatorLeft=0;

  37. @Override

  38. protectedvoidonCreate(BundlesavedInstanceState){

  39. super.onCreate(savedInstanceState);

  40. setContentView(R.layout.activity_main);

  41. findViewById();

  42. initView();

  43. setListener();

  44. }

  45. privatevoidsetListener(){

  46. mViewPager.setOnPageChangeListener(newOnPageChangeListener(){

  47. @Override

  48. publicvoidonPageSelected(intposition){

  49. if(rg_nav_content!=null&&rg_nav_content.getChildCount()>position){

  50. ((RadioButton)rg_nav_content.getChildAt(position)).performClick();

  51. }

  52. }

  53. @Override

  54. publicvoidonPageScrolled(intarg0,floatarg1,intarg2){

  55. }

  56. @Override

  57. publicvoidonPageScrollStateChanged(intarg0){

  58. }

  59. });

  60. rg_nav_content.setOnCheckedChangeListener(newOnCheckedChangeListener(){

  61. @Override

  62. publicvoidonCheckedChanged(RadioGroupgroup,intcheckedId){

  63. if(rg_nav_content.getChildAt(checkedId)!=null){

  64. TranslateAnimationanimation=newTranslateAnimation(

  65. currentIndicatorLeft,

  66. ((RadioButton)rg_nav_content.getChildAt(checkedId)).getLeft(),0f,0f);

  67. animation.setInterpolator(newLinearInterpolator());

  68. animation.setDuration(100);

  69. animation.setFillAfter(true);

  70. //执行位移动画

  71. iv_nav_indicator.startAnimation(animation);

  72. mViewPager.setCurrentItem(checkedId);//ViewPager跟随一起切换

  73. //记录当前下标的距最左侧的距离

  74. currentIndicatorLeft=((RadioButton)rg_nav_content.getChildAt(checkedId)).getLeft();

  75. mHsv.smoothScrollTo(

  76. (checkedId>1?((RadioButton)rg_nav_content.getChildAt(checkedId)).getLeft():0)-((RadioButton)rg_nav_content.getChildAt(2)).getLeft(),0);

  77. }

  78. }

  79. });

  80. }

  81. privatevoidinitView(){

  82. DisplayMetricsdm=newDisplayMetrics();

  83. getWindowManager().getDefaultDisplay().getMetrics(dm);

  84. indicatorWidth=dm.widthPixels/4;

  85. LayoutParamscursor_Params=iv_nav_indicator.getLayoutParams();

  86. cursor_Params.width=indicatorWidth;//初始化滑动下标的宽

  87. iv_nav_indicator.setLayoutParams(cursor_Params);

  88. mHsv.setSomeParam(rl_nav,iv_nav_left,iv_nav_right,this);

  89. //获取布局填充器

  90. mInflater=(LayoutInflater)this.getSystemService(LAYOUT_INFLATER_SERVICE);

  91. //另一种方式获取

  92. //LayoutInflatermInflater=LayoutInflater.from(this);

  93. initNavigationHSV();

  94. mAdapter=newTabFragmentPagerAdapter(getSupportFragmentManager());

  95. mViewPager.setAdapter(mAdapter);

  96. }

  97. privatevoidinitNavigationHSV(){

  98. rg_nav_content.removeAllViews();

  99. for(inti=0;i<tabTitle.length;i++){

  100. RadioButtonrb=(RadioButton)mInflater.inflate(R.layout.nav_radiogroup_item,null);

  101. rb.setId(i);

  102. rb.setText(tabTitle[i]);

  103. rb.setLayoutParams(newLayoutParams(indicatorWidth,

  104. LayoutParams.MATCH_PARENT));

  105. rg_nav_content.addView(rb);

  106. }

  107. }

  108. privatevoidfindViewById(){

  109. rl_nav=(RelativeLayout)findViewById(R.id.rl_nav);

  110. mHsv=(SyncHorizontalScrollView)findViewById(R.id.mHsv);

  111. rg_nav_content=(RadioGroup)findViewById(R.id.rg_nav_content);

  112. iv_nav_indicator=(ImageView)findViewById(R.id.iv_nav_indicator);

  113. iv_nav_left=(ImageView)findViewById(R.id.iv_nav_left);

  114. iv_nav_right=(ImageView)findViewById(R.id.iv_nav_right);

  115. mViewPager=(ViewPager)findViewById(R.id.mViewPager);

  116. }

  117. @Override

  118. publicbooleanonCreateOptionsMenu(Menumenu){

  119. getMenuInflater().inflate(R.menu.main,menu);

  120. returntrue;

  121. }

  122. publicstaticclassTabFragmentPagerAdapterextendsFragmentPagerAdapter{

  123. publicTabFragmentPagerAdapter(FragmentManagerfm){

  124. super(fm);

  125. }

  126. @Override

  127. publicFragmentgetItem(intarg0){

  128. Fragmentft=null;

  129. switch(arg0){

  130. case0:

  131. ft=newLaunchUIFragment();

  132. break;

  133. default:

  134. ft=newCommonUIFragment();

  135. Bundleargs=newBundle();

  136. args.putString(ARGUMENTS_NAME,tabTitle[arg0]);

  137. ft.setArguments(args);

  138. break;

  139. }

  140. returnft;

  141. }

  142. @Override

  143. publicintgetCount(){

  144. returntabTitle.length;

  145. }

  146. }

  147. }




SyncHorizontalScrollView.java


[java]view plaincopy

  1. packagecom.example.playtabtest.view;

  2. importandroid.app.Activity;

  3. importandroid.content.Context;

  4. importandroid.util.AttributeSet;

  5. importandroid.util.DisplayMetrics;

  6. importandroid.view.View;

  7. importandroid.widget.HorizontalScrollView;

  8. importandroid.widget.ImageView;

  9. publicclassSyncHorizontalScrollViewextendsHorizontalScrollView{

  10. privateViewview;

  11. privateImageViewleftImage;

  12. privateImageViewrightImage;

  13. privateintwindowWitdh=0;

  14. privateActivitymContext;

  15. publicvoidsetSomeParam(Viewview,ImageViewleftImage,

  16. ImageViewrightImage,Activitycontext){

  17. this.mContext=context;

  18. this.view=view;

  19. this.leftImage=leftImage;

  20. this.rightImage=rightImage;

  21. DisplayMetricsdm=newDisplayMetrics();

  22. this.mContext.getWindowManager().getDefaultDisplay().getMetrics(dm);

  23. windowWitdh=dm.widthPixels;

  24. }

  25. publicSyncHorizontalScrollView(Contextcontext){

  26. super(context);

  27. //TODOAuto-generatedconstructorstub

  28. }

  29. publicSyncHorizontalScrollView(Contextcontext,AttributeSetattrs){

  30. super(context,attrs);

  31. //TODOAuto-generatedconstructorstub

  32. }

  33. //显示和隐藏左右两边的箭头

  34. publicvoidshowAndHideArrow(){

  35. if(!mContext.isFinishing()&&view!=null){

  36. this.measure(0,0);

  37. if(windowWitdh>=this.getMeasuredWidth()){

  38. leftImage.setVisibility(View.GONE);

  39. rightImage.setVisibility(View.GONE);

  40. }else{

  41. if(this.getLeft()==0){

  42. leftImage.setVisibility(View.GONE);

  43. rightImage.setVisibility(View.VISIBLE);

  44. }elseif(this.getRight()==this.getMeasuredWidth()

  45. -windowWitdh){

  46. leftImage.setVisibility(View.VISIBLE);

  47. rightImage.setVisibility(View.GONE);

  48. }else{

  49. leftImage.setVisibility(View.VISIBLE);

  50. rightImage.setVisibility(View.VISIBLE);

  51. }

  52. }

  53. }

  54. }

  55. protectedvoidonScrollChanged(intl,intt,intoldl,intoldt){

  56. super.onScrollChanged(l,t,oldl,oldt);

  57. if(!mContext.isFinishing()&&view!=null&&rightImage!=null

  58. &&leftImage!=null){

  59. if(view.getWidth()<=windowWitdh){

  60. leftImage.setVisibility(View.GONE);

  61. rightImage.setVisibility(View.GONE);

  62. }else{

  63. if(l==0){

  64. leftImage.setVisibility(View.GONE);

  65. rightImage.setVisibility(View.VISIBLE);

  66. }elseif(view.getWidth()-l==windowWitdh){

  67. leftImage.setVisibility(View.VISIBLE);

  68. rightImage.setVisibility(View.GONE);

  69. }else{

  70. leftImage.setVisibility(View.VISIBLE);

  71. rightImage.setVisibility(View.VISIBLE);

  72. }

  73. }

  74. }

  75. }

  76. }




以下是两个Fragment的源代码


LaunchUIFragment.java


[java]view plaincopy

  1. packagecom.example.playtabtest.fragment;

  2. importandroid.os.Bundle;

  3. importandroid.support.v4.app.Fragment;

  4. importandroid.view.LayoutInflater;

  5. importandroid.view.View;

  6. importandroid.view.ViewGroup;

  7. importcom.example.playtabtest.R;

  8. publicclassLaunchUIFragmentextendsFragment{

  9. @Override

  10. publicViewonCreateView(LayoutInflaterinflater,ViewGroupcontainer,

  11. BundlesavedInstanceState){

  12. ViewrootView=inflater.inflate(R.layout.fragment_selection_launch,container,false);

  13. returnrootView;

  14. }

  15. @Override

  16. publicvoidonActivityCreated(BundlesavedInstanceState){

  17. //TODOAuto-generatedmethodstub

  18. super.onActivityCreated(savedInstanceState);

  19. }

  20. }




CommonUIFragment.java


[java]view plaincopy

  1. packagecom.example.playtabtest.fragment;

  2. importandroid.os.Bundle;

  3. importandroid.support.v4.app.Fragment;

  4. importandroid.view.LayoutInflater;

  5. importandroid.view.View;

  6. importandroid.view.ViewGroup;

  7. importandroid.widget.TextView;

  8. importcom.example.playtabtest.MainActivity;

  9. importcom.example.playtabtest.R;

  10. publicclassCommonUIFragmentextendsFragment{

  11. @Override

  12. publicViewonCreateView(LayoutInflaterinflater,ViewGroupcontainer,

  13. BundlesavedInstanceState){

  14. ViewrootView=inflater.inflate(R.layout.fragment_selection_common,container,false);

  15. TextViewtv_tabName=(TextView)rootView.findViewById(R.id.tv_tabName);

  16. Bundlebundle=getArguments();

  17. tv_tabName.setText(bundle.getString(MainActivity.ARGUMENTS_NAME,""));

  18. returnrootView;

  19. }

  20. @Override

  21. publicvoidonActivityCreated(BundlesavedInstanceState){

  22. //TODOAuto-generatedmethodstub

  23. super.onActivityCreated(savedInstanceState);

  24. }

  25. }


源码下载地址:http://download.csdn.net/detail/fx_sky/5475985


更多相关文章

  1. Android(安卓)获取系统程序和应用程序
  2. android证书指纹的生成
  3. 【Android话题-2.5系统服务】ServiceManager启动和工作原理是怎
  4. Android(安卓)菜商品列表展示
  5. Android获取屏幕高度、状态栏高度、标题栏高度
  6. Android:实现带图片和CheckBox的ListView
  7. Android通过手机GPS获取经纬度方法
  8. Android根据当前时间获取前面的时间日期,或者之后的时间日期
  9. 获取手机中已安装apk文件信息(PackageInfo、ResolveInfo)(应用图

随机推荐

  1. 为什么我不用Javascript和Javascript HTM
  2. JS动态生成Table
  3. 如何在窗体上布局文本和输入以适应特定的
  4. 有没有办法强制Chrome在OSX上以演示模式
  5. 关于解析html并使用shell提取数据
  6. 填充HTML表格列,两个边框?
  7. 如何使用CSS消除元素的偏移?
  8. HTML基础 img标签alt属性 当图片加载失败
  9. 解决html代码中插入的图片在浏览器中不显
  10. 纯css实现tab切换