Android采用Fragment+ViewPager+动画实现页面滑动

public class MainActivity extends Activity {
private ViewPager viewPager;//页卡内容  
private ImageView imageView;// 动画图片  
private TextView textView1,textView2,textView3;  
private List<View> views;// Tab页面列表  
private int offset = 0;// 动画图片偏移量  
    private int currIndex = 0;// 当前页卡编号  
    private int bmpW;// 动画图片宽度  
    private View view1,view2,view3;//各个页卡  

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

InitImageView();  
        InitTextView();  
        InitViewPager();  
}
/** 
     *  初始化头标 
     */  
 
   private void InitTextView() {  
       textView1 = (TextView) findViewById(R.id.text1);  
       textView2 = (TextView) findViewById(R.id.text2);  
       textView3 = (TextView) findViewById(R.id.text3);  
 
       textView1.setOnClickListener(new MyOnClickListener(0));  
       textView2.setOnClickListener(new MyOnClickListener(1));  
       textView3.setOnClickListener(new MyOnClickListener(2));  
   }  
   /** 
   2      * 初始化动画,这个就是页卡滑动时,下面的横线也滑动的效果,在这里需要计算一些数据 
   3 */  

  private void InitImageView() {  
      imageView= (ImageView) findViewById(R.id.cursor);  
      bmpW = BitmapFactory.decodeResource(getResources(), R.drawable.line).getWidth();// 获取图片宽度  
      DisplayMetrics dm = new DisplayMetrics();  
      getWindowManager().getDefaultDisplay().getMetrics(dm);  
      int screenW = dm.widthPixels;// 获取分辨率宽度  
      offset = (screenW / 3 - bmpW) / 2;// 计算偏移量  
      Matrix matrix = new Matrix();  
      matrix.postTranslate(offset, 0);  
      imageView.setImageMatrix(matrix);// 设置动画初始位置  
  }  
   
private void InitViewPager() {  
        viewPager=(ViewPager) findViewById(R.id.viewpager);  
        views=new ArrayList<View>();  
        LayoutInflater inflater=getLayoutInflater();  
        view1=inflater.inflate(R.layout.view1, null);  
        view2=inflater.inflate(R.layout.view2, null);  
        view3=inflater.inflate(R.layout.view3, null);  
        views.add(view1);  
        views.add(view2);  
        views.add(view3);  
        viewPager.setAdapter(new MyViewPagerAdapter(views));  
        viewPager.setCurrentItem(0);  
        viewPager.setOnPageChangeListener(new MyOnPageChangeListener());  //若不设置这个,标题下边的线不会随着页卡滑动而滑动
    }  

/**  
     *      
     * 头标点击监听 3 */  
    private class MyOnClickListener implements OnClickListener{  
        private int index=0;  
        public MyOnClickListener(int i){  
            index=i;  
        }  
        public void onClick(View v) {  
            viewPager.setCurrentItem(index);              
        }  
          
    }  
    
public class MyViewPagerAdapter extends PagerAdapter{  
        private List<View> mListViews;  
          
        public MyViewPagerAdapter(List<View> mListViews) {  
            this.mListViews = mListViews;  
        }  
  
        @Override  
        public void destroyItem(ViewGroup container, int position, Object object)   {     
            container.removeView(mListViews.get(position));  
        }  
  
  
        @Override  
        public Object instantiateItem(ViewGroup container, int position) {            
             container.addView(mListViews.get(position), 0);  
             
 /如果某个页卡里面有按钮或者什么控件,写在这/
  Button weibo_button=(Button) findViewById(R.id.button1);//这个需要注意,我们是在重写adapter里面实例化button组件的,如果你在onCreate()方法里这样做会报错的。  
             weibo_button.setOnClickListener(new OnClickListener() {  
                   
                 public void onClick(View v) {  
                     Toast.makeText(MainActivity.this, "click 1", Toast.LENGTH_LONG).show();
                 }  
             }); 
             
             Button button2=(Button) findViewById(R.id.button2);
             if(button2!=null){
         button2.setOnClickListener(new OnClickListener() {  
               
             public void onClick(View v) {  
                 Toast.makeText(MainActivity.this, "click 3", Toast.LENGTH_LONG).show();
             }  
         }); 
             }
  //没有的话,这段省略//
             
             return mListViews.get(position);  
        }  
  
