ViewPager 实现广告页轮播、打造卡片切换、卡片缩放动画

本文介绍了如何使用ViewPager和PageTransformer接口实现带有滑动动画效果的内容展示。通过自定义LoopTransformer类,可以轻松创建平滑过渡的页面切换效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  • 介绍

    ViewPager是我们最常用的控件之一了,几乎在项目中都会使用到它。我们在应用中会经常看到这样一种效果。

实现效果

    这种效果很常见,比如推荐内容、广告轮播等等会用到这样的效果。它实现起来也是不难的,那我们就分析一下它是如何实现的吧!

  • 实现思路及代码

    布局没什么难度,这个比较基础。ViewPager里面存放4个CardView。我们关注一下它是如何实现这种效果的。

添加CardView依赖

    注意要导入cardview的依赖,否则将找不到控件

implementation 'com.android.support:cardview-v7:26.1.0' //这里需要导入依赖

子View布局文件

<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#cfcfcf">

    <android.support.v7.widget.CardView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_margin="8dp"
        app:cardCornerRadius="24dp"
        app:cardElevation="8dp">

        <TextView
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:gravity="bottom|center_horizontal"
            android:paddingBottom="48dp"
            android:text="我是第1页"
            android:textStyle="bold"
            tools:ignore="HardcodedText" />
    </android.support.v7.widget.CardView>
</android.support.constraint.ConstraintLayout>

ViewPager布局文件

<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#cfcfcf"
    android:clipChildren="false">

    <android.support.v4.view.ViewPager
        android:id="@+id/vp_loop"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_margin="64dp"
        android:clipChildren="false"
        android:overScrollMode="never" />
</android.support.constraint.ConstraintLayout>

android:clipChildren属性介绍

    这里说明一下 android:clipChildren 这个属性。这个属性我们不是特别常用,但是它却很实用。它主要的作用是:

    是否让其子View显示在父View之内,默认为ture,它就会显示在父容器里。设为false则会显示到父容器之外。例如,我们给ViewPager设置了margin,这会使它缩进在屏幕内。可以发现ViewPager也有android:clipChildren这个属性。这就说明ViewPager里的子View也能够超出父容器的限制,显示在父容器之外了。

    这里提一下,ViewPager有这样一个方法,可以设置每个Page之间的Margin

    mViewPager.setPageMargin(20);//Page之间缩进20,作用是让页面之间空隙更大一点,根据自己需要而定。

    说到这里呢,其实也可以说实现了这种效果了,如果你不追求动画效果的画,那么这个效果已经够满足你的需求了。但是,我们程序猿怎么可能就这样满足了呢?下面我们来实现一下它在滑动过程中的动画效果吧。那么,要使ViewPager附带滑动动画,必定少不了它的一个神器:实现PageTransformer接口,我们来看下代码:

public class LoopTransformer implements ViewPager.PageTransformer {
    private static final float MIN_SCALE = 0.9f;

    @Override
    public void transformPage(View view, float position) {
        /**
         * 过滤那些 <-1 或 >1 的值,使它区于【-1,1】之间
         */
        if (position < -1) {
            position = -1;
        } else if (position > 1) {
            position = 1;
        }
        /**
         * 判断是前一页 1 + position ,右滑 pos -> -1 变 0
         * 判断是后一页 1 - position ,左滑 pos -> 1 变 0
         */
        float tempScale = position < 0 ? 1 + position : 1 - position; // [0,1]
        float scaleValue = MIN_SCALE + tempScale * 0.1f; // [0,1]
        view.setScaleX(scaleValue);
        view.setScaleY(scaleValue);
    }
}
  • 代码分析

    我们来分析一下这段代码。根据官方最这个接口的介绍,我们可以用一个草图来表示,以帮助理解。用三个矩形代表ViewPager中的三个页面。

    这里我们设置一个前提,就是position在滑动过程中都是属于[-1,1]之间的,而position != 0的View都缩放了0.9f ;

当我们手指往右滑动屏幕时,position这时从 -1 —> 0 的变化,而 scaleVaule = minVaule + tempScale * 0.1f ;

这里相当于 scaleVaule = 0.9f + [0,1] * 0.1f  ; 它的缩放倍数是从 0.9f —> 1.0f 变化的。

    看一下它移动过程图,更好的理解。

  • 如何使用

    我们在ViewPager中使用一下我们的自定义滑动效果,代码如下:

