ViewPager真正实现无限轮播(偷梁换柱法,切换无回滚)

首先思路图




布局

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.itheima.activity.MainActivity">

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


代码如下

package com.example.activity;

import android.os.Bundle;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;

import com.itheima.activity.R;

public class MainActivity
        extends AppCompatActivity
{

    private ViewPager mViewPager;
    //图片资源
    private int[] mPic = {R.mipmap.home01,
                          R.mipmap.home02,
                          R.mipmap.home03,
                          R.mipmap.home04,
                          R.mipmap.home05};

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //查找viewpager
        mViewPager = (ViewPager) findViewById(R.id.viewpager);
        //设置adapter
        mViewPager.setAdapter(new MyPagerAdapter());
        //初始化显示下标一位置
        mViewPager.setCurrentItem(1);
        //设置page改变监听
        initListener();
     
        
    }

    class MyPagerAdapter
            extends PagerAdapter
    {
        @Override
        public int getCount() {
            //左右各加两张图片,图片总数加二
            return mPic.length + 2;
        }

        @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) {
            //0下标与最大下标分别加入图一与图5,正常图片顺序从1下标开始.所以需要改变position

            //如果下标是0,
            if (position == 0) {
                //将下标指向图五
                position = mPic.length - 1;
                //如果是最后一个下标
            } else if (position == getCount() - 1) {
                //将下标指向图一
                position = 0;
            } else {
                //上面两步将左右两边的下标指向了图一和图五
                //我们正常的图片从下标一开始,所以需要-1
                position -= 1;
            }
            //设置图片
            ImageView iv = new ImageView(MainActivity.this);
            iv.setImageResource(mPic[position]);
            container.addView(iv);
            return iv;
        }
    }
    //监听page位置改变
    private void initListener() {
        mViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels)
            {

            }

            @Override
            public void onPageSelected(int position) {
                Log.e("MainActivi", "当前下标:"+position);
            }

            @Override
            public void onPageScrollStateChanged(int state) {
                //如果当前状态是静止的状态(等待动画走完,静默切换界面)
                if (state == ViewPager.SCROLL_STATE_IDLE) {
                    //如果当前page指向0下标的图5
                    if (mViewPager.getCurrentItem() == 0) {
                        //跳转到正常的图五
                        mViewPager.setCurrentItem(mPic.length, false);//false取消跳转动画(静默跳转)
                    //如果当前page指向最大下标的图一
                    } else if (mViewPager.getCurrentItem() == mPic.length + 1) {
                        //跳转到正常的图一
                        mViewPager.setCurrentItem(1, false);//false取消跳转动画(静默跳转)
                    }
                }
            }
        });
    }
}


  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个简单的示例代码,演示如何使用ViewPager实现广告页轮播、卡片切换和卡片缩放动画。 1. 布局文件 在布局文件中,我们需要添加一个ViewPager控件,并为ViewPager设置相应的布局参数,如下所示: ```xml <androidx.viewpager.widget.ViewPager android:id="@+id/view_pager" android:layout_width="match_parent" android:layout_height="200dp" android:clipToPadding="false" android:paddingLeft="50dp" android:paddingRight="50dp" android:overScrollMode="never"/> ``` 注意,我们在这里设置了ViewPager的clipToPadding属性为false,这是为了让ViewPager的子视图可以超出ViewPager的边界,从而实现卡片切换效果。我们还设置了ViewPager的paddingLeft和paddingRight属性,以便在ViewPager的两侧留出一些空白区域。 2. ViewPager适配器 接下来,我们需要创建一个ViewPager适配器,用于管理ViewPager中的视图。在这个适配器中,我们可以根据需要添加或删除ViewPager中的子视图,并为这些子视图设置相应的布局参数和动画效果。 ```java public class ViewPagerAdapter extends PagerAdapter { private Context mContext; private List<Integer> mImageIds; public ViewPagerAdapter(Context context, List<Integer> imageIds) { mContext = context; mImageIds = imageIds; } @Override public int getCount() { return mImageIds.size(); } @Override public boolean isViewFromObject(@NonNull View view, @NonNull Object object) { return view == object; } @NonNull @Override public Object instantiateItem(@NonNull ViewGroup container, int position) { ImageView imageView = new ImageView(mContext); imageView.setImageResource(mImageIds.get(position)); imageView.setScaleType(ImageView.ScaleType.CENTER_CROP); // 添加缩放动画效果 if (position == 0) { imageView.setScaleX(1.2f); imageView.setScaleY(1.2f); } else { imageView.setScaleX(1.0f); imageView.setScaleY(1.0f); } container.addView(imageView); return imageView; } @Override public void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) { container.removeView((View) object); } } ``` 在这个适配器中,我们需要重写一些方: - getCount():返回ViewPager中子视图的数量。 - isViewFromObject():判断一个视图是否是由给定的对象生成的。 - instantiateItem():当一个视图需要被添加到ViewPager中时,会调用这个方来创建这个视图,并将它添加到ViewPager中。 - destroyItem():当一个视图需要被从ViewPager中删除时,会调用这个方来删除这个视图。 在instantiateItem()方中,我们为每个子视图设置了一个默认的缩放比例,同时也可以根据需要设置子视图的其他动画效果。 3. 设置ViewPager的滑动效果 为了让ViewPager的滑动效果更加流畅,我们可以为ViewPager设置一些滑动效果参数: ```java viewPager.setClipToPadding(false); viewPager.setPadding(50, 0, 50, 0); viewPager.setPageMargin(20); viewPager.setOffscreenPageLimit(3); viewPager.setPageTransformer(true, new ViewPager.PageTransformer() { @Override public void transformPage(@NonNull View page, float position) { float scale = 1 - Math.abs(position) * 0.2f; page.setScaleX(scale); page.setScaleY(scale); } }); ``` 在这里,我们设置了ViewPager的clipToPadding属性为false,同时设置了ViewPager的padding属性和pageMargin属性,以便在ViewPager的两侧留出一些空白区域,并为ViewPager中的子视图之间添加一些间隔。我们还设置了ViewPager的offscreenPageLimit属性,以便预加载一些子视图,以提高滑动效果的流畅度。 最后,我们为ViewPager设置了一个PageTransformer,这个PageTransformer可以为ViewPager中的每个子视图设置一个动画效果。在这里,我们为每个子视图设置了一个缩放效果,使得ViewPager中的子视图在滑动过程中可以自动缩放。 4. 加载ViewPager 在Activity或Fragment中,我们只需要创建一个ViewPagerAdapter对象,并将这个适配器设置到ViewPager中即可: ```java List<Integer> imageIds = new ArrayList<>(); imageIds.add(R.drawable.advertisement1); imageIds.add(R.drawable.advertisement2); imageIds.add(R.drawable.advertisement3); ViewPagerAdapter adapter = new ViewPagerAdapter(getContext(), imageIds); ViewPager viewPager = findViewById(R.id.view_pager); viewPager.setAdapter(adapter); ``` 这样,就可以完成Android中使用ViewPager实现广告页轮播、卡片切换和卡片缩放动画的代码了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值