(Android)自动切换的ViewPager广告栏(带动画和切换速率控制)

总结了一下网上关于viewPager广告栏的文章自己写了一个demo,第一次写写的不好请多见谅。


首先贴上布局文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <RelativeLayout
        android:layout_width="wrap_content"
        android:layout_height="200dp">

        <android.support.v4.view.ViewPager
            android:id="@+id/my_pager"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />

        <LinearLayout
            android:id="@+id/viewpager_point"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentBottom="true"
            android:layout_centerHorizontal="true"
            android:layout_marginBottom="10dp"
            android:orientation="horizontal">
        </LinearLayout>
    </RelativeLayout>
</LinearLayout>
里面LinearLayout主要是为了放置小圆点

接下来是Activity文件

public class ViewpagerActivity extends Activity {
    private ViewPager pager;
    private LinearLayout layout;
    private List<Integer> data = new ArrayList<>();
    private FixedSpeedScroller mScroller;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_viewpager);
        pager = (ViewPager) findViewById(R.id.my_pager);
        layout = (LinearLayout) findViewById(R.id.viewpager_point);
        data.add(R.drawable.b);
        data.add(R.drawable.a);
        data.add(R.drawable.c);
        data.add(R.drawable.d);
        data.add(R.drawable.e);

        /*初始化设置切换速率的代码*/
        try {
            Field mField = ViewPager.class.getDeclaredField("mScroller");
            mField.setAccessible(true);
            mScroller = new FixedSpeedScroller(pager.getContext(), new AccelerateInterpolator());
            mField.set(pager, mScroller);
        } catch (Exception e) {
            e.printStackTrace();
        }



        MyPagerAdapter adapter = new MyPagerAdapter(this, pager,mScroller,layout);
        pager.setAdapter(adapter);
        pager.setPageTransformer(true, new ZoomOutPageTransformer());//设置切换时的动画
        adapter.refresh(data);//模拟获取网络数据后刷新adapter

    }
}

接下来是主要的Adapter代码

public class MyPagerAdapter extends PagerAdapter implements ViewPager.OnPageChangeListener {
    private List<Integer> data = new ArrayList<>();
    private LinearLayout layout;
    private ViewPager viewPager;
    private Context context;
    private Basehandler<MyPagerAdapter> handler = null;
    private FixedSpeedScroller scroller;

    public MyPagerAdapter(Context context, ViewPager viewPager, FixedSpeedScroller scroller, LinearLayout layout) {
        this.context = context;
        this.viewPager = viewPager;
        this.scroller = scroller;
        this.layout = layout;
        viewPager.setOnPageChangeListener(this);
        handler = new Basehandler<MyPagerAdapter>(this) {
            @Override
            public void handleMessage(Message msg) {
                if (reference != null && reference.get() != null) {
                    reference.get().handlerMessage();//这里Basehander里引用了弱引用
                }
            }
        };
    }

    private void handlerMessage() {
        try {
            int point = viewPager.getCurrentItem() + 1;
            viewPager.setCurrentItem(point);
            scroller.setmDuration(1 * 1000);//切换或滑动的速率,表示需要的秒数
        } catch (Exception e) {

        }
        handler.sendEmptyMessageDelayed(1, 3000);
    }

    public void refresh(List<Integer> data) {
        handler.removeCallbacksAndMessages(null);
        this.data = data;
        notifyDataSetChanged();
        addIndex();//添加小圆点
        handler.sendEmptyMessageDelayed(1, 3000);//开始自动切换
    }

    @Override
    public int getCount() {
        return (data == null || data.size() == 0) ? 0 : Integer.MAX_VALUE;
    }

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

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

    @Override
    public Object instantiateItem(ViewGroup container, int position) {
        ImageView image = new ImageView(context);
        image.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
        image.setScaleType(ImageView.ScaleType.CENTER_CROP);
        container.addView(image);
        image.setImageResource(data.get(position % (data.size())));
        return image;
    }