mViewPager.setOffscreenPageLimit(3);//预加载3个页面
mViewPager.setPageTransformer(false, new LoopTransformer());

    我们基本实现了这种效果,但是这仅仅只是一种效果。实现PageTransformer接口,我们自己完全可以做出更丰富、更炫酷的特效!

分享既是快乐,感谢您的阅读。尊重他人劳动成果,转载请附加博客原文链接。点赞是一种积极的生活态度!

好的,让我来为您介绍实现广告轮播卡片内容的方法。 首先,对于广告轮播,您可以使用ViewPager控件来实现ViewPager是Android中的一个常用控件,可用于实现面的滑动效果。它可以让用户在不同的面之间滑动,每个面可以包含不同的视图组件。 以下是一个简单的ViewPager实现示例: 1. 在您的布局文件中添加ViewPager控件 ```xml <androidx.viewpager.widget.ViewPager android:id="@+id/viewPager" android:layout_width="match_parent" android:layout_height="match_parent"/> ``` 2. 在您的Activity或Fragment中设置ViewPager的适配器 ```java ViewPager viewPager = findViewById(R.id.viewPager); MyPagerAdapter adapter = new MyPagerAdapter(getSupportFragmentManager()); viewPager.setAdapter(adapter); ``` 3. 创建适配器类MyPagerAdapter,并重写其中的方法 ```java public class MyPagerAdapter extends FragmentPagerAdapter { private final List<Fragment> mFragments = new ArrayList<>(); public MyPagerAdapter(FragmentManager fragmentManager) { super(fragmentManager); // 添加您的Fragment到List中,例如: mFragments.add(new AdFragment()); mFragments.add(new AdFragment()); mFragments.add(new AdFragment()); } @NonNull @Override public Fragment getItem(int position) { return mFragments.get(position); } @Override public int getCount() { return mFragments.size(); } } ``` 4. 创建一个Fragment来显示广告内容 ```java public class AdFragment extends Fragment { @Nullable @Override public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_ad, container, false); ImageView imageView = view.findViewById(R.id.imageView); // 设置广告图片 imageView.setImageResource(R.drawable.ad_image); return view; } } ``` 这样就可以实现广告轮播效果了。 接下来,对于卡片内容包含一张图片及图片右上角的标签以及卡片切换缩放动画实现,您可以使用RecyclerView控件来实现。 1. 在您的布局文件中添加RecyclerView控件 ```xml <androidx.recyclerview.widget.RecyclerView android:id="@+id/recyclerView" android:layout_width="match_parent" android:layout_height="match_parent"/> ``` 2. 在您的Activity或Fragment中设置RecyclerView的布局管理器和适配器 ```java RecyclerView recyclerView = findViewById(R.id.recyclerView); recyclerView.setLayoutManager(new LinearLayoutManager(this)); MyAdapter adapter = new MyAdapter(); recyclerView.setAdapter(adapter); ``` 3. 创建适配器类MyAdapter,并重写其中的方法 ```java public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> { @NonNull @Override public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_card, parent, false); return new ViewHolder(view); } @Override public void onBindViewHolder(@NonNull ViewHolder holder, int position) { // 设置卡片图片 holder.imageView.setImageResource(R.drawable.card_image); // 设置卡片标签 holder.labelView.setText("标签"); } @Override public int getItemCount() { return 10; } public static class ViewHolder extends RecyclerView.ViewHolder { ImageView imageView; TextView labelView; public ViewHolder(@NonNull View itemView) { super(itemView); imageView = itemView.findViewById(R.id.imageView); labelView = itemView.findViewById(R.id.labelView); } } } ``` 4. 创建一个卡片布局文件item_card.xml,添加图片和标签 ```xml <FrameLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:padding="16dp"> <ImageView android:id="@+id/imageView" android:layout_width="match_parent" android:layout_height="200dp" android:scaleType="centerCrop"/> <TextView android:id="@+id/labelView" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="12sp" android:textColor="#ffffff" android:background="@drawable/card_label_bg" android:padding="4dp" android:layout_gravity="top|end"/> </FrameLayout> ``` 5. 创建一个标签背景drawable文件card_label_bg.xml,添加圆角和半透明效果 ```xml <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle"> <corners android:radius="4dp"/> <solid android:color="#80000000"/> </shape> ``` 至此,您已经成功实现卡片内容包含一张图片及图片右上角的标签以及卡片切换缩放动画的代码。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值