ViewPager使用FragmentStatePagerAdapter做Adapter,引导页使用多Fragment形式。
FragmentStatePagerAdapter代码如下:
public class GuideFragmentPagerAdapter extends FragmentStatePagerAdapter { private List<GuideBaseFragment> list; public GuideFragmentPagerAdapter(FragmentManager fm, List<GuideBaseFragment> list) { super(fm); this.list = list; } public GuideFragmentPagerAdapter(FragmentManager fm) { super(fm); } @Override public Fragment getItem(int position) { return list.get(position); } @Override public int getCount() { return list.size(); } }
ViewPager代码如下:
public class GuideViewPager extends ViewPager { private Bitmap bg; private Paint b = new Paint(1); public GuideViewPager(Context context) { super(context); } public GuideViewPager(Context context, AttributeSet attrs) { super(context, attrs); } @Override protected void dispatchDraw(Canvas canvas) { if (this.bg != null) { int width = this.bg.getWidth(); int height = this.bg.getHeight(); int count = getAdapter().getCount(); int x = getScrollX(); // 子View中背景图片需要显示的宽度,放大背景图或缩小背景图。 int n = height * getWidth() / getHeight(); /** * (width - n) / (count - 1)表示除去显示第一个ViewPager页面用去的背景宽度,剩余的ViewPager需要显示的背景图片的宽度。 * getWidth()等于ViewPager一个页面的宽度,即手机屏幕宽度。在该计算中可以理解为滑动一个ViewPager页面需要滑动的像素值。 * ((width - n) / (count - 1)) /getWidth()也就表示ViewPager滑动一个像素时,背景图片滑动的宽度。 * x * ((width - n) / (count - 1)) / getWidth()也就表示ViewPager滑动x个像素时,背景图片滑动的宽度。 * 背景图片滑动的宽度的宽度可以理解为背景图片滑动到达的位置。 */ int w = x * ((width - n) / (count - 1)) / getWidth(); canvas.drawBitmap(this.bg, new Rect(w, 0, n + w, height), new Rect( x, 0, x + getWidth(), getHeight()), this.b); } super.dispatchDraw(canvas); } public void setBackGroud(Bitmap paramBitmap) { this.bg = paramBitmap; this.b.setFilterBitmap(true); } }
Fragment代码如下:
public abstract class GuideBaseFragment extends Fragment { public abstract void startAnimation(); public abstract void stopAnimation(); } public class WelcomeGuideFragment extends GuideBaseFragment implements View.OnClickListener { private static final float ZOOM_MAX = 1.3f; private static final float ZOOM_MIN = 1.0f; private ImageView imgView_immediate_experience; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) { View rooView=inflater.inflate(R.layout.fragment_guide_welcome, null); imgView_immediate_experience=(ImageView) rooView.findViewById(R.id.imgView_immediate_experience); imgView_immediate_experience.setOnClickListener(this); return rooView; } public void playHeartbeatAnimation(){ /** * 放大动画 */ AnimationSet animationSet = new AnimationSet(true); animationSet.addAnimation(new ScaleAnimation(ZOOM_MIN, ZOOM_MAX, ZOOM_MIN, ZOOM_MAX, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF,0.5f)); animationSet.addAnimation(new AlphaAnimation(1.0f, 0.8f)); animationSet.setDuration(500); animationSet.setInterpolator(new AccelerateInterpolator()); animationSet.setFillAfter(true); animationSet.setAnimationListener(new Animation.AnimationListener() { @Override public void onAnimationStart(Animation animation) { } @Override public void onAnimationRepeat(Animation animation) { } @Override public void onAnimationEnd(Animation animation) { /** * 缩小动画 */ AnimationSet animationSet = new AnimationSet(true); animationSet.addAnimation(new ScaleAnimation(ZOOM_MAX, ZOOM_MIN, ZOOM_MAX,ZOOM_MIN, Animation.RELATIVE_TO_SELF, 0.5f,Animation.RELATIVE_TO_SELF, 0.5f)); animationSet.addAnimation(new AlphaAnimation(0.8f, 1.0f)); animationSet.setDuration(600); animationSet.setInterpolator(new DecelerateInterpolator()); animationSet.setFillAfter(false); // 实现心跳的View imgView_immediate_experience.startAnimation(animationSet); } }); // 实现心跳的View imgView_immediate_experience.startAnimation(animationSet); } @Override public void onClick(View v) { Intent intent = new Intent(); intent.setClass(getActivity(),MainActivity.class); startActivity(intent); getActivity().finish(); } @Override public void startAnimation() { playHeartbeatAnimation(); } @Override public void stopAnimation() { } }
FragmentActivity代码如下:
public class GuideActivity extends FragmentActivity { private GuideViewPager guideViewPager; private List<GuideBaseFragment> guideBaseFragmentArrayList = new ArrayList<GuideBaseFragment>(); private GuideFragmentPagerAdapter guideFragmentPagerAdapter; private ImageView[] tips;//点点点指示 private int currentSelect;//记录当前选择页序列 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_guide); //初始化点点点控件 ViewGroup group = (ViewGroup)findViewById(R.id.viewGroup); tips = new ImageView[3]; for (int i = 0; i < tips.length; i++) { ImageView imageView = new ImageView(this); imageView.setLayoutParams(new ViewGroup.LayoutParams(10, 10)); if (i == 0) { imageView.setBackgroundResource(R.drawable.page_indicator_focused); } else { imageView.setBackgroundResource(R.drawable.page_indicator_unfocused); } tips[i]=imageView; LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams( new ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT)); layoutParams.leftMargin = 20;//设置点点点view的左边距 layoutParams.rightMargin = 20;//设置点点点view的右边距 group.addView(imageView,layoutParams); } //获取自定义viewpager 然后设置背景图片 guideViewPager = (GuideViewPager) findViewById(R.id.viewpager_launcher); guideViewPager.setBackGroud(BitmapFactory.decodeResource(getResources(), R.drawable.bg_kaka_launcher)); /** * 初始化三个fragment 并且添加到list中 */ WelcomeGuideFragment rewardFragment = new WelcomeGuideFragment(); WelcomeGuideFragment privateFragment = new WelcomeGuideFragment(); WelcomeGuideFragment wFragement = new WelcomeGuideFragment(); guideBaseFragmentArrayList.add(wFragement); guideBaseFragmentArrayList.add(rewardFragment); guideBaseFragmentArrayList.add(privateFragment); guideFragmentPagerAdapter = new GuideFragmentPagerAdapter(getSupportFragmentManager(), guideBaseFragmentArrayList); guideViewPager.setAdapter(guideFragmentPagerAdapter); guideViewPager.setOffscreenPageLimit(2);//viewPager缓存页面数量 guideViewPager.setCurrentItem(0);//滑屏速度 guideViewPager.setOnPageChangeListener(changeListener); } /** * 监听viewpager的移动 */ ViewPager.OnPageChangeListener changeListener=new ViewPager.OnPageChangeListener() { @Override public void onPageSelected(int index) { setImageBackground(index);//改变点点点的切换效果 GuideBaseFragment fragment= guideBaseFragmentArrayList.get(index); guideBaseFragmentArrayList.get(currentSelect).stopAnimation();//停止前一个页面的动画 fragment.startAnimation();//开启当前页面的动画 currentSelect=index; } @Override public void onPageScrolled(int arg0, float arg1, int arg2) {} @Override public void onPageScrollStateChanged(int arg0) {} }; /** * 改变点点点的切换效果 * @param selectItems */ private void setImageBackground(int selectItems) { for (int i = 0; i < tips.length; i++) { if (i == selectItems) { tips[i].setBackgroundResource(R.drawable.page_indicator_focused); } else { tips[i].setBackgroundResource(R.drawable.page_indicator_unfocused); } } } }
Android--ViewPager制作APP引导页的更多相关文章
-
ViewPager制作APP引导页+若干动画效果
ViewPager使用FragmentStatePagerAdapter做Adapter,引导页使用多Fragment形式. 见http://www.cnblogs.com/bmbh/p/567276 ...
-
android使用ViewPager实现欢迎引导页
android使用ViewPager实现欢迎引导页 大多数APP第一次启动的时候,都会有一个引导界面,左右滑动,到最后一张,用户点击才再次进入主界面.当第二次启动的时候,则直接进入主界面. 这种效果一 ...
-
[Android实例] app引导页(背景图片切换加各个页面动画效果)(申明:来源于网络)
[Android实例] app引导页(背景图片切换加各个页面动画效果)(申明:来源于网络) 地址: http://www.eoeandroid.com/thread-918356-1-1.html h ...
-
高仿京东到家APP引导页炫酷动画效果
前言 京东到家APP的引导页做的可圈可点,插画+动效,简明生动地说明了APP最吸引用户的几个亮点(商品多,价格低,配送快...).本文主要分析拆解这些动画效果,并完成一个高仿Demo,完整的Demo代 ...
-
iOS - GitHub干货分享(APP引导页的高度集成 - DHGuidePageHUD - ②)
距上一篇博客"APP引导页的高度集成 - DHGuidePageHUD - ①"的发布有一段时间了, 后来又在SDK中补充了一些新的内容进去但是一直没来得及跟大家分享, 今天来跟大 ...
-
iOS - GitHub干货分享(APP引导页的高度集成 - DHGuidePageHUD - ①)
好长时间没更新博客, 是时候来一波干货分享了;APP引导页话不多说每一个APP都会用到,分量不重但是不可缺少,不论是APP的首次安装还是版本的更新,首先展现给用户眼前的也就只有它了吧,当然这里讲的不是 ...
-
GitHub干货分享(APP引导页的高度集成 - DHGuidePageHUD)
每一个APP都会用到APP引导页,分量不重但是不可缺少,不论是APP的首次安装还是版本的更新,首先展现给用户眼前的也就只有它了,当然这里讲的不是APP引导页的美化而是APP引导页的高度集成,一行代码搞 ...
-
android脚步---APP引导页添加
package com.leadcore.uudatoutie; import java.util.ArrayList; import com.leadcore.uudatoutie.R; impor ...
-
Android零基础入门第69节:ViewPager快速实现引导页
在很多APP第一次启动时都会出现引导页,在一些APP里面还会包括一些左右滑动翻页和页面轮播切换的情况.在之前也已经学习了AdapterViewFlipper和ViewFlipper,都可以很好的实现, ...
随机推荐
-
Windows安装程序 报错 “已安装了较新版本” 导致无法安装程序的解决方法
打开注册表 HKEY_CURRENT_USER\Software\Microsoft\Installer\Products ,“查找”程序名称 如果有程序名和安装程序相同的 ,删除整个 项 ! 然后就 ...
-
POJ 2823 Sliding Window 再探单调队列
重新刷这个经典题,感觉跟以前不一样了,变得更加容易理解了,不讲解了,看代码.注意:要用C++提交,用G++会超时.. 代码: #include <iostream> #include &l ...
-
Visio绘制时序图
用visio建立时序图 1.选择模版 2.常见符号 时序图创建步骤 1.确定交互过程的上下文: 2.识别参与过程的交互对象: 3.为每个对象设置生命线: 4.从初始消息开始,依次画出随后消息: 5.考 ...
-
Python基础教程【读书笔记】 - 2016/7/4
希望通过博客园持续的更新,分享和记录Python基础知识到高级应用的点点滴滴! 第二波:第7章 更加抽象 [总览] 创建自己的对象,是Python的核心概念!Python被称为面向对象的语言.介绍如 ...
-
Apache下安装配置mod_pagespeed模块,轻松完成网站提速
mod_pagespeed是一个开源的Apache module,它由谷歌开发,通过优化你的网页来减少响应延迟和带宽占用.作用参考ngx_pagespeed功能:http://blog.linuxey ...
-
html5中的常用的库
JQuery是继prototype之后又一个优秀的Javascript库.它是轻量级的js库 ,它兼容CSS3,还兼容各种浏览器(IE 6.0+, FF1.5+, Safari 2.0+, Opera ...
-
《how to design programs》第10章表的进一步处理
返回表的函数: 下面是一个求工资的函数: ;; wage : number -> number ;; to compute the total wage (at $12 per hour) ...
-
andorid 控件 Bootstrap3.0风格的控件 精美UI控件库
Bootstrap是Twitter推出的一个开源的用于前端开发的工具包.它由Twitter的设计师Mark Otto和Jacob Thornton合作开发,是一个CSS/HTML框架.Bootstra ...
-
MassTransit&;Sagas分布式服务开发ppt分享
saga,与分布式相关,最早被定义在Hector Garcia-Molina和Kenneth Salem的论文"Sagas"中.这篇论文提出了一个saga机制来作为分布式事务的替代 ...
-
【LOJ#6066】「2017 山东一轮集训 Day3」第二题(哈希,二分)
[LOJ#6066]「2017 山东一轮集训 Day3」第二题(哈希,二分) 题面 LOJ 题解 要哈希是很显然的,那么就考虑哈希什么... 要找一个东西可以表示一棵树,所以我们找到了括号序列. 那么 ...