Android(安卓)ViewPager+Fragment 仿 Google Play 带箭头的导航栏
最近终于从繁忙的网络爬虫项目中解脱出来,回到久违的Android开发岗位,有时间研究Android 4.0的一些新特性,例如Fragment和ViewPager,参考了一些他人的代码,做出来了Google Play 首页的效果,在这里跟大家分享一下!
[java]view plaincopy
packagecom.example.playtabtest;
importandroid.os.Bundle;
importandroid.support.v4.app.Fragment;
importandroid.support.v4.app.FragmentActivity;
importandroid.support.v4.app.FragmentManager;
importandroid.support.v4.app.FragmentPagerAdapter;
importandroid.support.v4.view.ViewPager;
importandroid.support.v4.view.ViewPager.OnPageChangeListener;
importandroid.util.DisplayMetrics;
importandroid.view.LayoutInflater;
importandroid.view.Menu;
importandroid.view.ViewGroup.LayoutParams;
importandroid.view.animation.LinearInterpolator;
importandroid.view.animation.TranslateAnimation;
importandroid.widget.ImageView;
importandroid.widget.RadioButton;
importandroid.widget.RadioGroup;
importandroid.widget.RadioGroup.OnCheckedChangeListener;
importandroid.widget.RelativeLayout;
importcom.example.playtabtest.fragment.CommonUIFragment;
importcom.example.playtabtest.fragment.LaunchUIFragment;
importcom.example.playtabtest.view.SyncHorizontalScrollView;
publicclassMainActivityextendsFragmentActivity{
publicstaticfinalStringARGUMENTS_NAME="arg";
privateRelativeLayoutrl_nav;
privateSyncHorizontalScrollViewmHsv;
privateRadioGrouprg_nav_content;
privateImageViewiv_nav_indicator;
privateImageViewiv_nav_left;
privateImageViewiv_nav_right;
privateViewPagermViewPager;
privateintindicatorWidth;
publicstaticString[]tabTitle={"选项1","选项2","选项3","选项4","选项5"};//标题
privateLayoutInflatermInflater;
privateTabFragmentPagerAdaptermAdapter;
privateintcurrentIndicatorLeft=0;
@Override
protectedvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
findViewById();
initView();
setListener();
}
privatevoidsetListener(){
mViewPager.setOnPageChangeListener(newOnPageChangeListener(){
@Override
publicvoidonPageSelected(intposition){
if(rg_nav_content!=null&&rg_nav_content.getChildCount()>position){
((RadioButton)rg_nav_content.getChildAt(position)).performClick();
}
}
@Override
publicvoidonPageScrolled(intarg0,floatarg1,intarg2){
}
@Override
publicvoidonPageScrollStateChanged(intarg0){
}
});
rg_nav_content.setOnCheckedChangeListener(newOnCheckedChangeListener(){
@Override
publicvoidonCheckedChanged(RadioGroupgroup,intcheckedId){
if(rg_nav_content.getChildAt(checkedId)!=null){
TranslateAnimationanimation=newTranslateAnimation(
currentIndicatorLeft,
((RadioButton)rg_nav_content.getChildAt(checkedId)).getLeft(),0f,0f);
animation.setInterpolator(newLinearInterpolator());
animation.setDuration(100);
animation.setFillAfter(true);
//执行位移动画
iv_nav_indicator.startAnimation(animation);
mViewPager.setCurrentItem(checkedId);//ViewPager跟随一起切换
//记录当前下标的距最左侧的距离
currentIndicatorLeft=((RadioButton)rg_nav_content.getChildAt(checkedId)).getLeft();
mHsv.smoothScrollTo(
(checkedId>1?((RadioButton)rg_nav_content.getChildAt(checkedId)).getLeft():0)-((RadioButton)rg_nav_content.getChildAt(2)).getLeft(),0);
}
}
});
}
privatevoidinitView(){
DisplayMetricsdm=newDisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(dm);
indicatorWidth=dm.widthPixels/4;
LayoutParamscursor_Params=iv_nav_indicator.getLayoutParams();
cursor_Params.width=indicatorWidth;//初始化滑动下标的宽
iv_nav_indicator.setLayoutParams(cursor_Params);
mHsv.setSomeParam(rl_nav,iv_nav_left,iv_nav_right,this);
//获取布局填充器
mInflater=(LayoutInflater)this.getSystemService(LAYOUT_INFLATER_SERVICE);
//另一种方式获取
//LayoutInflatermInflater=LayoutInflater.from(this);
initNavigationHSV();
mAdapter=newTabFragmentPagerAdapter(getSupportFragmentManager());
mViewPager.setAdapter(mAdapter);
}
privatevoidinitNavigationHSV(){
rg_nav_content.removeAllViews();
for(inti=0;i<tabTitle.length;i++){
RadioButtonrb=(RadioButton)mInflater.inflate(R.layout.nav_radiogroup_item,null);
rb.setId(i);
rb.setText(tabTitle[i]);
rb.setLayoutParams(newLayoutParams(indicatorWidth,
LayoutParams.MATCH_PARENT));
rg_nav_content.addView(rb);
}
}
privatevoidfindViewById(){
rl_nav=(RelativeLayout)findViewById(R.id.rl_nav);
mHsv=(SyncHorizontalScrollView)findViewById(R.id.mHsv);
rg_nav_content=(RadioGroup)findViewById(R.id.rg_nav_content);
iv_nav_indicator=(ImageView)findViewById(R.id.iv_nav_indicator);
iv_nav_left=(ImageView)findViewById(R.id.iv_nav_left);
iv_nav_right=(ImageView)findViewById(R.id.iv_nav_right);
mViewPager=(ViewPager)findViewById(R.id.mViewPager);
}
@Override
publicbooleanonCreateOptionsMenu(Menumenu){
getMenuInflater().inflate(R.menu.main,menu);
returntrue;
}
publicstaticclassTabFragmentPagerAdapterextendsFragmentPagerAdapter{
publicTabFragmentPagerAdapter(FragmentManagerfm){
super(fm);
}
@Override
publicFragmentgetItem(intarg0){
Fragmentft=null;
switch(arg0){
case0:
ft=newLaunchUIFragment();
break;
default:
ft=newCommonUIFragment();
Bundleargs=newBundle();
args.putString(ARGUMENTS_NAME,tabTitle[arg0]);
ft.setArguments(args);
break;
}
returnft;
}
@Override
publicintgetCount(){
returntabTitle.length;
}
}
}
SyncHorizontalScrollView.java
[java]view plaincopy
packagecom.example.playtabtest.view;
importandroid.app.Activity;
importandroid.content.Context;
importandroid.util.AttributeSet;
importandroid.util.DisplayMetrics;
importandroid.view.View;
importandroid.widget.HorizontalScrollView;
importandroid.widget.ImageView;
publicclassSyncHorizontalScrollViewextendsHorizontalScrollView{
privateViewview;
privateImageViewleftImage;
privateImageViewrightImage;
privateintwindowWitdh=0;
privateActivitymContext;
publicvoidsetSomeParam(Viewview,ImageViewleftImage,
ImageViewrightImage,Activitycontext){
this.mContext=context;
this.view=view;
this.leftImage=leftImage;
this.rightImage=rightImage;
DisplayMetricsdm=newDisplayMetrics();
this.mContext.getWindowManager().getDefaultDisplay().getMetrics(dm);
windowWitdh=dm.widthPixels;
}
publicSyncHorizontalScrollView(Contextcontext){
super(context);
//TODOAuto-generatedconstructorstub
}
publicSyncHorizontalScrollView(Contextcontext,AttributeSetattrs){
super(context,attrs);
//TODOAuto-generatedconstructorstub
}
//显示和隐藏左右两边的箭头
publicvoidshowAndHideArrow(){
if(!mContext.isFinishing()&&view!=null){
this.measure(0,0);
if(windowWitdh>=this.getMeasuredWidth()){
leftImage.setVisibility(View.GONE);
rightImage.setVisibility(View.GONE);
}else{
if(this.getLeft()==0){
leftImage.setVisibility(View.GONE);
rightImage.setVisibility(View.VISIBLE);
}elseif(this.getRight()==this.getMeasuredWidth()
-windowWitdh){
leftImage.setVisibility(View.VISIBLE);
rightImage.setVisibility(View.GONE);
}else{
leftImage.setVisibility(View.VISIBLE);
rightImage.setVisibility(View.VISIBLE);
}
}
}
}
protectedvoidonScrollChanged(intl,intt,intoldl,intoldt){
super.onScrollChanged(l,t,oldl,oldt);
if(!mContext.isFinishing()&&view!=null&&rightImage!=null
&&leftImage!=null){
if(view.getWidth()<=windowWitdh){
leftImage.setVisibility(View.GONE);
rightImage.setVisibility(View.GONE);
}else{
if(l==0){
leftImage.setVisibility(View.GONE);
rightImage.setVisibility(View.VISIBLE);
}elseif(view.getWidth()-l==windowWitdh){
leftImage.setVisibility(View.VISIBLE);
rightImage.setVisibility(View.GONE);
}else{
leftImage.setVisibility(View.VISIBLE);
rightImage.setVisibility(View.VISIBLE);
}
}
}
}
}
以下是两个Fragment的源代码
LaunchUIFragment.java
[java]view plaincopy
packagecom.example.playtabtest.fragment;
importandroid.os.Bundle;
importandroid.support.v4.app.Fragment;
importandroid.view.LayoutInflater;
importandroid.view.View;
importandroid.view.ViewGroup;
importcom.example.playtabtest.R;
publicclassLaunchUIFragmentextendsFragment{
@Override
publicViewonCreateView(LayoutInflaterinflater,ViewGroupcontainer,
BundlesavedInstanceState){
ViewrootView=inflater.inflate(R.layout.fragment_selection_launch,container,false);
returnrootView;
}
@Override
publicvoidonActivityCreated(BundlesavedInstanceState){
//TODOAuto-generatedmethodstub
super.onActivityCreated(savedInstanceState);
}
}
CommonUIFragment.java
[java]view plaincopy
packagecom.example.playtabtest.fragment;
importandroid.os.Bundle;
importandroid.support.v4.app.Fragment;
importandroid.view.LayoutInflater;
importandroid.view.View;
importandroid.view.ViewGroup;
importandroid.widget.TextView;
importcom.example.playtabtest.MainActivity;
importcom.example.playtabtest.R;
publicclassCommonUIFragmentextendsFragment{
@Override
publicViewonCreateView(LayoutInflaterinflater,ViewGroupcontainer,
BundlesavedInstanceState){
ViewrootView=inflater.inflate(R.layout.fragment_selection_common,container,false);
TextViewtv_tabName=(TextView)rootView.findViewById(R.id.tv_tabName);
Bundlebundle=getArguments();
tv_tabName.setText(bundle.getString(MainActivity.ARGUMENTS_NAME,""));
returnrootView;
}
@Override
publicvoidonActivityCreated(BundlesavedInstanceState){
//TODOAuto-generatedmethodstub
super.onActivityCreated(savedInstanceState);
}
}
源码下载地址:http://download.csdn.net/detail/fx_sky/5475985
更多相关文章
- Android(安卓)获取系统程序和应用程序
- android证书指纹的生成
- 【Android话题-2.5系统服务】ServiceManager启动和工作原理是怎
- Android(安卓)菜商品列表展示
- Android获取屏幕高度、状态栏高度、标题栏高度
- Android:实现带图片和CheckBox的ListView
- Android通过手机GPS获取经纬度方法
- Android根据当前时间获取前面的时间日期,或者之后的时间日期
- 获取手机中已安装apk文件信息(PackageInfo、ResolveInfo)(应用图