    /**
     * 添加小圆点
     */
    private void addIndex() {
        layout.removeAllViews();
        int count = viewPager.getCurrentItem();
        int num = data.size();
        for (int i = 0; i < num; i++) {
            ImageView imageView = new ImageView(context);
            imageView.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT));
            imageView.setPadding(0, 0, 10, 0);
            if (i == count) {
                imageView.setImageResource(R.drawable.view_ad_circle_normal);
            } else {
                imageView.setImageResource(R.drawable.view_ad_circle_selected);
            }
            layout.addView(imageView);
        }
    }


    @Override
    public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

    }

    /**
     * 切换时改变小圆点颜色
     */
    @Override
    public void onPageSelected(int position) {
        int count = position % data.size();
        for (int i = 0; i < layout.getChildCount(); i++) {
            ImageView iv = (ImageView) layout.getChildAt(i);
            if (count == i) {
                iv.setImageResource(R.drawable.view_ad_circle_normal);
            } else {
                iv.setImageResource(R.drawable.view_ad_circle_selected);
            }
        }
    }

    @Override
    public void onPageScrollStateChanged(int state) {

    }
}

Basehander的代码

public class Basehandler<T> extends Handler {

    public WeakReference<T> reference;

    public Basehandler(T t){
        this.reference = new WeakReference<T>(t);
    }

}
接下来是重写了Viewpager.pageTransformer类关于Viewpager切换动画的代码(谷歌官方示例)

public class ZoomOutPageTransformer implements ViewPager.PageTransformer {
    private static final float MIN_SCALE = 0.85f;
    private static final float MIN_ALPHA = 0.5f;

    @Override
    public void transformPage(View page, float position) {
        int pageWidth = page.getWidth();
        int pageHeight = page.getHeight();
        if (position < -1) {
            page.setAlpha(0);

        } else if (position <= 1) {
            float scaleFactor = Math.max(MIN_SCALE, 1 - Math.abs(position));
            float vertMargin = pageHeight * (1 - scaleFactor) / 2;
            float horzMargin = pageWidth * (1 - scaleFactor) / 2;
            if (position < 0) {
                page.setTranslationX(horzMargin - vertMargin / 2);
            } else {
                page.setTranslationX(-horzMargin + vertMargin / 2);
            }
            page.setScaleX(scaleFactor);
            page.setScaleY(scaleFactor);
            page.setAlpha(MIN_ALPHA + (scaleFactor - MIN_SCALE)
                    / (1 - MIN_SCALE) * (1 - MIN_ALPHA));

        } else {
            page.setAlpha(0);
        }
    }
}

接下来是控制切换速率,有些人感觉viewpager切换是速率太快了,这时需要写一个继承scroller的类

public class FixedSpeedScroller extends Scroller {
    private int mDuration = 1000;
    public FixedSpeedScroller(Context context) {
        super(context);
    }
    public FixedSpeedScroller(Context context, Interpolator interpolator) {
        super(context, interpolator);
    }

    @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 setmDuration(int time) {
        mDuration = time;
    }

    public int getmDuration() {
        return mDuration;
    }

}

所有的代码已经贴出,接下来展示下效果图


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要实现ViewPager的自动滑动和手动滑动加点击切换,可以按以下步骤进行操作: 1. 在layout文件中添加ViewPager控件: ``` <android.support.v4.view.ViewPager android:id="@+id/view_pager" android:layout_width="match_parent" android:layout_height="wrap_content"/> ``` 2. 在Activity或Fragment中初始化ViewPager并设置Adapter: ``` ViewPager viewPager = findViewById(R.id.view_pager); viewPager.setAdapter(new MyPagerAdapter(getSupportFragmentManager())); ``` 3. 实现自动滑动功能,可以使用Handler和Runnable来实现: ``` private Handler handler = new Handler(); private Runnable runnable = new Runnable() { @Override public void run() { int currentItem = viewPager.getCurrentItem(); int count = viewPager.getAdapter().getCount(); if (currentItem < count - 1) { viewPager.setCurrentItem(currentItem + 1); } else { viewPager.setCurrentItem(0); } handler.postDelayed(runnable, 3000); } }; // 在onResume()方法中启动自动滑动 @Override protected void onResume() { super.onResume(); handler.postDelayed(runnable, 3000); } // 在onPause()方法中停止自动滑动 @Override protected void onPause() { super.onPause(); handler.removeCallbacks(runnable); } ``` 4. 实现手动滑动和点击切换功能,可以在ViewPager的OnPageChangeListener中处理: ``` viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {} @Override public void onPageSelected(int position) { // 处理页面切换事件 } @Override public void onPageScrollStateChanged(int state) { // 处理滑动状态变化事件 } }); ``` 在onPageSelected()方法中可以处理页面切换事件,比如更新页面指示器的状态。在onPageScrollStateChanged()方法中可以处理滑动状态变化事件,比如停止自动滑动或重新开始自动滑动。 以上就是实现ViewPager自动滑动和手动滑动加点击切换的基本步骤,具体实现可以根据需求进行调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值