অ্যান্ড্রয়েডে ভিউপেজার নিয়ামকের ধীর গতি


104

অ্যান্ড্রয়েডে ভিউপ্যাজার অ্যাডাপ্টারের সাহায্যে স্ক্রোলের গতি ধীর করার কোনও উপায় আছে কি?


আপনি জানেন, আমি এই কোডটি দেখছি। আমি কী ভুল বললাম তা বুঝতে পারি না।

try{ 
    Field mScroller = mPager.getClass().getDeclaredField("mScroller"); 
    mScroller.setAccessible(true); 
    Scroller scroll = new Scroller(cxt);
    Field scrollDuration = scroll.getClass().getDeclaredField("mDuration");
    scrollDuration.setAccessible(true);
    scrollDuration.set(scroll, 1000);
    mScroller.set(mPager, scroll);
}catch (Exception e){
    Toast.makeText(cxt, "something happened", Toast.LENGTH_LONG).show();
} 

এটি কিছু পরিবর্তন করে না এখনও কোনও ব্যতিক্রম ঘটে না?



1
child.setNestedScrollingEnabled(false);আমার জন্য কাজ করেছেন
পিয়েরে

উত্তর:


230

আমি হাইফ্লায়ারের কোড দিয়ে শুরু করেছি যা প্রকৃতপক্ষে এমস্ক্রোলার ক্ষেত্রটি পরিবর্তিত করেছে (যা দুর্দান্ত শুরু) তবে স্ক্রোলটির সময়কাল বাড়াতে সাহায্য করেনি কারণ ভিউপ্যাজার স্পষ্টভাবে এমএসক্রোলারের সাথে সময়সীমাটি পাস করার সময় অনুরোধ করেছিল।

ভিউপ্যাজার প্রসারিত করা গুরুত্বপূর্ণ পদ্ধতি হিসাবে কার্যকর হয়নি (স্মুথস্ক্রোলটো) ওভাররাইড করা যায় না।

আমি এই কোড সহ স্ক্রোলার প্রসারিত করে এটি ঠিক করেছি:

public class FixedSpeedScroller extends Scroller {

    private int mDuration = 5000;

    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);
    }
}

এবং এটি এর মতো ব্যবহার করে:

try {
    Field mScroller;
    mScroller = ViewPager.class.getDeclaredField("mScroller");
    mScroller.setAccessible(true); 
    FixedSpeedScroller scroller = new FixedSpeedScroller(mPager.getContext(), sInterpolator);
    // scroller.setFixedDuration(5000);
    mScroller.set(mPager, scroller);
} catch (NoSuchFieldException e) {
} catch (IllegalArgumentException e) {
} catch (IllegalAccessException e) {
}

আমি মূলত সময়কালটি 5 সেকেন্ডে হার্ডকড করেছি এবং আমার ভিউপাগারটি এটি ব্যবহার করতে সক্ষম করেছি।

আশাকরি এটা সাহায্য করবে.


16
আপনি কি দয়া করে আমাকে বলতে পারবেন সিনটারপোলটার কি ??
শশাঙ্ক দেবগোরকর

10
'ইন্টারপোলটর' হ'ল হার যা অ্যানিমেশনগুলি চালিত হয়, যেমন তারা ত্বরান্বিত করতে পারে, হ্রাস করতে পারে এবং আরও অনেক কিছু করতে পারে। একটি ইন্টারপোলটার ছাড়াই একজন কনস্ট্রাক্টর রয়েছেন, আমি মনে করি এটি কাজ করা উচিত, তাই কেবল কল থেকে সেই যুক্তি সরিয়ে দেওয়ার চেষ্টা করুন। যদি এটি কাজ না করে, যোগ করুন: 'ইন্টারপোলটার sInterpolator = নতুন এক্সিলারেটর ইন্টারপোলটার ()'
মারমোর

8
আমি এই ক্ষেত্রে আরও ভাল কাজ করার জন্য ডিসলেরেটইনটারপোলটারকে পেয়েছি, এটি প্রাথমিক সোয়াইপের গতি বজায় রাখে এবং তারপরে ধীরে ধীরে হ্রাস পাবে।
কুইন্ট স্টফার্স

