2014-05-15 20 views
13

Tôi có một ViewPager mà tôi muốn xoay tự động sau mỗi 5 giây, đồng thời cho phép người dùng cũng vuốt. Tuy nhiên, khi tôi đặt thay đổi tự động, hoạt ảnh chuyển tiếp giữa các trang diễn ra rất nhanh và tôi muốn điều này chậm hơn.Thay đổi tốc độ chuyển đổi của ViewPager và setCurrentItem

Tôi đã nhìn thấy câu trả lời cho câu hỏi này ở đây

Slowing speed of Viewpager controller in android

nhưng tất cả đều sử dụng phản ánh. Có ai biết về bất kỳ cách nào làm chậm tốc độ tự động của một ViewPager mà không sử dụng phản ánh?

Tôi đã nghĩ đến việc sử dụng Trình dịch PageTransformer, nhưng không chắc liệu điều đó có hiệu quả hay không và cũng có thể ảnh hưởng đến tốc độ nếu người dùng đã quét cũng như tốc độ tự động không? Trừ khi tôi bằng cách nào đó có thể phát hiện sự khác biệt, và sau đó làm một hoặc một PageTransformation?

Trả lời

19

Sử dụng này tùy View

public class ViewPagerCustomDuration extends ViewPager { 
private FixedSpeedScroller mScroller = null; 

public ViewPagerCustomDuration(Context context) { 
    super(context); 
    init(); 
} 

public ViewPagerCustomDuration(Context context, AttributeSet attrs) { 
    super(context, attrs); 
    init(); 
} 

/* 
* Override the Scroller instance with our own class so we can change the 
* duration 
*/ 
private void init() { 
    try { 
     Class<?> viewpager = ViewPager.class; 
     Field scroller = viewpager.getDeclaredField("mScroller"); 
     scroller.setAccessible(true); 
     mScroller = new FixedSpeedScroller(getContext(), 
       new DecelerateInterpolator()); 
     scroller.set(this, mScroller); 
    } catch (Exception ignored) { 
    } 
} 

/* 
* Set the factor by which the duration will change 
*/ 
public void setScrollDuration(int duration) { 
    mScroller.setScrollDuration(duration); 
} 

private class FixedSpeedScroller extends Scroller { 

    private int mDuration = 500; 

    public FixedSpeedScroller(Context context) { 
     super(context); 
    } 

    public FixedSpeedScroller(Context context, Interpolator interpolator) { 
     super(context, interpolator); 
    } 

    public FixedSpeedScroller(Context context, Interpolator interpolator, boolean flywheel) { 
     super(context, interpolator, flywheel); 
    } 

    @Override 
    public void startScroll(int startX, int startY, int dx, int dy, int duration) { 
     // Ignore received duration, use fixed one instead 
     super.startScroll(startX, startY, dx, dy, mDuration); 
    } 

    @Override 
    public void startScroll(int startX, int startY, int dx, int dy) { 
     // Ignore received duration, use fixed one instead 
     super.startScroll(startX, startY, dx, dy, mDuration); 
    } 

    public void setScrollDuration(int duration) { 
     mDuration = duration; 
    } 
} 
} 
+0

Cảm ơn người đàn ông, bạn đã cứu tôi hôm nay – Ezio

+1

Tôi không thực sự nhớ tại sao tôi hỏi điều này hoặc cách tôi giải quyết nó, nhưng câu trả lời này có đủ bọ ve, rằng tôi sẵn sàng chấp nhận nó như một câu trả lời đúng. Ngoài ra, @Ezio dường như nghĩ rằng nó hoạt động: D –

2

sử dụng tùy chọn hẹn giờ theo lịch để tự động xoay trang.

int i = 0; 
static Timer timer = new Timer(); 

//Scroller scroll = new Scroller(this); 

@Override 
protected void onCreate(Bundle savedInstanceState) { 

    super.onCreate(savedInstanceState); 

    setContentView(R.layout.simple_circles); 

    mAdapter = new TestFragmentAdapter(getSupportFragmentManager()); 

    mPager = (ViewPager) findViewById(R.id.pager); 

    mPager.setAdapter(mAdapter); 

    mIndicator = (CirclePageIndicator) findViewById(R.id.indicator); 

    mIndicator.setViewPager(mPager); 

    mPager.setCurrentItem(i); 

    SwitchPage(3); 


    } 

public void SwitchPage(int seconds) 

{

if(timer != null) 
{ 
    timer.cancel(); 
} 

timer = new Timer(); // At this line a new Thread will be created 

timer.schedule(new SwitchPageTask(), 
2000, seconds * 2000);    
// delay in milliseconds 
} 


class SwitchPageTask extends TimerTask 
{ 

@Override 
public void run() { 

    runOnUiThread(new Runnable() { 

     public void run() { 

      if(i < mAdapter.getCount()) 

      { 

       i++; 

       mPager.setCurrentItem(i, true); 

      } 
      else 
      { 

       i=0; 

       mPager.setCurrentItem(i, true); 
      } 
     } 
    }); 
} 
} 

just cancel the timer like.. timer.cancel().. or 
cancel timer from another activity or fragment activity.. 

    textView1_page3.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View v) { 

       if (SampleCirclesDefault.timer != null) { 
        SampleCirclesDefault.timer.cancel(); 
        Toast.makeText(getActivity(), "timer 
        cancled", 1).show(); 
       } 

      } 
     }); 
+0

harikrishnan nhìn qua mã của bạn có vẻ như thay đổi của bạn sự chậm trễ trong giữa sự thay đổi. Đó không phải là những gì tôi có vấn đề. Tôi nghĩ rằng hình ảnh động thực tế của quá trình chuyển đổi tự động quá nhanh, gần như ngay lập tức, tôi muốn nó di chuyển từ một hình ảnh sang hình ảnh chậm hơn tiếp theo, không phải lúc chênh lệch thời gian khác nhau. Tôi sẽ cập nhật câu hỏi ban đầu của mình để làm rõ hơn. –

Các vấn đề liên quan