1. 程式人生 > >android viewPager滑動速度設定

android viewPager滑動速度設定

ViewPager 滑動速度設定,並實現點選按鈕滑動

     使用過ViewPager的童鞋,都會感覺到設定介面滑動挺簡單的。但是有時候卻滿足不了UI設計的要求。

     在用這個ViewPager的時候我遇到兩個問題,不知道你們遇到沒有。這裡做個筆記,總結一下:

     第一個問題是,ViewPager在我們滑動放手後,速度和動畫的變化率是固定的。

     第二個問題的,我們再新增左右按鈕後,如點選滑動到前一頁面(通過mViewPager.setCurrentItem(viewID, true);),一閃就了,使用者感覺不到動畫效果。

     其實這兩個問題的的根源都是一樣的。我們能都改變速度和動畫的變化率,那麼就可以解決了。

還是寫個簡單的demo,先看效果圖:

               

右邊這張是滑動中的。滑動放手後,動畫的變化率設為加速度,也就是先慢後快。這裡改變了Interpolator。

每按下向左鍵,滑動速度會快0.1秒。每按下向右鍵,滑動速度會慢0.1秒。 所以你不停的按向右鍵,那麼將會變得很慢很慢。

佈局main.xml:

  1. <?xmlversion="1.0"encoding="utf-8"?>
  2. <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
  3.     android:layout_width
    ="fill_parent"
  4.     android:layout_height="fill_parent"
  5.     android:orientation="vertical">
  6.     <android.support.v4.view.ViewPager
  7.         android:id="@+id/viewpager"
  8.         android:layout_width="fill_parent"
  9.         android:layout_height="400dip"/>
  10.     <LinearLayout
  11.         android:layout_width
    ="wrap_content"
  12.         android:layout_height="wrap_content"
  13.         android:orientation="horizontal">
  14.        <Button
  15.             android:id="@+id/left"
  16.             android:layout_width="wrap_content"
  17.             android:layout_height="wrap_content"
  18.             android:text="←"
  19.             android:textSize="25dip"/>
  20.         <Button
  21.             android:id="@+id/right"
  22.             android:layout_width="wrap_content"
  23.             android:layout_height="wrap_content"
  24.             android:layout_marginRight="100dip"
  25.             android:text="→"
  26.             android:textSize="25dip"/>
  27.     </LinearLayout>
  28. </LinearLayout>