হাই, আপনার কোনও ধারণা আছে কেন scroller.setFixedDuration(5000);ত্রুটি দেয়? এতে বলা হয়েছে "পদ্ধতিটি ফিক্সডডিউরেশন (ইনট্রি)
অপরিজ্ঞাত করা হয়েছে

6
আপনি proguard ব্যবহার করছেন এই লাইন যোগ করতে ভুলবেন না থাকে তাহলে: -keep বর্গ android.support.v4 ** {*;} অন্যথায় আপনি নাল পয়েন্টার পাবেন যখন getDeclaredField ()।
GuilhE

61

আমি নিজে করতে চেয়েছিলাম এবং একটি সমাধান অর্জন করেছি (তবে প্রতিচ্ছবি ব্যবহার করে)। এটি গৃহীত সমাধানের মতো তবে একই ইন্টারপোলটর ব্যবহার করে এবং কেবল কোনও ফ্যাক্টরের উপর ভিত্তি করে সময়কাল পরিবর্তন করে। ViewPagerCustomDurationআপনার পরিবর্তে আপনার এক্সএমএলটিতে একটি ব্যবহার ViewPagerকরতে হবে এবং তারপরে আপনি এটি করতে পারেন:

ViewPagerCustomDuration vp = (ViewPagerCustomDuration) findViewById(R.id.myPager);
vp.setScrollDurationFactor(2); // make the animation twice as slow

ViewPagerCustomDuration.java:

import android.content.Context;
import android.support.v4.view.ViewPager;
import android.util.AttributeSet;
import android.view.animation.Interpolator;

import java.lang.reflect.Field;

public class ViewPagerCustomDuration extends ViewPager {

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

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

    private ScrollerCustomDuration mScroller = null;

    /**
     * Override the Scroller instance with our own class so we can change the
     * duration
     */
    private void postInitViewPager() {
        try {
            Class<?> viewpager = ViewPager.class;
            Field scroller = viewpager.getDeclaredField("mScroller");
            scroller.setAccessible(true);
            Field interpolator = viewpager.getDeclaredField("sInterpolator");
            interpolator.setAccessible(true);

            mScroller = new ScrollerCustomDuration(getContext(),
                    (Interpolator) interpolator.get(null));
            scroller.set(this, mScroller);
        } catch (Exception e) {
        }
    }

    /**
     * Set the factor by which the duration will change
     */
    public void setScrollDurationFactor(double scrollFactor) {
        mScroller.setScrollDurationFactor(scrollFactor);
    }

}

ScrollerCustomDuration.java:

import android.annotation.SuppressLint;
import android.content.Context;
import android.view.animation.Interpolator;
import android.widget.Scroller;

public class ScrollerCustomDuration extends Scroller {

    private double mScrollFactor = 1;

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

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

    @SuppressLint("NewApi")
    public ScrollerCustomDuration(Context context, Interpolator interpolator, boolean flywheel) {
        super(context, interpolator, flywheel);
    }

    /**
     * Set the factor by which the duration will change
     */
    public void setScrollDurationFactor(double scrollFactor) {
        mScrollFactor = scrollFactor;
    }

    @Override
    public void startScroll(int startX, int startY, int dx, int dy, int duration) {
        super.startScroll(startX, startY, dx, dy, (int) (duration * mScrollFactor));
    }

}

আশা করি এটি কাউকে সাহায্য করবে!


3
আমি এই সমাধানটি গ্রহণযোগ্য উত্তরের চেয়ে ভাল পছন্দ করি কারণ কাস্টম ভিউপ্যাজারটি বিদ্যমান কোডে ন্যূনতম পরিবর্তন সহ একটি ড্রপ-ইন শ্রেণি। কাস্টম ভিউপ্যাজারের স্থিতিশীল অভ্যন্তর শ্রেণি হিসাবে কাস্টম স্ক্রোলার থাকা এটি আরও বেশি এনক্যাপসুলেটেড করে তোলে।
ইমানুয়েল মোইকলিন

