2014-07-23 82 views
1

我使用這個代碼我的傳呼機如何編程滾動尋呼機,順利

public void MoveNext(View view) { 
    pager.setCurrentItem(pager.getCurrentItem() + 1); 
} 

public void MovePrevious(View view) { 

    pager.setCurrentItem(pager.getCurrentItem() - 1); 

} 

以編程方式滾動代碼工作完美但過渡太快。我該如何引入延遲,以便滾動更順利?

回答

4

我相信有兩種方式可以實現這個目標,我已經通過ViewPager的fakeDrag()嘗試過,但它並不完美,幸運的是,另一種方式通過模擬觸摸動作事件並使用ObjectAnimator指定動畫持續時間,然後使控制滾動速度變爲true。

public class ViewPagerActivity extends FragmentActivity 
     implements View.OnClickListener, Animator.AnimatorListener { 

    private ViewPager mViewPager; 
    private View btnTriggerNext; 
    private View btnTriggerPrev; 

    @Override 
    protected void onCreate(...) { 
     super...; 
     setContentView(R.layout.layout_xml); 

     mViewPager = findViewById(...); 

     btnTriggerNext = findViewById(R.id.btnTriggerNext); 
     btnTriggerNext.setOnClickListener(this); 

     btnTriggerPrev = findViewById(R.id.btnTriggerPrev); 
     btnTriggerPrev.setOnClickListener(this); 
    } 

    private boolean mIsInAnimation; 
    private long mMotionBeginTime; 
    private float mLastMotionX; 

    @Override 
    public void onClick(View v) { 
     if (mIsInAnimation) return; 
     ObjectAnimator anim; 

     if (v == btnTriggerPrev) { 
      if (!hasPrevPage()) return; 
      anim = ObjectAnimator.ofFloat(this, "motionX", 0, mViewPager.getWidth()); 
     } 
     else if (v == btnTriggerNext) { 
      if (!hasNextPage()) return; 
      anim = ObjectAnimator.ofFloat(this, "motionX", 0, -mViewPager.getWidth()); 
     } 
     else return; 

     anim.setInterpolator(new LinearInterpolator()); 
     anim.addListener(this); 
     anim.setDuration(300); 
     anim.start(); 
    } 

    public void setMotionX(float motionX) { 
     if (!mIsInAnimation) return; 
     mLastMotionX = motionX; 
     final long time = SystemClock.uptimeMillis(); 
     simulate(MotionEvent.ACTION_MOVE, mMotionBeginTime, time); 
    } 

    @Override 
    public void onAnimationEnd(Animator animation) { 
     mIsInAnimation = false; 
     final long time = SystemClock.uptimeMillis(); 
     simulate(MotionEvent.ACTION_UP, mMotionBeginTime, time); 
    } 

    @Override 
    public void onAnimationStart(Animator animation) { 
     mLastMotionX = 0; 
     mIsInAnimation = true; 
     final long time = SystemClock.uptimeMillis(); 
     simulate(MotionEvent.ACTION_DOWN, time, time); 
     mMotionBeginTime = time; 
    } 

    // method from http://stackoverflow.com/a/11599282/1294681 
    private void simulate(int action, long startTime, long endTime) { 
     // specify the property for the two touch points 
     MotionEvent.PointerProperties[] properties = new MotionEvent.PointerProperties[1]; 
     MotionEvent.PointerProperties pp = new MotionEvent.PointerProperties(); 
     pp.id = 0; 
     pp.toolType = MotionEvent.TOOL_TYPE_FINGER; 

     properties[0] = pp; 

     // specify the coordinations of the two touch points 
     // NOTE: you MUST set the pressure and size value, or it doesn't work 
     MotionEvent.PointerCoords[] pointerCoords = new MotionEvent.PointerCoords[1]; 
     MotionEvent.PointerCoords pc = new MotionEvent.PointerCoords(); 
     pc.x = mLastMotionX; 
     pc.pressure = 1; 
     pc.size = 1; 
     pointerCoords[0] = pc; 

     final MotionEvent ev = MotionEvent.obtain(
       startTime, endTime, action, 1, properties, 
       pointerCoords, 0, 0, 1, 1, 0, 0, 0, 0); 

     mViewPager.dispatchTouchEvent(ev); 
    } 

    private boolean hasPrevPage() { 
     return mViewPager.getCurrentItem() > 0; 
    } 

    private boolean hasNextPage() { 
     return mViewPager.getCurrentItem() + 1 < mViewPager.getAdapter().getCount(); 
    } 

    @Override 
    public void onAnimationCancel(Animator animation) { 
    } 

    @Override 
    public void onAnimationRepeat(Animator animation) { 
    } 
} 

原因它是模擬觸摸事件,所以請使用正確的時間(小於600毫秒纔會好看)做滾動,滾動時在進步,放下手指將停止,並導致一些錯誤。

+0

謝謝,保存了我的一天! – Harry

0

變化

pager.setCurrentItem(pager.getCurrentItem() + 1); 

pager.setCurrentItem(pager.getCurrentItem() + 1,true); 

這將調用方法setCurrentItem(int item,boolean smoothScroll)將順利滾動到提到item而不是立即轉換

+0

我已經試過了,它的速度如此之快... – Libathos