ViewPager 滑动速度设置,并实现点击按钮滑动

 

     使用过ViewPager的童鞋,都会感觉到设置界面滑动挺简单的。但是有时候却满足不了UI设计的要求。

     在用这个ViewPager的时候我遇到两个问题,不知道你们遇到没有。这里做个笔记,总结一下:

     第一个问题是,ViewPager在我们滑动放手后,速度和动画的变化率是固定的。

     第二个问题的,我们再添加左右按钮后,如点击滑动到前一页面(通过mViewPager.setCurrentItem(viewID, true);),一闪就了,用户感觉不到动画效果。

     其实这两个问题的的根源都是一样的。我们能都改变速度和动画的变化率,那么就可以解决了。

 

还是写个简单的demo,先看效果图:

               

 

右边这张是滑动中的。滑动放手后,动画的变化率设为加速度,也就是先慢后快。这里改变了Interpolator。

每按下向左键,滑动速度会快0.1秒。每按下向右键,滑动速度会慢0.1秒。 所以你不停的按向右键,那么将会变得很慢很慢。

 

布局main.xml:

 

[html]  view plain copy
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout xmlns: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.   
  7.     <android.support.v4.view.ViewPager  
  8.         android:id="@+id/viewpager"  
  9.         android:layout_width="fill_parent"  
  10.         android:layout_height="400dip" />  
  11.   
  12.     <LinearLayout  
  13.         android:layout_width="wrap_content"  
  14.         android:layout_height="wrap_content"  
  15.         android:orientation="horizontal" >  
  16.        <Button  
  17.             android:id="@+id/left"  
  18.             android:layout_width="wrap_content"  
  19.             android:layout_height="wrap_content"  
  20.             android:text="←"  
  21.             android:textSize="25dip" />  
  22.         <Button  
  23.             android:id="@+id/right"  
  24.             android:layout_width="wrap_content"  
  25.             android:layout_height="wrap_content"  
  26.             android:layout_marginRight="100dip"  
  27.             android:text="→"  
  28.             android:textSize="25dip" />  
  29.     LinearLayout>  
  30.   
  31. LinearLayout>  


ViewPagerDemoActivity类:

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


 

 

FixedSpeedScroller类:

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

更多相关文章

  1. android实现类似淘宝的底部滑动导航菜单
  2. Android(安卓)触屏事件 (单击,双击,滑动)
  3. Android中使用双层ViewPager2+Fragment+TabLayout 实现顶部Tab和
  4. Android(安卓)Switch控件修改样式
  5. android imageview围绕中心旋转动画
  6. [置顶] 搜集整理的一些博客导航
  7. Lottie动画在Android和Ios开发中的应用——Android篇
  8. Android实现自定义测滑栏
  9. Android轻松搞定Dialog提示动画效果

随机推荐

  1. Unity3D Vuforia Android 拨打电话
  2. 点击Android按钮跳转到React-native指定
  3. 设置android全屏的两种方式
  4. 【AS-AndroidX】迁移AndroidX带来的问题
  5. Android(安卓)4.4 Kitkat 使能有线网络 E
  6. Android Layout Tricks #3: Optimize wit
  7. Android中Java反射技术的使用示例
  8. android之具有选择功能的AlertDialog
  9. android 调用系统自带录音实现,语音录制与
  10. android 系统学习资料