ViewPager实现循环广告

参考了部分网上资料

原理是RelativeLayout布局里面重叠线性布局 线性布局动态添加小圆点 而小原点添加方式如下:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="oval">
    <solid android:color="#ffffff"/>
</shape>
原点添加的布局文件是在drawable文件夹下
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/find_point_select" android:state_selected="true"/>
    <item android:drawable="@drawable/find_point_notselect" android:state_selected="false"/>
</selector>
viewpager的适配器设置:
public class ViewAdpater extends PagerAdapter {
    List<ImageView> viewList;
    public ViewAdpater(List<ImageView> viewList)
    {
        this.viewList=new ArrayList<>();
        this.viewList.addAll(viewList);
    }
    @Override
    public int getCount() {
        return Integer.MAX_VALUE;
    }

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

    @Override
    public Object instantiateItem(ViewGroup container, int position) {
//        取模的原因 我们将个数设置的无限大 那么取模就相当于循环
      int newPosition = position % viewList.size();
      ImageView imageView=viewList.get(newPosition);
      if(imageView.getParent()!=null) {
//          如果有一个父类就清除否则可能会报错
          ViewGroup parent = (ViewGroup) imageView.getParent();
          parent.removeView(imageView);
      }
      else
      container.addView(imageView);
      return imageView;
    }

    @Override
    public void destroyItem(ViewGroup container, int position, Object object) {
        int newPosition = position % viewList.size();
        container.removeView(viewList.get(newPosition));
    }
}
加载的碎片

public class GlideAD extends Fragment implements ViewPager.OnPageChangeListener {
    ViewPager pager;
    List<ImageView> viewList;
    Handler handler;
//    终止循环
    private boolean stop=false;
//    适配器
    private ViewAdpater adpater;
//    原点指示器布局
LinearLayout linearLayout;
    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View view=inflater.inflate(R.layout.glidead,container,false);
//        添加小圆点
//        容器
        pager=(ViewPager)view.findViewById(R.id.view_pager);
       linearLayout=(LinearLayout)view.findViewById(R.id.point_group);
        viewList=new ArrayList<>();
//        预设配图
        ImageView view1=new ImageView(getContext());
        view1.setImageResource(R.drawable.ltpx);
        viewList.add(view1);
        ImageView view2=new ImageView(getContext());
        view2.setImageResource(R.drawable.sjlr);
        viewList.add(view2);
        ImageView view3=new ImageView(getContext());
        view3.setImageResource(R.drawable.smtf);
        viewList.add(view3);
        
        for(int i=0;i<viewList.size();i++)
        {
//            小原点
            ImageView imageView=new ImageView(getContext());
            imageView.setImageResource(R.drawable.point_select);
                imageView.setSelected(false);
//            绘制大小
            int size=getResources().getDimensionPixelSize(R.dimen.normal_point_size);
            Log.d("大小:",size+"");
            LinearLayout.LayoutParams params=new LinearLayout.LayoutParams(size,size);
            params.leftMargin=getResources().getDimensionPixelSize(R.dimen.leftmargin_point_size);
            imageView.setLayoutParams(params);
            // 添加到容器里
            linearLayout.addView(imageView);
        }
        adpater=new ViewAdpater(viewList);
        pager.setAdapter(adpater);
        return view;
    }

    @Override
    public void onActivityCreated(@Nullable Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
//设置 对viewpager进行监听
        pager.addOnPageChangeListener(this);
        startRun();
    }

    public void startRun()
    {

        final Runnable runnable=new Runnable() {
            @Override
            public void run() {
//                因为设置的是无线大所以随便加
//                只要活动未停止将一直执行
                if (!stop) {
                    pager.setCurrentItem(pager.getCurrentItem() + 1);
                    handler.postDelayed(this, 2000);
                }else
                {
                    handler.postDelayed(this, 2000);
                }
            }
        };
         handler=new Handler();
        handler.postDelayed(runnable,2000);
    }
    @Override
    public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

    }
int lastPosition;
    @Override
    public void onPageSelected(int position) {
        int newposition=position%viewList.size();
        // 页面被选中
        // 设置当前页面选中
        linearLayout.getChildAt(newposition).setSelected(true);
        // 设置前一页不选中
        linearLayout.getChildAt(lastPosition).setSelected(false);
        // 替换位置
        lastPosition = newposition;
    }

    @Override
    public void onPageScrollStateChanged(int state) {
        switch (state) {
            // 静止状态
            case SCROLL_STATE_IDLE:
                stop = false;
                break;
            // 拖拽中
            case SCROLL_STATE_DRAGGING:
                stop = true;
                break;
            // 拖拽后松手,自动回到最终位置的过程
            case SCROLL_STATE_SETTLING:
                stop = false;
                break;
        }
    }
}
一些图片大小参数自己随心

关键的布局文件:

<?xml version="1.0" encoding="utf-8"?>
<!--滑动广告-->
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent" 
    android:layout_height="match_parent">
   <android.support.v4.view.ViewPager
    android:id="@+id/view_pager"
    android:layout_width="match_parent"
    android:layout_height="120dp"/>
    <!--wrapcontent是为了找准方向-->
    <LinearLayout
       android:id="@+id/point_group"
       android:layout_alignParentBottom="true"
       android:layout_centerHorizontal="true"
       android:padding="10dp"
       android:orientation="horizontal"
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"/>
</RelativeLayout>



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值