1
আপনি proguard ব্যবহার করছেন এই লাইন যোগ করতে ভুলবেন না থাকে তাহলে: -keep বর্গ android.support.v4 ** {*;} অন্যথায় আপনি নাল পয়েন্টার পাবেন যখন getDeclaredField ()।
GuilhE

আমি কোনও ত্রৈমাসিকের সাথে আপডেট করার পরামর্শ দিচ্ছি, কারণ আপনি কাউকে 0 টি ফ্যাক্টারে যাওয়ার অনুমতি দিতে চান না, এটি আপনার সময়কালটি ভেঙে দেবে। আপনি এমস্ক্রোলফ্যাক্টর> 0 এ যাচ্ছেন তা চূড়ান্ত প্যারামিটার আপডেট করুন? (ইনট) (সময়কাল * এমস্ক্রোলফ্যাক্টর): সময়কাল
পোর্টফোলিওবিল্ডার

আমি আরও পরামর্শ দিচ্ছি যে আপনি শ্রেণিতে স্ক্রোল ফ্যাক্টর, ভিউপেজারকাস্টমডুরেশন নির্ধারণের সময় নাল চেক করবেন। আপনি mScroller দিয়ে নাল বস্তু হিসাবে ইনস্ট্যান্ট করেন, আপনাকে অবশ্যই নিশ্চিত করতে হবে যে object বস্তুর উপর স্ক্রোল ফ্যাক্টর সেট করার চেষ্টা করার সময় এটি এখনও নাল নয়।
পোর্টফোলিওবিল্ডার

@ পোর্টফোলিওবিল্ডার বৈধ মন্তব্যসমূহ, যদিও মনে হয় আপনি এটির চেয়ে বেশি সুরক্ষামূলক প্রোগ্রামিং শৈলীর পক্ষে রয়েছেন যা আইএমও এসও-র একটি স্নিপেটের চেয়ে অস্বচ্ছ লাইব্রেরিগুলির জন্য বেশি উপযুক্ত। স্ক্রোল ফ্যাক্টরটিকে <= 0 তে সেট করার পাশাপাশি একটি ইনস্ট্যান্টিস্টেট ভিউতে সেটস্ক্রোলডিউরেশনফ্যাক্টর কল করা এমন একটি জিনিস যা বেশিরভাগ অ্যান্ড্রয়েড ডিভাস রানটাইম চেক ছাড়াই করা এড়াতে সক্ষম হওয়া উচিত।
ওলেগ ভাস্কেভিচ

43

@ Df778899 এর উত্তর এবং অ্যান্ড্রয়েড ভ্যালুএনিমেটর API এর ভিত্তিতে আমি আরও ভাল সমাধান পেয়েছি । এটি প্রতিবিম্ব ছাড়াই সূক্ষ্মভাবে কাজ করে এবং খুব নমনীয়। এছাড়াও কাস্টম ভিউপেজার তৈরি করার এবং এটিকে android.support.v4.view প্যাকেজের মধ্যে রাখার দরকার নেই। এখানে একটি উদাহরণ:

