Android控件ViewPager实现带有动画的引导页

发布时间 - 2026-01-11 01:16:02    点击率:

ViewPager实现带有动画的引导页,供大家参考,具体内容如下

好了,又到我们学习基础控件的时候了,其实引导页很简单,就是五张图片而已

一、ViewPager实现传统的引导页

传统的ViewPager实现引导页和ListView是一样道理的,只是把ListView的Item换成图片,把BaseAdapter换成PagerAdapter,我们先来看下传统引导页的效果图

步骤一:编写xml文件

既然用到的是ViewPager,那么xml文件就必须要有ViewPager,细心的你,可能会发现最后一页还有个按钮的出现,没错,xml文件中也要有个按钮

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
 android:layout_width="match_parent"
 android:layout_height="match_parent">

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

 <Button
  android:id="@+id/bt_main"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:layout_alignParentBottom="true"
  android:layout_centerInParent="true"
  android:layout_marginBottom="50dp"
  android:background="@color/colorPrimary"
  android:padding="6dp"
  android:text="立即开启"
  android:textColor="#fff"
  android:textSize="16dp"
  android:visibility="gone" />
</RelativeLayout>

步骤二:编写Adapter

开头也说了,Viewpager其实就和ListView一样的,需要一个Adapter,那么就从Adapter入手。Google提供了一个专门适配ViewPager的Adapter——PagerAdapter

public class GuideAdapter extends PagerAdapter {
 private List<View> views;
 private Context context;

 public GuideAdapter(List<View> views, Context context) {
  this.context = context;
  this.views = views;
 }

 public Object instantiateItem(View container, int position) {
  ((ViewPager) container).addView(views.get(position));
  return views.get(position);
 }

 public void destroyItem(View container, int position, Object object) {
  ((ViewPager) container).removeView(views.get(position));
 }

 public int getCount() {
  return views.size();
 }

 public boolean isViewFromObject(View arg0, Object arg1) {
  return (arg0 == arg1);
 }
}

基本ViewPager的Adapter都是这么写的,就是往ViewPager中添加List传过来的View和删除List传过来的View,可以说是每个ViewPager的模板

步骤三:编写Activity

我们找到对应的ViewPager,然后设置Adapter,代码中的initViews、initListener、initData是按顺序执行下去的,这段代码不难,很容易看懂

public class GuideActivity extends BaseActivity implements ViewPager.OnPageChangeListener {

 private ViewPager vp_guide;
 private int[] imgId = {R.drawable.guide_center_1, R.drawable.guide_center_2, R.drawable.guide_center_3,
   R.drawable.guide_center_4, R.drawable.guide_center_5};
 private List<View> mImageViews;
 private GuideAdapter adapter;
 private Button bt_main;

 @Override
 public void initViews() {
  setContentView(R.layout.activity_guide);
  vp_guide = (ViewPager) findViewById(R.id.vp_guide);
  bt_main = (Button) findViewById(R.id.bt_main);
 }

 @Override
 public void initListener() {
  bt_main.setOnClickListener(this);
  vp_guide.setOnPageChangeListener(this);
 }

 @Override
 public void initData() {
  //初始化引导资源
  mImageViews = new ArrayList<>();
  for (int i = 0; i < imgId.length; i++) {
   ImageView imageView = new ImageView(this);
   imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
   imageView.setImageResource(imgId[i]);
   mImageViews.add(imageView);
  }
  //设置引导页
  adapter = new GuideAdapter(mImageViews, this);
  vp_guide.setAdapter(adapter);
 }

 @Override
 public void processClick(View v) {
  switch (v.getId()) {
   //按钮点击事件,跳转到主页面
   case R.id.bt_main:
    Intent intent = new Intent(GuideActivity.this, MainActivity.class);
    startActivity(intent);
    finish();
    break;
  }
 }

 @Override
 public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
  if (position == imgId.length - 1) {
   //最后一个,实现动画浮现
   bt_main.setVisibility(View.VISIBLE);
   AlphaAnimation aa = new AlphaAnimation(0, 1f);
   aa.setDuration(1000);
   bt_main.startAnimation(aa);
  } else {
   bt_main.setVisibility(View.GONE);
  }
 }

 @Override
 public void onPageSelected(int position) {

 }

 @Override
 public void onPageScrollStateChanged(int state) {

 }
}

细心的你可能也发现了该引导页是没有状态栏的,所以我们需要设置其主题为状态栏透明

