跳至主要内容

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.

评论

发表评论

此博客中的热门博文

How to close SearchView in android with ActionbarSherlock or android ActionBar

How to close SearchView in android with ActionbarSherlock or android ActionBar When I use a search view for search something in android action bar; u must have create a menu for actionview( SearchView) @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { inflater.inflate(R.menu.news_post_list, menu); mSearchView = (SearchView) menu.findItem(R.id.item_search).getActionView(); mSearchView.setQueryHint(getString(R.string.search_hint_news)); mSearchView.setOnQueryTextListener(this); super.onCreateOptionsMenu(menu, inflater); } and menu xml is : <menu xmlns:android="http://schemas.android.com/apk/res/android" > <item android:id="@+id/item_search" android:icon="@drawable/ic_action_search" android:title="@string/search_hint" android:showAsAction="ifRoom" android:actionViewClass="com.actionbarsherlock.widget.SearchView"/> <item android:id

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