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

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

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

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

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

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

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

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

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

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

布局main.xml:

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android=""android:layout_width="fill_parent"android:layout_height="fill_parent"android:orientation="vertical" ><android.support.v4.view.ViewPagerandroid:id="@+id/viewpager"android:layout_width="fill_parent"android:layout_height="400dip" /><LinearLayoutandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:orientation="horizontal" ><Buttonandroid:id="@+id/left"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="←"android:textSize="25dip" /><Buttonandroid:id="@+id/right"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginRight="100dip"android:text="→"android:textSize="25dip" /></LinearLayout></LinearLayout>

ViewPagerDemoActivity类:

package blog.csdn.net.liyulei316686082;import java.lang.reflect.Field;import java.util.ArrayList;import java.util.List;import android.app.Activity;import android.os.Bundle;import android.support.v4.view.ViewPager;import android.support.v4.view.ViewPager.OnPageChangeListener;import android.view.View;import android.view.View.OnClickListener;import android.view.animation.AccelerateInterpolator;import android.widget.Button;public class ViewPagerDemoActivity extends Activity {/** Called when the activity is first created. */private ViewPager mViewPager = null; private Button mLeft = null; private Button mRight = null;private static final int PAGER_NUM = 10;//10个页面 private int mCurrentViewID = 0;//当前页面 private int mMyDuration = 100;//持续时间private FixedSpeedScroller mScroller; private YLeiPageAdapter mYLeiPageAdapter = null; private List<View> mListViews;@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);mViewPager = (ViewPager)findViewById(R.id.viewpager);mLeft = (Button)findViewById(R.id.left);mRight = (Button)findViewById(R.id.right);mLeft.setOnClickListener(mOnClickListener); mRight.setOnClickListener(mOnClickListener);mListViews = new ArrayList<View>(); for(int i= 1; i<= PAGER_NUM; i++){MyPagerView view = new MyPagerView(this, i);mListViews.add(view); } mYLeiPageAdapter = new YLeiPageAdapter(this, mListViews); mViewPager.setAdapter(mYLeiPageAdapter); mViewPager.setOnPageChangeListener(mOnPageChangeListener);/*主要代码段*/ try {Field mField = ViewPager.class.getDeclaredField("mScroller");mField.setAccessible(true);//设置加速度 ,通过改变FixedSpeedScroller这个类中的mDuration来改变动画时间(如mScroller.setmDuration(mMyDuration);) mScroller = new FixedSpeedScroller(mViewPager.getContext(), new AccelerateInterpolator());mField.set(mViewPager, mScroller);} catch (Exception e) {e.printStackTrace();}}private OnClickListener mOnClickListener = new OnClickListener(){ @Override public void onClick(View v) {switch (v.getId()){case R.id.left:if(mCurrentViewID != 0){mCurrentViewID–;mViewPager.setCurrentItem(mCurrentViewID, true);}mMyDuration -= 100;mScroller.setmDuration(mMyDuration);break;case R.id.right:if(mCurrentViewID != PAGER_NUM-1){mCurrentViewID++;mViewPager.setCurrentItem(mCurrentViewID, true);}mMyDuration += 100;mScroller.setmDuration(mMyDuration);break;}}};private OnPageChangeListener mOnPageChangeListener = new OnPageChangeListener(){@Overridepublic void onPageScrollStateChanged(int arg0) {// TODO Auto-generated method stub}@Overridepublic void onPageScrolled(int arg0, float arg1, int arg2) {// TODO Auto-generated method stub}@Overridepublic void onPageSelected(int currentID) {// TODO Auto-generated method stubmCurrentViewID = currentID;}};}

却还是,会愚蠢的选择相互敌视的方式。即使背脊相抵,

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

相关文章:

你感兴趣的文章:

标签云: