Android CardView+ViewPager实现ViewPager翻页动画的方法

作者:Abby代黎明 时间:2022-10-19 00:44:57 

Viewpager通俗一点讲就是一个允许左右翻转带数据的页面的布局管理器,经常用来连接Fragment,它很方便管理每个页面的生命周期,使用ViewPager管理Fragment是标准的适配器实现。最常用的实现一般有FragmentPagerAdapter和FragmentStatePagerAdapter。自行百度它的用法。今天我们要实现的是下面的效果:

NO PICTURE TALK A JB

Android CardView+ViewPager实现ViewPager翻页动画的方法

要实现图中的效果需要以下几个知识点:
1.clipChildren属性
2.一个页面显示多个ViewPager的Item
3.自定义PagerTransformer
4.ViewPager结合CardView

1.clipChildren 属性

clipchildren :是否限制子View在其范围内,当我们将其值设置为false后那么在子控件的高度高于父控件时也会完全显示,而不会被压缩,(上面中间的按钮超过上面的阴影线,依旧可以正常显示),默认的时候是true。

Android CardView+ViewPager实现ViewPager翻页动画的方法

了解了这个属性就可以让一个页面显示多个Viewpager的Item

2.一个页面显示多个ViewPager的Item

直接在xml布局文件中配置:android:clipToPadding="false"


<?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:background="@drawable/background">
 <!--1. 中间可滑动的viewPager-->
 <android.support.v4.view.ViewPager
   android:id="@+id/viewpager"
   android:layout_width="match_parent"
   android:layout_height="match_parent"
   android:layout_alignParentBottom="true"
   android:clipToPadding="false"
   android:paddingEnd="48dp"
   android:paddingLeft="48dp"
   android:paddingRight="48dp"
   android:paddingStart="48dp" />
 <RelativeLayout
   android:id="@+id/bottom_layout"
   android:layout_width="match_parent"
   android:layout_height="55dp"
   android:layout_alignParentBottom="true">
   <ImageView
     android:id="@+id/img_like"
     android:layout_width="38dp"
     android:layout_height="38dp"
     android:layout_centerHorizontal="true"
     android:layout_centerVertical="true"
     android:src="@drawable/icon2" />
 </RelativeLayout>
 <TextView
   android:id="@+id/indicator_tv"
   android:layout_width="wrap_content"
   android:layout_height="20dp"
   android:layout_above="@+id/bottom_layout"
   android:layout_centerHorizontal="true"
   android:gravity="center_vertical"
   android:text="1/199"
   android:textColor="#ffffff"
   android:textSize="16sp" />
 <!--4. 顶部的titleBar-->
 <LinearLayout
   android:id="@+id/linearLayout"
   android:layout_width="match_parent"
   android:layout_height="wrap_content"
   android:orientation="vertical">
   <!--沉浸式activity,这个view是用来占位的-->
   <View
     android:id="@+id/position_view"
     android:layout_width="1px"
     android:layout_height="1px" />
   <RelativeLayout
     android:layout_width="match_parent"
     android:layout_height="55dp"
     android:orientation="horizontal">
     <TextView
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:layout_centerInParent="true"
       android:text="地图操作"
       android:textColor="#ffffff"
       android:textSize="16sp" />
   </RelativeLayout>
 </LinearLayout>
</RelativeLayout>

3.自定义ViewPager翻页动画

直接上代码


public class CustPagerTransformer implements ViewPager.PageTransformer {
 private int maxTranslateOffsetX;
 private ViewPager viewPager;
 public CustPagerTransformer(Context context) {
   this.maxTranslateOffsetX = dp2px(context, 180);
 }
 public void transformPage(View view, float position) {
   if (viewPager == null) {
     viewPager = (ViewPager) view.getParent();
   }
   int leftInScreen = view.getLeft() - viewPager.getScrollX();
   int centerXInViewPager = leftInScreen + view.getMeasuredWidth() / 2;
   int offsetX = centerXInViewPager - viewPager.getMeasuredWidth() / 2;
   float offsetRate = (float) offsetX * 0.38f / viewPager.getMeasuredWidth();
   float scaleFactor = 1 - Math.abs(offsetRate);
   if (scaleFactor > 0) {
     view.setScaleX(scaleFactor);
     view.setScaleY(scaleFactor);
     view.setTranslationX(-maxTranslateOffsetX * offsetRate);
   }
 }
 /**
  * dp和像素转换
  */
 private int dp2px(Context context, float dipValue) {
   float m = context.getResources().getDisplayMetrics().density;
   return (int) (dipValue * m + 0.5f);
 }
}

