按照常规思路,实现导航页有专门的TabHost或ViewPager,但自定义空间不大,再者,自己想熟悉一下多重布局和动画效果的使用,因此采用这种ScrollView+GridView+ViewPager的效果。
其中比较麻烦的是GridView实现横向的加载,并且下面的滚动条随着滑动也得滚动和动态发生位置变化。
public class MainAct extends FragmentActivity { ViewPager viewPager; HorizontalScrollView scrollView; String[] titles = { "首页", "新闻", "交友", "购物", "娱乐", "视频", "阅读", "运动", "医疗", "食品" }; LayoutParams textLayoutParams; private MyGridView gridView; int[] tabmoving = new int[2]; View downView; long dutime = 500; boolean right = true; int old = 0; @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); setContentView(R.layout.scrollpager); textLayoutParams = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT); textLayoutParams.setMargins(10, 10, 10, 10); viewPager = (ViewPager) findViewById(R.id.pager); scrollView = (HorizontalScrollView) findViewById(R.id.myscroll); gridView = (MyGridView) findViewById(R.id.gridview); downView = (View) findViewById(R.id.down); final MyAdapter adapter = new MyAdapter(); PagerAdapter myAdapter = new PagerAdapter(getSupportFragmentManager()); viewPager.setAdapter(myAdapter); int size = titles.length; final DisplayMetrics dm = new DisplayMetrics(); getWindowManager().getDefaultDisplay().getMetrics(dm); float density = dm.density; int allWidth = (int) (110 * (size) * density) - (titles.length) * 10; final int itemWidth = (int) (100 * density); downView.setLayoutParams(new LayoutParams(itemWidth, 8)); LinearLayout.LayoutParams params = new LinearLayout.LayoutParams( allWidth, LinearLayout.LayoutParams.FILL_PARENT); gridView.setLayoutParams(params); gridView.setColumnWidth(itemWidth); gridView.setHorizontalSpacing(10); gridView.setStretchMode(GridView.NO_STRETCH); gridView.setNumColumns(size); gridView.setAdapter(adapter); viewPager.setCurrentItem(0); gridView.getParent().requestDisallowInterceptTouchEvent(true); viewPager.setOnPageChangeListener(new OnPageChangeListener() { @Override public void onPageSelected(int arg0) { // TODO Auto-generated method stub View view = gridView.getChildAt(arg0); if (view == null) return; view.getLocationOnScreen(tabmoving); if (old <= tabmoving[0]) { right = true; } else { right = false; } old = tabmoving[0]; int difvalue = dm.widthPixels - tabmoving[0] - itemWidth; if (difvalue < 0) { scrollView.scrollBy(Math.abs(difvalue), 0); TranslateAnimation tt = new TranslateAnimation( dm.widthPixels - 2 * itemWidth - 10, dm.widthPixels - itemWidth, 0, 0); tt.setDuration(dutime); tt.setFillAfter(true); downView.startAnimation(tt); } else if (tabmoving[0] < 0) { scrollView.scrollBy(tabmoving[0], 0); TranslateAnimation tt = new TranslateAnimation( itemWidth + 10, 0, 0, 0); tt.setDuration(dutime); tt.setFillAfter(true); downView.startAnimation(tt); gridView.setSelection(arg0); adapter.notifyDataSetChanged(); } else { if (right) { TranslateAnimation tt = new TranslateAnimation( tabmoving[0] - itemWidth - 10, tabmoving[0], 0, 0); tt.setDuration(dutime); tt.setFillAfter(true); downView.startAnimation(tt); } else { TranslateAnimation tt = new TranslateAnimation( tabmoving[0], tabmoving[0] - itemWidth - 10, 0, 0); tt.setDuration(dutime); tt.setFillAfter(true); downView.startAnimation(tt); } } } @Override public void onPageScrolled(int arg0, float arg1, int arg2) { // TODO Auto-generated method stub } @Override public void onPageScrollStateChanged(int arg0) { // TODO Auto-generated method stub } }); } class PagerAdapter extends FragmentStatePagerAdapter { Fragment[] fs = { new MyFragment(titles[0]), new MyFragment(titles[1]), new MyFragment(titles[2]), new MyFragment(titles[3]), new MyFragment(titles[4]), new MyFragment(titles[5]), new MyFragment(titles[6]), new MyFragment(titles[7]), new MyFragment(titles[8]), new MyFragment(titles[9]) }; public PagerAdapter(FragmentManager fm) { super(fm); // TODO Auto-generated constructor stub } @Override public Fragment getItem(int arg0) { // TODO Auto-generated method stub return fs[arg0]; } @Override public int getCount() { // TODO Auto-generated method stub return fs.length; } } class MyAdapter extends BaseAdapter { @Override public int getCount() { // TODO Auto-generated method stub return titles.length; } @Override public Object getItem(int position) { // TODO Auto-generated method stub return titles[position]; } @Override public long getItemId(int position) { // TODO Auto-generated method stub return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { // TODO Auto-generated method stub TextView textView = new TextView(getApplicationContext()); textView.setText(titles[position]); // textView.setWidth(240); // textView.setHeight(100); textView.setGravity(Gravity.CENTER); textView.setTextColor(Color.BLACK); textView.setBackgroundResource(R.drawable.s); textView.setPadding(30, 30, 30, 30); // textView.setLayoutParams(textLayoutParams); return textView; } } }