<activity
 android:name=".Activity.GuideActivity"
 android:theme="@android:style/Theme.NoTitleBar.Fullscreen"/>

特别注意:这里需要注意的是图片的大小问题,如果图片高清太大,可能会出现内存溢出的错误。

二、ViewPager实现带有动画的引导页

带有动画的引导页编写步骤和传统是一模一样的,只不过给ViewPager设置一个动画。Google提供ViewPager.setPageTransformer(boolean reverseDrawingOrder, PageTransformer transformer)方法来设置引导页的切换效果,这里先看Google提供的切换Demo

步骤一:编写PageTransformer

从上面效果看出,只是在引导页之间添加了一个动画而已,而Google提供的PageTransformer就可以对当前位置的引导页进行操作,比如:设置透明度的变化,设置缩放的变化,就能实现切换的动画效果

public class DepthPageTransformer implements ViewPager.PageTransformer {

 private static final float MIN_SCALE = 0.75f;

 @Override
 public void transformPage(View view, float position) {
  int pageWidth = view.getWidth();
  if (position < -1) {
   view.setAlpha(0);
  } else if (position <= 0) {
   view.setAlpha(1);
   view.setTranslationX(0);
   view.setScaleX(1);
   view.setScaleY(1);
  } else if (position <= 1) {
   view.setAlpha(1 - position);
   view.setTranslationX(pageWidth * -position);
   float scaleFactor = MIN_SCALE + (1 - MIN_SCALE) * (1 - Math.abs(position));
   view.setScaleX(scaleFactor);
   view.setScaleY(scaleFactor);
  } else {
   view.setAlpha(0);
  }
 }
}

步骤二:分析PageTransformer

从上面的代码中,可以知道在ViewPager滑动的时候,会触发transformPage这个方法,并且会将当前的position和View传递过来,下面就是我们的对View的操作

① position

position < -1(即-无穷到-1):让引导页消失,透明度为0
position <= 0(即-1到0):让引导页出现
position <= 1(即0到1):让引导页根据position做动画
剩下else(即1到无穷):让引导页消失,透明度为0

② 图解position

原谅我画图不好看,不生动,如果还不理解的话可以自己打印Log信息,把View和Position都打印出来帮助理解

步骤三:使用PageTransformer

使用PageTransformer非常简单,只要通过ViewPager设置即可

vp_guide.setPageTransformer(true, new DepthPageTransformer());

三、其他动画的引导页的参考

Google还为我们提供了另一个动画效果,看效果图

实现步骤其实和上面的步骤是一样的,具体我们来看PageTransformer的编写

public class ZoomOutPageTransformer implements ViewPager.PageTransformer {

 private static final float MIN_SCALE = 0.85f;
 private static final float MIN_ALPHA = 0.5f;

 @SuppressLint("NewApi")
 public void transformPage(View view, float position) {
  int pageWidth = view.getWidth();
  int pageHeight = view.getHeight();
  if (position < -1) {
   view.setAlpha(0);
  } else if (position <= 1) {
   float scaleFactor = Math.max(MIN_SCALE, 1 - Math.abs(position));
   float vertMargin = pageHeight * (1 - scaleFactor) / 2;
   float horzMargin = pageWidth * (1 - scaleFactor) / 2;
   if (position < 0) {
    view.setTranslationX(horzMargin - vertMargin / 2);
   } else {
    view.setTranslationX(-horzMargin + vertMargin / 2);
   }
   view.setScaleX(scaleFactor);
   view.setScaleY(scaleFactor);
   view.setAlpha(MIN_ALPHA + (scaleFactor - MIN_SCALE) / (1 - MIN_SCALE) * (1 - MIN_ALPHA));
  } else {
   view.setAlpha(0);
  }
 }
}

这里的原理就不分析了,和上面是一样的,只不过操作不同而已。除了Google提供的Demo之外,我们可以模仿谷歌的Demo,编写出我们自己的动画效果

public class RotateDownPageTransformer implements ViewPager.PageTransformer {

 private static final float ROT_MAX = 20.0f;
 private float mRot;

 public void transformPage(View view, float position) {
  if (position < -1) {
   ViewHelper.setRotation(view, 0);
  } else if (position <= 1) {
   //[-1,1]
   mRot = (ROT_MAX * position);
   ViewHelper.setPivotX(view, view.getMeasuredWidth() * 0.5f);
   ViewHelper.setPivotY(view, view.getMeasuredHeight());
   ViewHelper.setRotation(view, mRot);
  } else {
   ViewHelper.setRotation(view, 0);
  }
 }
}