使用方法


// 1. viewPager添加parallax效果,使用PageTransformer就足够了
  viewPager.setPageTransformer(false, new CustPagerTransformer(this));

4.CardView 与Viewpager联合使用

先看viewpager的一个item布局


<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
 xmlns:app="http://schemas.android.com/apk/res-auto"
 android:layout_width="match_parent"
 android:layout_height="match_parent">
 <cn.yznu.gdmapoperate.ui.widget.AspectRatioCardView
   android:id="@+id/card_view"
   android:layout_width="match_parent"
   android:layout_height="wrap_content"
   android:layout_gravity="center"
   android:layout_marginBottom="20dp"
   android:layout_marginLeft="20dp"
   android:layout_marginRight="20dp"
   app:cardCornerRadius="5dp"
   app:cardElevation="6dp"
   app:cardMaxElevation="6dp">
   <ImageView
     android:layout_width="match_parent"
     android:layout_height="match_parent"
     android:layout_gravity="center"
     android:background="@drawable/bg_map"
     android:contentDescription="@string/app_name"
     android:scaleType="centerCrop" />
   <ImageView
     android:id="@+id/image"
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"
     android:layout_gravity="center"
     android:contentDescription="@string/app_name"
     android:scaleType="centerCrop"
     android:src="@drawable/map" />
   <TextView
     android:id="@+id/txt_title"
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"
     android:layout_centerVertical="true"
     android:layout_gravity="bottom|center"
     android:padding="5dp"
     android:text="@string/app_name"
     android:textColor="#12edf0"
     android:textSize="15sp" />
 </cn.yznu.gdmapoperate.ui.widget.AspectRatioCardView>
</FrameLayout>

使用ViewPager管理Fragment是标准的适配器实现,所以将这个xml作为fragment的布局就行了,就是这么简单。

红红火火恍恍惚惚,貌似完成了,就是这么简单。

来源:https://www.jianshu.com/p/f01d7aea9449

标签:Android,ViewPager,翻页
0
投稿

猜你喜欢

  • Android实现颜色渐变动画效果

    2022-05-31 09:52:53
  • Spring Cloud Ribbon配置详解

    2023-11-25 01:32:50
  • springboot连接sqllite遇到的坑及解决

    2023-04-27 04:37:38
  • Java日常练习题,每天进步一点点(8)

    2022-04-15 16:40:26
  • Android TimePicker 直接输入的问题解决方案

    2023-08-03 03:11:55
  • IDEA连接Mysql数据库的详细图文教程

    2023-10-09 09:51:24
  • 简单讲解java中throws与throw的区别

    2022-06-01 05:16:55
  • Android SharedPreferences实现记住密码和自动登录界面

    2023-06-15 20:07:00
  • SpringCloud微服务之Hystrix组件实现服务熔断的方法

    2021-12-04 16:30:45
  • C#采用OpenXml实现给word文档添加文字

    2022-06-13 09:48:46
  • 超全MyBatis动态代理详解(绝对干货)

    2023-11-14 02:28:19
  • Android TabLayout设置指示器宽度的方法

    2023-03-27 02:53:05
  • MyBatis-Plus中更新操作的两种实现

    2022-06-24 03:09:14
  • Android 7.0调用相机崩溃详解及解决办法

    2023-08-08 21:39:42
  • Android开发中使用外部应用获取SD卡状态的方法

    2023-02-01 21:03:45
  • Java ThreadLocal类使用详解

    2022-08-04 05:29:34
  • Android仿IOS自定义AlertDialog提示框

    2022-08-23 21:08:44
  • 为什么入门大数据选择Python而不是Java?

    2022-04-01 00:14:46
  • 初步认识C#中的Lambda表达式和匿名方法

    2023-07-03 00:23:28
  • 5分钟快速学会spring boot整合JdbcTemplate的方法

    2022-04-01 15:56:11
  • asp之家 软件编程 m.aspxhome.com