zoukankan      html  css  js  c++  java
  • ViewPage实现无限轮播画廊效果

    1. 效果图

    2. 布局文件

    主要使用的 android:clipChildren的意思:是否限制子View在其范围内。再父布局和viewpager中设置该属性  ,要显示三个界面 ,还要设置marginleft和marginRight

    <?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:clipChildren="false"
        >
        <android.support.v4.view.ViewPager
            android:id="@+id/vp"
            android:layout_width="match_parent"
            android:clipChildren="false"
            android:layout_marginTop="30dp"
            android:layout_marginLeft="60dp"
            android:layout_marginRight="60dp"
            android:layout_height="150dp"></android.support.v4.view.ViewPager>
    
    </RelativeLayout>
    

      

    3. Adapter

     private class MyAdapter extends PagerAdapter{
    
            @Override
            public int getCount() {
                return Integer.MAX_VALUE;//无限轮播
            }
    
            @Override
            public boolean isViewFromObject(@NonNull View view, @NonNull Object o) {
                return view==o;
            }
    
            @NonNull
            @Override
            public Object instantiateItem(@NonNull ViewGroup container, int position) {
                View view=LayoutInflater.from(Grally2Activity.this).inflate(R.layout.item_vp,null);
                int newwPos=position%(datas.size());//对应数据中的位置
                ImageView img=view.findViewById(R.id.img);
                img.setImageResource(datas.get(newwPos));
                container.addView(view);
                return view;
            }
    
            @Override
            public void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object
                    object) {
    //            super.destroyItem(container, position, object);
                container.removeView((View) object);
            }
        }
    
    

    4.关键点PageTransformer

    public class Scalltransformer implements ViewPager.PageTransformer {
        private float MINSCALE=0.8f;//最小缩放值
    
        /**
         * position取值特点:
         * 假设页面从0~1,则:
         * 第一个页面position变化为[0,-1]
         * 第二个页面position变化为[1,0]
         *
         * @param view
         * @param v
         */
        @Override
        public void transformPage(@NonNull View view, float v) {
    
            float scale;//view  应缩放的值
            if(v>1||v<-1){
                scale=MINSCALE;
            }else if(v<0){
                scale=MINSCALE+(1+v)*(1-MINSCALE);
            }else{
                scale=MINSCALE+(1-v)*(1-MINSCALE);
            }
            view.setScaleY(scale);
            view.setScaleX(scale);
        }
    }
    

      

    5.Activity代码

    public class Grally2Activity extends AppCompatActivity {
        @BindView(R.id.vp)
        ViewPager vp;
    
        private List<Integer> datas=new ArrayList<>();
        @Override
        protected void onCreate(@Nullable Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_grally);
            ButterKnife.bind(this);
            initDatas();
            initVP();
        }
    
        private void initVP() {
            vp.setPageMargin(20);//设置ViewPager中子布局的间隔
            vp.setOffscreenPageLimit(2);
            vp.setPageTransformer(false,new Scalltransformer());
            vp.setAdapter(new MyAdapter());
            vp.setCurrentItem(Integer.MAX_VALUE/2-(Integer.MAX_VALUE/2%datas.size()));//设置首个轮播显示的位置   实现左右滑动 且首页面对应的是第一个数据
        }
    
        private void initDatas() {
            datas.add(R.mipmap.p2);
            datas.add(R.mipmap.p3);
            datas.add(R.mipmap.p4);
            datas.add(R.mipmap.p5);
        }
    
        private class MyAdapter extends PagerAdapter{
    
            @Override
            public int getCount() {
                return Integer.MAX_VALUE;
            }
    
            @Override
            public boolean isViewFromObject(@NonNull View view, @NonNull Object o) {
                return view==o;
            }
    
            @NonNull
            @Override
            public Object instantiateItem(@NonNull ViewGroup container, int position) {
                View view=LayoutInflater.from(Grally2Activity.this).inflate(R.layout.item_vp,null);
                int newwPos=position%(datas.size());
                ImageView img=view.findViewById(R.id.img);
                img.setImageResource(datas.get(newwPos));
                container.addView(view);
                return view;
            }
    
            @Override
            public void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object
                    object) {
    //            super.destroyItem(container, position, object);
                container.removeView((View) object);
            }
        }
    }
    

      

  • 相关阅读:
    测试用例模板和编写目的
    使用AndroidStudio配置码云时,提醒following remotes are already on gitee git
    win10操作系统查看电池损耗,电池使用时间
    windows技巧03----win的一些组合键
    windows技巧02---------输入特殊字符
    windows技巧01------------记事本默认保存修改时间
    word2010如何让第一页不显示页码
    docker镜像管理基础
    docker基础用法
    SaltStack进阶
  • 原文地址:https://www.cnblogs.com/wangjiaghe/p/10544248.html
Copyright © 2011-2022 走看看