private void animatePagerTransition(final boolean forward) {

    ValueAnimator animator = ValueAnimator.ofInt(0, viewPager.getWidth() - ( forward ? viewPager.getPaddingLeft() : viewPager.getPaddingRight() ));
    animator.addListener(new Animator.AnimatorListener() {
        @Override
        public void onAnimationStart(Animator animation) {
        }

        @Override
        public void onAnimationEnd(Animator animation) {
            viewPager.endFakeDrag();
        }

        @Override
        public void onAnimationCancel(Animator animation) {
            viewPager.endFakeDrag();
        }

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

    animator.setInterpolator(new AccelerateInterpolator());
    animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {

        private int oldDragPosition = 0;

        @Override
        public void onAnimationUpdate(ValueAnimator animation) {
            int dragPosition = (Integer) animation.getAnimatedValue();
            int dragOffset = dragPosition - oldDragPosition;
            oldDragPosition = dragPosition;
            viewPager.fakeDragBy(dragOffset * (forward ? -1 : 1));
        }
    });

    animator.setDuration(AppConstants.PAGER_TRANSITION_DURATION_MS);
    viewPager.beginFakeDrag();
    animator.start();
}

7
আমি মনে করি এটি আন্ডাররেটেড। এটা তোলে ব্যবহার করে startFakeDragএবং endFakeDragযা অধিক পাওয়া যায় করছেন জন্য হতে বোঝানো হয় ViewPagerবাক্সের বাইরে। এটি আমার পক্ষে দুর্দান্ত কাজ করে এবং ঠিক আমি যা খুঁজছিলাম
ইউজার 3280133

1
এটি একটি দুর্দান্ত সমাধান, আপনাকে ধন্যবাদ। একটি ছোট বর্ধন, যদিও: প্যাডিং সহ একটি ভিউপাগারের জন্য এটি কাজ করার জন্য, প্রথম লাইনটি হওয়া উচিত ... ValueAnimator.ofInt (0, viewPager.getWidth () - এগিয়ে ));
দিমিত্রিও

1
এটি এতদূর সরল / কার্যকর / দায়বদ্ধ সমাধান যেহেতু এটি প্রতিফলনকে উপেক্ষা করে এবং উপরের সমাধানগুলির মতো সিল লঙ্ঘন
রায়ান