ViewPagerDemoActivity類:

  1. package blog.csdn.net.liyulei316686082;  
  2. import java.lang.reflect.Field;  
  3. import java.util.ArrayList;  
  4. import java.util.List;  
  5. import android.app.Activity;  
  6. import android.os.Bundle;  
  7. import android.support.v4.view.ViewPager;  
  8. import android.support.v4.view.ViewPager.OnPageChangeListener;  
  9. import android.view.View;  
  10. import android.view.View.OnClickListener;  
  11. import android.view.animation.AccelerateInterpolator;  
  12. import android.widget.Button;  
  13. public class ViewPagerDemoActivity extends Activity {  
  14.     /** Called when the activity is first created. */  
  15.  private ViewPager mViewPager = null;  
  16.  private Button mLeft = null;  
  17.  private Button mRight = null;  
  18.  private static final int PAGER_NUM = 10;//10個頁面  
  19.  private int mCurrentViewID = 0;         //當前頁面  
  20.  private int mMyDuration = 100;          //持續時間  
  21.  private FixedSpeedScroller mScroller;  
  22.  private YLeiPageAdapter mYLeiPageAdapter = null;  
  23.  private List<View> mListViews;  
  24.     @Override  
  25.     public void onCreate(Bundle savedInstanceState) {  
  26.         super.onCreate(savedInstanceState);  
  27.         setContentView(R.layout.main);  
  28.         mViewPager = (ViewPager)findViewById(R.id.viewpager);  
  29.         mLeft = (Button)findViewById(R.id.left);   
  30.         mRight = (Button)findViewById(R.id.right);   
  31.         mLeft.setOnClickListener(mOnClickListener);  
  32.   mRight.setOnClickListener(mOnClickListener);  
  33.   mListViews = new ArrayList<View>();  
  34.   for(int i1; i<= PAGER_NUM; i++){  
  35.    MyPagerView view = new MyPagerView(this, i);  
  36.    mListViews.add(view);  
  37.   }  
  38.   mYLeiPageAdapter = new YLeiPageAdapter(this, mListViews);  
  39.   mViewPager.setAdapter(mYLeiPageAdapter);  
  40.   mViewPager.setOnPageChangeListener(mOnPageChangeListener);  
  41.   /*<spanstyle="color:#ff0000;">主要程式碼段</span>*/  
  42.   try {               
  43.    Field mField = ViewPager.class.getDeclaredField("mScroller");               
  44.    mField.setAccessible(true);     
  45.     //<spanstyle="color:#ff0000;">設定加速度 ,通過改變FixedSpeedScroller這個類中的mDuration來改變動畫時間(如mScroller.setmDuration(mMyDuration);)   
  46. </span>mScroller = new FixedSpeedScroller(mViewPager.getContext(), new AccelerateInterpolator());          
  47.    mField.set(mViewPager, mScroller);           
  48.    } catch (Exception e) {           
  49.     e.printStackTrace();  
  50.    }   
  51.     }  
  52.     private OnClickListener mOnClickListener = new OnClickListener(){  
  53.   @Override  
  54.   public void onClick(View v) {  
  55.    switch (v.getId()){  
  56.    case R.id.left:  
  57.     if(mCurrentViewID != 0){  
  58.      mCurrentViewID--;  
  59.      mViewPager.setCurrentItem(mCurrentViewID, true);  
  60.     }  
  61.     mMyDuration -100;  
  62.     mScroller.setmDuration(mMyDuration);  
  63.     break;  
  64.    case R.id.right:  
  65.     if(mCurrentViewID != PAGER_NUM-1){  
  66.      mCurrentViewID++;  
  67.      mViewPager.setCurrentItem(mCurrentViewID, true);  
  68.     }  
  69.     mMyDuration += 100;  
  70.     mScroller.setmDuration(mMyDuration);  
  71.     break;  
  72.    }  
  73.   }};  
  74.   private OnPageChangeListener mOnPageChangeListener = new OnPageChangeListener(){  
  75.    @Override  
  76.    public void onPageScrollStateChanged(int arg0) {  
  77.     // TODO Auto-generated method stub  
  78.    }  
  79.    @Override  
  80.    public void onPageScrolled(int arg0, float arg1, int arg2) {  
  81.     // TODO Auto-generated method stub  
  82.    }  
  83.    @Override  
  84.    public void onPageSelected(int currentID) {  
  85.     // TODO Auto-generated method stub  
  86.     mCurrentViewID = currentID;  
  87.    }};  
  88. }  

FixedSpeedScroller類:

  1. package blog.csdn.net.liyulei316686082;  
  2. import android.content.Context;  
  3. import android.view.animation.Interpolator;  
  4. import android.widget.Scroller;  
  5. public class FixedSpeedScroller extends Scroller {        
  6.     private int mDuration = 1500;        
  7.     public FixedSpeedScroller(Context context) {           
  8.         super(context);       
  9.         }        
  10.     public FixedSpeedScroller(Context context, Interpolator interpolator) {           
  11.         super(context, interpolator);       
  12.         }        
  13.     @Override      
  14.     public void startScroll(int startX, int startY, int dx, int dy, int duration) {      
  15.         // Ignore received duration, use fixed one instead           
  16.         super.startScroll(startX, startY, dx, dy, mDuration);       
  17.         }        
  18.     @Override       
  19.     public void startScroll(int startX, int startY, int dx, int dy) {          
  20.             // Ignore received duration, use fixed one instead          
  21.             super.startScroll(startX, startY, dx, dy, mDuration);      
  22.             }   
  23.     public void setmDuration(int time){  
  24.         mDuration = time;  
  25.     }     
  26.     public int getmDuration(){  
  27.         return mDuration;  
  28.     }     
  29. }