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);
            }
        }
    }
    

      

  • 相关阅读:
    程序员的7中武器
    需要强化的知识
    微软中国联合小i推出MSN群Beta 不需任何插件
    XML Notepad 2006 v2.0
    Sandcastle August 2006 Community Technology Preview
    [推荐] TechNet 广播 SQL Server 2000完结篇
    《太空帝国 4》(Space Empires IV)以及 xxMod 英文版 中文版 TDM Mod 英文版 中文版
    IronPython 1.0 RC2 更新 1.0.60816
    Microsoft .NET Framework 3.0 RC1
    《Oracle Developer Suite 10g》(Oracle Developer Suite 10g)V10.1.2.0.2
  • 原文地址:https://www.cnblogs.com/wangjiaghe/p/10544248.html
Copyright © 2011-2022 走看看