2
@ ল্যাবজিক, আপনি আপনার animatePagerTransition(final boolean forwardপদ্ধতিটি ঠিক কোথায় বলছেন ? এ নিয়েই আমি বিভ্রান্ত। আপনি কি কোনও ViewPager.OnPageChangeListenerইন্টারফেস পদ্ধতিতে এটি কল করেন ? নাকি অন্য কোথাও?
সাকিবয়

কোনও কুৎসিত প্রতিচ্ছবি হ্যাক নেই। সহজেই কনফিগারযোগ্য। খুব ভাল উত্তর।
ওরেন

18

যেমন আপনি পারেন ভিউপাগার উত্সগুলিতে দেখতে পাচ্ছেন , এমএসক্রোলার অবজেক্ট দ্বারা নিয়ন্ত্রিত হওয়ার সময়কাল। ইন documantation আমরা পড়তে পারেন:

স্ক্রোলটির সময়কাল কনস্ট্রাক্টরে পাস হতে পারে এবং স্ক্রোলিং অ্যানিমেশনটি সর্বাধিক সময় নিতে হবে তা সুনির্দিষ্ট করে

সুতরাং, আপনি গতি নিয়ন্ত্রণ করতে চান, আপনি প্রতিবিম্ব মাধ্যমে এমএসক্রোলার অবজেক্ট পরিবর্তন করতে পারেন।

আপনার এই জাতীয় কিছু লেখা উচিত:

setContentView(R.layout.main);
mPager = (ViewPager)findViewById(R.id.view_pager);
Field mScroller = ViewPager.class.getDeclaredField("mScroller");   
mScroller.setAccessible(true);
mScroller.set(mPager, scroller); // initialize scroller object by yourself 

এটি কীভাবে করা যায় সে সম্পর্কে আমি কিছুটা বিভ্রান্ত হয়েছি - আমি এক্সএমএল ফাইলটিতে ভিউপাগারটি সেটআপ করছি এবং আমি এটি একটি এমপগারকে অর্পণ করেছি, এবং সেটএডাপ্টার (এমএডাপ্টার) সেট করব ... আমার কি এমন কোনও শ্রেণি তৈরি করা উচিত যা ভিউপ্যাজারটি প্রসারিত করে?
অ্যালেক্স কেলি

12
আপনার এই জাতীয় কিছু লেখা উচিত: setContentView (R.layout.main); এমপাগার = (ভিউপাগার) সন্ধান ভিউবিআইআইডি (আর.আইডি.ভিউ_পেজার); ফিল্ড এমস্ক্রোলার = ভিউপ্যাজার.ক্লাস.সেটডেক্লেয়ার্ডফিল্ড ("এমএসক্রোলার"); mScroller.setAccessible (সত্য); mScroller.set (এমপেইজার, স্ক্রোলার); // নিজেই স্ক্রোলার অবজেক্টটি আরম্ভ করুন
হাইফ্লায়ার

আমি কেবল আরও একটি উত্তর পোস্ট করেছি ... এটি কাজ করছে না ... আমাকে দিকনির্দেশনা দেওয়ার জন্য কিছুটা সময় লাগবে কেন না?
অ্যালেক্স কেলি

উত্সগুলি আরও যত্ন সহকারে দেখার পরে: mScroller.startScrol (sx, sy, dx, dy) সন্ধান করুন; ভিউপ্যাজার উত্সে এবং স্ক্রোলার উপলব্ধির দিকে নজর দিন। স্টার্টস্রোকল অন্য স্টার্টস্রোকলকে ডিএএফএএলএলডিডিআরএল প্যারামিটারের সাথে কল করে। স্থির চূড়ান্ত ক্ষেত্রের জন্য অন্য মান তৈরি করা অসম্ভব, সুতরাং একটি সুযোগ বাকি - ভিউপ্যাজারের স্মুথস্ক্রোলটি ওভাররাইড করুন
হাইফ্লায়ার

16

এটি নিখুঁত সমাধান নয়, আপনি বেগকে ধীর করতে পারবেন না কারণ এটি একটি int। তবে আমার জন্য এটি যথেষ্ট ধীর এবং আমার প্রতিবিম্ব ব্যবহার করতে হবে না।

ক্লাসটি কোথায় রয়েছে তা প্যাকেজটি লক্ষ্য করুন। smoothScrollToপ্যাকেজ দৃশ্যমানতা আছে।

package android.support.v4.view;

import android.content.Context;
import android.util.AttributeSet;

public class SmoothViewPager extends ViewPager {
    private int mVelocity = 1;

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

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

    @Override
    void smoothScrollTo(int x, int y, int velocity) {
        //ignore passed velocity, use one defined here
        super.smoothScrollTo(x, y, mVelocity);
    }
}

লক্ষ্য করুন যে প্রথম লাইন: "প্যাকেজ android.support.v4.view;" বাধ্যতামূলক এবং আপনার এসআরসি রুটে আপনার এমন প্যাকেজ তৈরি করা উচিত। আপনি যদি এটি না করেন তবে আপনার কোডটি সংকলন করবে না।
এলহানান মিশ্রকি

3
@ ইলহানমিশ্রাকি ঠিক, আমি এটাই বোঝাতে চাইছিলাম Notice the package where the class is
পাওয়েলজিবা

3
অপেক্ষা করুন, অপেক্ষা করুন, অপেক্ষা করুন, অপেক্ষা করুন ... উউউউউট? আপনি এসডিকে package-local fields/ ব্যবহার করতে পারেন methods, আপনি যদি কেবল অ্যান্ড্রয়েড স্টুডিওকে মনে করেন যে আপনি একই প্যাকেজটি ব্যবহার করছেন? আমিই কি একমাত্র কারও গন্ধ পাচ্ছি sealing violation?
বারটেক লিপিনস্কি

এটি একটি দুর্দান্ত সমাধান, তবে ভিউপেজার স্ক্রোলার দ্বারা ব্যবহৃত ইন্টারপোল্টর যেহেতু এই ক্ষেত্রে ভাল আচরণ করে না এটি আমার পক্ষে কাজ করে না। সুতরাং আমি এমসক্রোলারটি পেতে প্রতিবিম্বটি ব্যবহার করে অন্যদের সাথে আপনার সমাধানটি একত্রিত করেছি। এইভাবে, ব্যবহারকারী যখন প্যাগিনেট করে তখন আমি মূল স্ক্রোলার এবং সেট কন্ট্রোল আইটেম () এর মাধ্যমে প্রোগ্রামিকভাবে পৃষ্ঠা পরিবর্তন করি যখন আমার কাস্টম স্ক্রোলার ব্যবহার করতে পারি।
রোলগালান

8

ভিউপ্যাজারে নকলড্রেগ পদ্ধতিগুলি একটি বিকল্প সমাধান সরবরাহ করে বলে মনে হচ্ছে।

উদাহরণস্বরূপ এটি আইটেম 0 থেকে 1 পর্যন্ত পৃষ্ঠা:

rootView.setOnClickListener(new OnClickListener() {
  @Override
  public void onClick(View v) {
      ViewPager pager = (ViewPager) getActivity().findViewById(R.id.pager);
      //pager.setCurrentItem(1, true);
      pager.beginFakeDrag();
      Handler handler = new Handler();
      handler.post(new PageTurner(handler, pager));
  }
});


private static class PageTurner implements Runnable {
  private final Handler handler;
  private final ViewPager pager;
  private int count = 0;

  private PageTurner(Handler handler, ViewPager pager) {
    this.handler = handler;
    this.pager = pager;
  }

  @Override
  public void run() {
    if (pager.isFakeDragging()) {
      if (count < 20) {
        count++;
        pager.fakeDragBy(-count * count);
        handler.postDelayed(this, 20);
      } else {
        pager.endFakeDrag();
      }
    }
  }
}

( count * countটেনে আনার গতি বাড়ানোর জন্য কেবল সেখানে রয়েছে)


4

আমি ব্যবহার করেছি

DecelerateInterpolator ()

এখানে উদাহরণ:

  mViewPager = (ViewPager) findViewById(R.id.container);
            mViewPager.setAdapter(mSectionsPagerAdapter);
            Field mScroller = null;
            try {
                mScroller = ViewPager.class.getDeclaredField("mScroller");
                mScroller.setAccessible(true);
                Scroller scroller = new Scroller(this, new DecelerateInterpolator());
                mScroller.set(mViewPager, scroller);
            } catch (NoSuchFieldException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }

2

গৃহীত সমাধানের ভিত্তিতে আমি ভিউ পেজারের জন্য এক্সটেনশন সহ কোটলিন শ্রেণি তৈরি করেছি। উপভোগ করুন! :)