效果如图

好了,今天基础控件就到这里了,如果不懂的话可以自己实践一下,然后用纸笔思考思考,你就会有收获的。我也是通过博客学习别人的博客,然后通过自己的方式,将学习的内容写出来。我们一起加油,后来者们

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


# Android  # ViewPager  # 引导页  # Android使用ViewPager实现启动引导页  # Android自定义引导玩转ViewPager的方法详解  # Android开发实战之漂亮的ViewPager引导页  # Android开发实现的ViewPager引导页功能(动态加载指示器)详解  # ViewPager实现漂亮的引导页  # ViewPager实现带引导小圆点与自动跳转的引导界面  # Android利用ViewPager实现用户引导界面效果的方法  # ViewPager打造轮播图Banner/引导页Guide  # Android使用ViewPager完成app引导页  # ViewPager实现轮播图引导页  # 自己的  # 的是  # 好了  # 有个  # 都是  # 状态栏  # 只不过  # 会有  # 你就  # 就能  # 也要  # 就不  # 说了  # 是一样的  # 要有  # 还不  # 不懂  # 很容易  # 这段  # 我们可以 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 如何在IIS服务器上快速部署高效网站?  详解Android中Activity的四大启动模式实验简述  Laravel API路由如何设计_Laravel构建RESTful API的路由最佳实践  如何快速搭建高效服务器建站系统?  高性价比服务器租赁——企业级配置与24小时运维服务  Laravel如何集成Inertia.js与Vue/React?(安装配置)  如何在IIS中新建站点并配置端口与IP地址?  用v-html解决Vue.js渲染中html标签不被解析的问题  如何快速使用云服务器搭建个人网站?  详解jQuery中基本的动画方法  Laravel怎么定时执行任务_Laravel任务调度器Schedule配置与Cron设置【教程】  Laravel如何处理CORS跨域请求?(配置示例)  制作网站软件推荐手机版,如何制作属于自己的手机网站app应用?  谷歌浏览器如何更改浏览器主题 Google Chrome主题设置教程  利用JavaScript实现拖拽改变元素大小  JavaScript如何实现音频处理_Web Audio API如何工作?  使用Dockerfile构建java web环境  香港服务器网站卡顿?如何解决网络延迟与负载问题?  阿里云高弹*务器配置方案|支持分布式架构与多节点部署  Laravel如何创建和注册中间件_Laravel中间件编写与应用流程  C语言设计一个闪闪的圣诞树  香港服务器选型指南:免备案配置与高效建站方案解析  如何在建站宝盒中设置产品搜索功能?  Android利用动画实现背景逐渐变暗  Windows驱动无法加载错误解决方法_驱动签名验证失败处理步骤  php结合redis实现高并发下的抢购、秒杀功能的实例  手机怎么制作网站教程步骤,手机怎么做自己的网页链接?  品牌网站制作公司有哪些,买正品品牌一般去哪个网站买?  Laravel策略(Policy)如何控制权限_Laravel Gates与Policies实现用户授权  大连企业网站制作公司,大连2025企业社保缴费网上缴费流程?  如何在云主机上快速搭建网站?  微信小程序 HTTPS报错整理常见问题及解决方案  北京网站制作公司哪家好一点,北京租房网站有哪些?  Java解压缩zip - 解压缩多个文件或文件夹实例  java ZXing生成二维码及条码实例分享  JS中对数组元素进行增删改移的方法总结  利用python获取某年中每个月的第一天和最后一天  Laravel怎么使用artisan命令缓存配置和视图  绝密ChatGPT指令:手把手教你生成HR无法拒绝的求职信  如何在局域网内绑定自建网站域名?  bootstrap日历插件datetimepicker使用方法  手机网站制作与建设方案,手机网站如何建设?  如何实现建站之星域名转发设置?  ,网页ppt怎么弄成自己的ppt?  Laravel怎么自定义错误页面_Laravel修改404和500页面模板  黑客如何通过漏洞一步步攻陷网站服务器?  成都网站制作公司哪家好,四川省职工服务网是做什么用?  昵图网官网入口 昵图网素材平台官方入口  Laravel如何使用Telescope进行调试?(安装和使用教程)  公司网站制作需要多少钱,找人做公司网站需要多少钱?