Android自定义轮播效果(优化)

创作背景

本文是继上一篇 Android自定义轮播效果 优化问题而写,希望大家能有顺序的看。

优化一:实现自动无线轮播

private class myPagerAdapter extends PagerAdapter {
        @Override
        public int getCount() {
            //第一步:让基数很大
            return Integer.MAX_VALUE;
        }

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

        @NonNull
        @Override
        public Object instantiateItem(@NonNull ViewGroup container, int position) {
            ImageView iv = new ImageView(getApplicationContext());
            //第二步:取余数,防止超过 list 的长度
            iv.setImageResource(imgList.get(position%imgList.size()));
            container.addView(iv);
            return iv;
        }

        @Override
        public void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) {
            container.removeView((View) object);
        }
    }

//第三步:创建 Hnadler
private Handler mHandle = new Handler(){
        @Override
        public void handleMessage(@NonNull Message msg) {
            vp_my_viewpager.setCurrentItem(++mCurrentPage);
            mHandle.sendEmptyMessageDelayed(0,3000);
        }
    };

//第四步:实现轮播
@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        、、、

        //设置当前页数
        mCurrentPage = imgList.size() * 100;
        vp_my_viewpager.setCurrentItem(mCurrentPage);
        mHandle.sendEmptyMessageDelayed(0,3000);
    }

优化二:改变轮播的速度

 想改变 轮播的速度 目前 我只发现乐意中方法 就是通过反射的方式

说白了 其实是 自己重写 Scroller 中的 Duration ,然后把新的myScroller赋值给ViewPager

  • 第一步:创建 myScroller 类
package com.wust.myhorizontalscrollview;

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

public class myScroller extends Scroller {
    private int mDuration;
    public myScroller(Context context, Interpolator interpolator,int duration) {
        super(context, interpolator);
        this.mDuration = duration;
    }

    @Override
    public void startScroll(int startX, int startY, int dx, int dy, int duration) {
        super.startScroll(startX, startY, dx, dy, duration);
    }
}
  • 第二步:通过反射找到 myScroller
  • 第三步:设置值
//在setAdapter之后 设置myScroller
        try {
            //通过反射把这个字段找到
            Field field = vp_my_viewpager.getClass().getDeclaredField("mScroller");
            //把这个字段设置为可修改
            field.setAccessible(true);
            //创建自己的myScroller
            myScroller myScroller = new myScroller(this, new AccelerateInterpolator(), 2000);
            //修改值
            field.set(vp_my_viewpager,myScroller);
        } catch (Exception e) {
            e.printStackTrace();
        }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

super码王

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值