class ViewPageScroller : Scroller {

    var fixedDuration = 1500 //time to scroll in milliseconds

    constructor(context: Context) : super(context)

    constructor(context: Context, interpolator: Interpolator) : super(context, interpolator)

    constructor(context: Context, interpolator: Interpolator, flywheel: Boolean) : super(context, interpolator, flywheel)


    override fun startScroll(startX: Int, startY: Int, dx: Int, dy: Int, duration: Int) {
        // Ignore received duration, use fixed one instead
        super.startScroll(startX, startY, dx, dy, fixedDuration)
    }

    override fun startScroll(startX: Int, startY: Int, dx: Int, dy: Int) {
        // Ignore received duration, use fixed one instead
        super.startScroll(startX, startY, dx, dy, fixedDuration)
    }
}

fun ViewPager.setViewPageScroller(viewPageScroller: ViewPageScroller) {
    try {
        val mScroller: Field = ViewPager::class.java.getDeclaredField("mScroller")
        mScroller.isAccessible = true
        mScroller.set(this, viewPageScroller)
    } catch (e: NoSuchFieldException) {
    } catch (e: IllegalArgumentException) {
    } catch (e: IllegalAccessException) {
    }

}

1

সম্পূর্ণ ভিন্ন পদ্ধতির সাহায্যে এখানে একটি উত্তর দেওয়া হয়েছে। কেউ বলতে পারে এটির একটি হ্যাকি অনুভূতি রয়েছে; তবে এটি প্রতিবিম্ব ব্যবহার করে না এবং আমি যুক্তি দিয়ে বলব যে এটি সর্বদা কার্যকর হবে।

আমরা নীচের কোডটি ভিতরে খুঁজে পাই ViewPager.smoothScrollTo:

    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);

