ViewPager+seekBar的联动效果

1,853 阅读1分钟


主要实现的效果是,拖动seekbar的时候,viewpager跟随滑动。

拖动Viewpager的时候,seekbar进度条跟随滑动。

直接上代码

<android.support.v4.view.ViewPager
    android:id="@+id/viewpager"
    android:layout_width="match_parent"
    android:layout_height="150dp"
    >
</android.support.v4.view.ViewPager>

<SeekBar
    android:layout_marginTop="20dp"
    android:id="@+id/progress"
    android:layout_width="match_parent"
    android:layout_height="20dp"
    android:max="100"
    />

主要是两个监听

viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
    @Override
    public void onPageScrolled(int i, float v, int i1) {
        seekBar.setProgress((int)((i+1+v)*a));
    }

    @Override
    public void onPageSelected(int i) {
        seekBar.setProgress((int)((i+1)*a));

    }

    @Override
    public void onPageScrollStateChanged(int i) {

    }
});

seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
    @Override
    public void onProgressChanged(SeekBar seekBar, int i, boolean b) {
        if (viewPager.isFakeDragging()){
            int offset = (int)((maxOffset/100.0)*i);
            int dragby = offset - currentOffset;
            viewPager.fakeDragBy(dragby);

            currentOffset = offset;
        }
    }

    @Override
    public void onStartTrackingTouch(SeekBar seekBar) {
        maxOffset = viewPager.getWidth();
        viewPager.beginFakeDrag();
    }

    @Override
    public void onStopTrackingTouch(SeekBar seekBar) {
        viewPager.endFakeDrag();

    }
});

完整代码

public class MainActivity extends AppCompatActivity{
    private SeekBar seekBar;
    private ViewPager viewPager;
    int maxOffset;
    int currentOffset;
    private int[] imageRIds = {
            R.drawable.a,
            R.drawable.b,
            R.drawable.c,
            R.drawable.d,
            R.drawable.e,
    };
    float a;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        a = (float)100/imageRIds.length;
        viewPager = findViewById(R.id.viewpager);
        seekBar = findViewById(R.id.progress);

        viewPager.setAdapter(new BannerAdapter(imageRIds));
        viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            @Override
            public void onPageScrolled(int i, float v, int i1) {
                seekBar.setProgress((int)((i+1+v)*a));
            }

            @Override
            public void onPageSelected(int i) {
                seekBar.setProgress((int)((i+1)*a));

            }

            @Override
            public void onPageScrollStateChanged(int i) {

            }
        });

        seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
            @Override
            public void onProgressChanged(SeekBar seekBar, int i, boolean b) {
                if (viewPager.isFakeDragging()){
                    int offset = (int)((maxOffset/100.0)*i);
                    int dragby = offset - currentOffset;
                    viewPager.fakeDragBy(dragby);

                    currentOffset = offset;
                }
            }

            @Override
            public void onStartTrackingTouch(SeekBar seekBar) {
                maxOffset = viewPager.getWidth();
                viewPager.beginFakeDrag();
            }

            @Override
            public void onStopTrackingTouch(SeekBar seekBar) {
                viewPager.endFakeDrag();

            }
        });


    }

    public class BannerAdapter extends PagerAdapter{
        private int[] imageReaIds;

        public BannerAdapter(int[] imageReaIds){
            this.imageReaIds = imageReaIds;
        }

        @Override
        public int getCount() {
            return imageReaIds.length;
        }

        @Override
        public boolean isViewFromObject(@NonNull View view, @NonNull Object o) {
            return view == o;
        }

        @NonNull
        @Override
        public Object instantiateItem(@NonNull ViewGroup container, int position) {
            ImageView imageView = new ImageView(container.getContext());
            imageView.setBackgroundResource(imageReaIds[position]);
            container.addView(imageView);
            return imageView;
        }

        @Override
        public void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) {

            container.removeView((View)object);
        }
    }
}