        @Override  
        public int getCount() {           
            return  mListViews.size();  
        }  
          
        @Override  
        public boolean isViewFromObject(View arg0, Object arg1) {             
            return arg0==arg1;  
        }  
    }  
public class MyOnPageChangeListener implements OnPageChangeListener{  
 
        int one = offset * 2 + bmpW;// 页卡1 -> 页卡2 偏移量  
        int two = one * 2;// 页卡1 -> 页卡3 偏移量  
        public void onPageScrollStateChanged(int arg0) {  // arg0 ==1的时辰默示正在滑动,arg0==2的时辰默示滑动完毕了,arg0==0的时辰默示什么都没做,就是停在那。
              
              
        }  
  
        public void onPageScrolled(int arg0, float arg1, int arg2) {  // 默示在前一个页面滑动到后一个页面的时辰,在前一个页面滑动前调用的办法。
              
              
        }  
  
        public void onPageSelected(int arg0) {  // arg0是默示你当前选中的页面,这事务是在你页面跳转完毕的时辰调用的。
            /*两种方法,这个是一种,下面还有一种,显然这个比较麻烦 
            Animation animation = null; 
            switch (arg0) { 
            case 0: 
                if (currIndex == 1) { 
                    animation = new TranslateAnimation(one, 0, 0, 0); 
                } else if (currIndex == 2) { 
                    animation = new TranslateAnimation(two, 0, 0, 0); 
                } 
                break; 
            case 1: 
                if (currIndex == 0) { 
                    animation = new TranslateAnimation(offset, one, 0, 0); 
                } else if (currIndex == 2) { 
                    animation = new TranslateAnimation(two, one, 0, 0); 
                } 
                break; 
            case 2: 
                if (currIndex == 0) { 
                    animation = new TranslateAnimation(offset, two, 0, 0); 
                } else if (currIndex == 1) { 
                    animation = new TranslateAnimation(one, two, 0, 0); 
                } 
                break; 
                 
            } 
            */  
            Animation animation = new TranslateAnimation(one*currIndex, one*arg0, 0, 0);//显然这个比较简洁,只有一行代码。  
            currIndex = arg0;  
            animation.setFillAfter(true);// True:图片停在动画结束位置  
            animation.setDuration(300);  
            imageView.startAnimation(animation);  
            Toast.makeText(MainActivity.this, "您选择了"+ viewPager.getCurrentItem()+"页卡", Toast.LENGTH_SHORT).show();  
        }  
          
    }  
}
它的布局文件:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >
    
    <LinearLayout 
        android:id="@+id/linearlayout1"
        android:layout_width="fill_parent"
        android:layout_height="40dp"
        android:background="#ffffff">
        
        <TextView 
            android:id="@+id/text1"
            android:layout_width="0dp"
            android:layout_height="fill_parent"
            android:layout_weight="1"
            android:gravity="center"
            android:text="我"
            android:textColor="#000000"
            android:textSize="20sp"/>
        <TextView 
            android:id="@+id/text2"
            android:layout_width="0dp"
            android:layout_height="fill_parent"
            android:layout_weight="1"
            android:gravity="center"
            android:text="评论"
            android:textColor="#000000"
            android:textSize="20sp"/>
        <TextView 
            android:id="@+id/text3"
            android:layout_width="0dp"
            android:layout_height="fill_parent"
            android:layout_weight="1"
            android:gravity="center"
            android:text="私信"
            android:textColor="#000000"
            android:textSize="20sp"/>
    </LinearLayout>
    
    <ImageView 
        android:id="@+id/cursor"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:scaleType="matrix"
        android:src="@drawable/line"/>

    <android.support.v4.view.ViewPager
        android:id="@+id/viewpager"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:background="#ffffff"  
        android:layout_gravity="center" >

    </android.support.v4.view.ViewPager>

</LinearLayout>

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值