এটি কয়েকটি জিনিসের ভিত্তিতে সময়কাল গণনা করে। আমরা নিয়ন্ত্রণ করতে পারি এমন কিছু দেখুন? mAdapter.getPageWidth। আসুন আমাদের অ্যাডাপ্টারে ViewPager.OnPageChangeListener বাস্তবায়ন করি । ভিউপ্যাজারটি যখন স্ক্রোল করছে তখন আমরা সনাক্ত করতে যাচ্ছি এবং প্রস্থের জন্য একটি নকল মান দেব । যদি আমি সময়কাল হতে চান k*100, তাহলে আমি ফিরে আসব 1.0/(k-1)জন্য getPageWidth। নীচে অ্যাডাপ্টারের এই অংশটির কোটলিন ইমপ্লিট যা সময়কালকে 400 এ পরিবর্তিত করে:

    var scrolling = false
    override fun getPageWidth(position: Int): Float {
        return if (scrolling) 0.333f else 1f
    }

    // OnPageChangeListener to detect scroll state
    override fun onPageScrollStateChanged(state: Int) {
        scrolling = state == ViewPager.SCROLL_STATE_SETTLING
    }

    override fun onPageScrolled(position: Int, positionOffset: Float, positionOffsetPixels: Int) {
    }

    override fun onPageSelected(position: Int) {
    }

অনপেজ চ্যাঞ্জডলিস্টনার হিসাবে অ্যাডাপ্টার যুক্ত করতে ভুলবেন না।

আমার বিশেষ কেসটি নিরাপদে ধরে নিতে পারে যে ব্যবহারকারী পৃষ্ঠাগুলির মধ্যে টানতে সোয়াইপ করতে পারবেন না। যদি আপনাকে কোনও টেনে আনার পরে স্থিতি সমর্থন করতে হয় তবে আপনার গণনায় আপনার আরও কিছু করা দরকার।

একটি খারাপ দিক হ'ল এটি ভিউপ্যাজারের সেই হার্ডকোডযুক্ত 100বেস সময়কাল মানের উপর নির্ভর করে । যদি এটি পরিবর্তিত হয়, তবে আপনার সময়কালগুলি এই পদ্ধতির সাথে পরিবর্তিত হবে।


0
                binding.vpTour.beginFakeDrag();
                lastFakeDrag = 0;
                ValueAnimator va = ValueAnimator.ofInt(0, binding.vpTour.getWidth());
                va.setDuration(1000);
                va.addUpdateListener(animation -> {
                    if (binding.vpTour.isFakeDragging()) {
                        int animProgress = (Integer) animation.getAnimatedValue();
                        binding.vpTour.fakeDragBy(lastFakeDrag - animProgress);
                        lastFakeDrag = animProgress;
                    }
                });
                va.addListener(new AnimatorListenerAdapter() {
                    @Override
                    public void onAnimationEnd(Animator animation) {
                        super.onAnimationEnd(animation);
                        if (binding.vpTour.isFakeDragging()) {
                            binding.vpTour.endFakeDrag();
                        }
                    }
                });
                va.start();

আমি আপনার সবার মত একই সমস্যাটি সমাধান করতে চেয়েছিলাম এবং এটিই একই সমস্যার জন্য আমার সমাধান, তবে আমি মনে করি এইভাবে সমাধানটি আরও নমনীয় কারণ আপনি নিজের পছন্দসই সময়কালটি পরিবর্তন করতে এবং পছন্দসই মূল্যবোধের বিভাজনকেও পরিবর্তন করতে পারবেন বিভিন্ন চাক্ষুষ প্রভাব অর্জন করতে। আমার সমাধান পৃষ্ঠায় "1" থেকে পৃষ্ঠা "2" তে স্যুইপ করে, তাই কেবলমাত্র বৃদ্ধি পজিশনে, তবে "লাস্টফেকড্র্যাগ - অ্যানিমগ্রোগ্রেস" এর পরিবর্তে "অ্যানিমপ্রোগ্রেস - লাস্টফেকড্র্যাগ" করে হ্রাস পজিশনে যেতে সহজেই পরিবর্তন করা যেতে পারে। আমি মনে করি এটি এই কার্য সম্পাদনের জন্য সবচেয়ে নমনীয় সমাধান।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.