跳至主要内容

How to change ViewPager scroll animation duration and velocity

When you call change current selected view pager position you may call like this.


// change current position   default is viewPager.setCurrentItem(position, true);
viewPager.setCurrentItem(position);

There will show transaction animation for change position , but this animation is too fast. So I want change this animation.

When I see source code I find this, like flow. where is the scroll animation and speed.


    int duration = 0;
    velocity = Math.abs(velocity);
    if (velocity > 0) {
        duration = 4 * Math.round(1000 * Math.abs(distance / velocity));
    } else {
        final float pageWidth = width * mAdapter.getPageWidth(mCurItem);
        final float pageDelta = (float) Math.abs(dx) / (pageWidth + mPageMargin);
        duration = (int) ((pageDelta + 1) * 100);
    }
    duration = Math.min(duration, MAX_SETTLE_DURATION);

    mScroller.startScroll(sx, sy, dx, dy, duration);
But there no API for change this mScroller in API8 level. Then I want to change this with reflect, write my Custom Scroller in ViewPager.


/**
 * Created by Jerry on 14-6-6.
 */
public class ViewPagerScroller extends Scroller {
private int mScrollDuration = 600;// 滑动速度
public ViewPagerScroller(Context context) {
    super(context);
}
public ViewPagerScroller(Context context, Interpolator interpolator) {
    super(context, interpolator);
}
@Override
public void startScroll(int startX, int startY, int dx, int dy, int duration) {
    super.startScroll(startX, startY, dx, dy, mScrollDuration);
}
@Override
public void startScroll(int startX, int startY, int dx, int dy) {
    super.startScroll(startX, startY, dx, dy, mScrollDuration);
}
}

Then last step is set this Scroller into my ViewPager like this.


private void changePagerScroller() {
    try {
        Field mScroller = null;
        mScroller = ViewPager.class.getDeclaredField("mScroller");
        mScroller.setAccessible(true);
        ViewPagerScroller scroller = new ViewPagerScroller(viewPager.getContext());
        mScroller.set(viewPager, scroller);
    } catch (Exception e) {
        Log.e(TAG, "error of change scroller ", e);
    }
}

Now it work.

评论

发表评论

此博客中的热门博文

solution for AsyncTask.onPostExecute throws NullPointerException when fragment's view was destroyed in android

like title, there is the issue like example: public class TestFragment extends Fragment { private boolean isDestroyed = false; private TextView mTextView; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.simple_list_item_1, null); mTextView = (TextView) view.findViewById(R.id.text1); return view; } class FetchNewsTask extends AsyncTask { @Override protected void onPreExecute() { // show ProgressBar here } @Override protected String doInBackground(Void... params) { return null; } @Override protected void onPostExecute(String result) { mTextView.setText(result); } } } that is a very simple fragment in a program, but there have a bug if you do that. AsyncTask well execute in another thread, but view is destroyed this th...

how to open context menu for android listview item button

Like title, here is this problem in my activity like this: An more button in every row of listview item . When I click this more button then show activity context menu. So I try to click button, but open context menu is the Adaper's context menu. My  Adapter  is extends from BaseAdapter ,  BaseAdapter  has not context menu. My solution like example : <ImageButton android:id="@+id/more" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentRight="true" android:layout_centerVertical="true" android:layout_marginRight="15dp" android:background="#00000000" android:src="@drawable/btn_addressbook_more" android:onClick="onMoreClick"/> Add an event named  onMoreClick , when user click this button will do  onClick  event in  activity . // maybe you can registe...