Xamarin.Android 引导页

http://blog.csdn.net/qq1326702940/article/details/78665588

https://www.cnblogs.com/catcher1994/p/5554456.html

第一次安装的APP,一般都会浏览几张引导图片,才进入APP

1.界面布局

[html] view plain copy

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent">
  5. <android.support.v4.view.ViewPager
  6. android:id="@+id/viewpage"
  7. android:layout_width="match_parent"
  8. android:layout_height="match_parent"></android.support.v4.view.ViewPager>
  9. <LinearLayout
  10. android:id="@+id/point"
  11. android:layout_width="wrap_content"
  12. android:layout_height="wrap_content"
  13. android:orientation="horizontal"
  14. android:layout_alignParentBottom="true"
  15. android:layout_centerHorizontal="true"
  16. android:layout_marginBottom="24.0dp"
  17. android:gravity="center_horizontal"></LinearLayout>
  18. <TextView
  19. android:id="@+id/guideText"
  20. android:layout_width="90dp"
  21. android:layout_height="28dp"
  22. android:text="立即体验"
  23. android:textColor="@color/White"
  24. android:background="@drawable/guide_button"
  25. android:layout_centerHorizontal="true"
  26. android:gravity="center"
  27. android:layout_marginBottom="20dp"
  28. android:layout_above="@id/point"
  29. android:visibility="gone"
  30. />
  31. </RelativeLayout>

>>> 其中的 LinearLayout 是为了显示图片切换到第几张显示的白点

2.后台

2.1  填充 ViewPager 控件的数据源

[csharp] view plain copy

  1. list = new List<View>();
  2. // 设置图片布局参数
  3. LinearLayout.LayoutParams ps = new LinearLayout.LayoutParams(ActionBar.LayoutParams.MatchParent, ActionBar.LayoutParams.MatchParent);
  4. // 创建引导图
  5. for (int i = 0; i < imageView.Length; i++)
  6. {
  7. ImageView iv = new ImageView(this);
  8. iv.LayoutParameters = ps;
  9. iv.SetScaleType(ImageView.ScaleType.FitXy);
  10. iv.SetImageResource(imageView[i]);
  11. list.Add(iv);
  12. }
  13. // 加入适配器
  14. viewpage.Adapter = new GuideAdapter(list);

>>> 其中GuideAdapter 是继承了Android.Support.V4.View.PagerAdapter的自定义累

2.2 根据引导图数量,创建对应数量的小圆点

[csharp] view plain copy

  1. // 添加小圆点
  2. for (int i = 0; i < imageView.Length; i++)
  3. {
  4. // 圆点大小适配
  5. var size = Resources.GetDimensionPixelSize(Resource.Dimension.Size_18);
  6. LinearLayout.LayoutParams pointParams = new LinearLayout.LayoutParams(size, size);
  7. if (i < 1)
  8. {
  9. pointParams.SetMargins(0, 0, 0, 0);
  10. }
  11. else
  12. {
  13. pointParams.SetMargins(10, 0, 0, 0);
  14. }
  15. ImageView imageView = new ImageView(this);
  16. imageView.LayoutParameters = pointParams;
  17. imageView.SetBackgroundResource(Resource.Drawable.NoPress);
  18. linearLayout_Point.AddView(imageView);
  19. }
  20. // 设置默认选中第一张圆点
  21. linearLayout_Point.GetChildAt(0).SetBackgroundResource(Resource.Drawable.Press);

3. ViewPager 的 ViewPager.IOnPageChangeListener 事件处理

[csharp] view plain copy

  1. public void OnPageScrolled(int position, float positionOffset, int positionOffsetPixels)
  2. {
  3. }
  4. public void OnPageScrollStateChanged(int state)
  5. {
  6. }
  7. /// <summary>
  8. /// 滑动到第几张图片
  9. /// </summary>
  10. /// <param name="position"></param>
  11. public void OnPageSelected(int position)
  12. {
  13. for (int i = 0; i < imageView.Length; i++)
  14. {
  15. if (i == position)
  16. {
  17. linearLayout_Point.GetChildAt(position).SetBackgroundResource(Resource.Drawable.Press);
  18. }
  19. else
  20. {
  21. linearLayout_Point.GetChildAt(i).SetBackgroundResource(Resource.Drawable.NoPress);
  22. }
  23. }
  24. // 滑动到最后一张图,显示按钮
  25. if (position == imageView.Length - 1)
  26. {
  27. tv.Visibility = ViewStates.Visible;
  28. }
  29. else
  30. {
  31. tv.Visibility = ViewStates.Gone;
  32. }
  33. }

4.项目地址:https://github.com/harrylsp/Guide

0x01 前言

  对于现在大部分的APP,第一次打开刚安装或更新安装的APP都会有几个引导界面,通常这几个引导页是告诉用户

APP有些什么功能或者修改了什么bug、新增了什么功能等等等。

  下面就用Xamarin.Android来简单实现一下。主要用到的是ViewPager,当然也就离不开Xamarin.Android.Support.v4

如果遇到不能编译的问题,可以参考Xamarin.Android之简单的抽屉布局的出错处理方案。

0x02 页面布局编写

新建一个Android项目

添加几个简单的布局页面。

首先是添加个启动页面,splash.axml

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
 3     xmlns:tools="http://schemas.android.com/tools"
 4     android:layout_width="match_parent"
 5     android:layout_height="match_parent">
 6     <android.support.v4.view.ViewPager
 7         android:id="@+id/viewpager"
 8         android:layout_width="match_parent"
 9         android:layout_height="match_parent" />
10     <LinearLayout
11         android:id="@+id/ll"
12         android:orientation="horizontal"
13         android:layout_width="wrap_content"
14         android:layout_height="wrap_content"
15         android:layout_marginBottom="24.0dip"
16         android:layout_alignParentBottom="true"
17         android:layout_centerHorizontal="true">
18         <ImageView
19             android:layout_width="wrap_content"
20             android:layout_height="wrap_content"
21             android:layout_gravity="center_vertical"
22             android:clickable="true"
23             android:padding="15.0dip"
24             android:src="@drawable/dot" />
25         <ImageView
26             android:layout_width="wrap_content"
27             android:layout_height="wrap_content"
28             android:layout_gravity="center_vertical"
29             android:clickable="true"
30             android:padding="15.0dip"
31             android:src="@drawable/dot" />
32         <ImageView
33             android:layout_width="wrap_content"
34             android:layout_height="wrap_content"
35             android:layout_gravity="center_vertical"
36             android:clickable="true"
37             android:padding="15.0dip"
38             android:src="@drawable/dot" />
39     </LinearLayout>
40 </RelativeLayout>

引导页,用了一个ViewPager,下面的线性布局是用来存放的三个点就是当前所在的引导页面。

用到的ImageView有个src指向drawable下面的dot.xml。内容如下:

1 <?xml version="1.0" encoding="utf-8" ?>
2 <selector
3   xmlns:android="http://schemas.android.com/apk/res/android">
4   <item android:state_enabled="true" android:drawable="@drawable/dark_dot" />
5   <item android:state_enabled="false" android:drawable="@drawable/white_dot" />
6 </selector>

然后是3个引导页的具体内容。

guide_first.axml

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 3     android:layout_width="match_parent"
 4     android:layout_height="match_parent"
 5     android:orientation="vertical">
 6     <TextView
 7         android:layout_width="match_parent"
 8         android:layout_height="match_parent"
 9         android:gravity="center"
10         android:text="guide---first"
11         android:textSize="30sp" />
12 </LinearLayout>

guide_second.axml

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 3     android:layout_width="match_parent"
 4     android:layout_height="match_parent"
 5     android:orientation="vertical">
 6     <TextView
 7         android:layout_width="match_parent"
 8         android:layout_height="match_parent"
 9         android:gravity="center"
10         android:text="guide--second"
11         android:textSize="30sp" />
12 </LinearLayout>

guide_third.axml

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 3     android:layout_width="match_parent"
 4     android:layout_height="match_parent"
 5     android:orientation="vertical">
 6     <TextView
 7         android:layout_width="match_parent"
 8         android:layout_height="wrap_content"
 9         android:layout_marginTop="250dp"
10         android:gravity="center"
11         android:text="guide--third"
12         android:textSize="30sp" />
13     <Button
14         android:id="@+id/startBtn"
15         android:layout_width="wrap_content"
16         android:layout_height="wrap_content"
17         android:layout_alignParentBottom="true"
18         android:layout_centerHorizontal="true"
19         android:text="begin now"
20         android:layout_gravity="center"
21         android:layout_marginBottom="55dp" />
22 </LinearLayout>

这里没有用图片来展示,就简单的用了文字,没有设计师设计,so....随意一点。

最后是Main.axml

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 3     android:layout_width="fill_parent"
 4     android:layout_height="fill_parent">
 5     <TextView
 6         android:layout_width="fill_parent"
 7         android:layout_height="wrap_content"
 8         android:gravity="center"
 9         android:layout_gravity="center_vertical"
10         android:text="the main page"
11         android:textSize="30sp" />
12 </LinearLayout>

0x03 Activity的编写

首先SplashActivity

 1 using Android.App;
 2 using Android.Content;
 3 using Android.Content.PM;
 4 using Android.OS;
 5 using Android.Widget;
 6 namespace GuideDemo
 7 {
 8     [Activity(Label = "GuideDemo", MainLauncher = true, Icon = "@drawable/icon")]
 9     public class SplashActivity : Activity
10     {
11         protected override void OnCreate(Bundle savedInstanceState)
12         {
13             base.OnCreate(savedInstanceState);
14             SetContentView(Resource.Layout.splash);
15             //version‘s infomation
16             var version = PackageManager.GetPackageInfo(this.PackageName, PackageInfoFlags.MatchAll).VersionName;
17             var tvVersion = FindViewById<TextView>(Resource.Id.tv_version);
18             tvVersion.Text = "Version " + version;
19             //get infomation from shared preferences
20             var sp = GetSharedPreferences("app_setting", FileCreationMode.Private);
21             new Handler().PostDelayed(() =>
22             {
23                 Intent intent;
24                 //first or not
25                 if (sp.GetString("version", "") != version)
26                 {
27                     intent = new Intent(this, typeof(GuideActivity));
28                 }
29                 else
30                 {
31                     intent = new Intent(this, typeof(MainActivity));
32                 }
33                 StartActivity(intent);
34                 this.Finish();
35             }, 1000);
36         }
37     }
38 }

把是否是第一次开启信息存放到sharepreferences,我这里主要是通过版本号来控制。

然后是GuideActivity

 1 using Android.App;
 2 using Android.Content;
 3 using Android.Content.PM;
 4 using Android.OS;
 5 using Android.Support.V4.View;
 6 using Android.Views;
 7 using Android.Widget;
 8 using System;
 9 using System.Collections.Generic;
10 using static Android.Support.V4.View.ViewPager;
11 namespace GuideDemo
12 {
13     [Activity(Label = "GuideActivity")]
14     public class GuideActivity : Activity
15     {
16         private ViewPager viewPager;
17
18         private List<View> views;
19
20         private View view1, view2, view3;
21
22         private Button btnStart;
23
24         private ImageView[] dots;
25
26         private int currentIndex;
27         private LinearLayout ll;
28         protected override void OnCreate(Bundle savedInstanceState)
29         {
30             base.OnCreate(savedInstanceState);
31             SetContentView(Resource.Layout.activity_guide);
32             viewPager = FindViewById<ViewPager>(Resource.Id.viewpager);
33             //the layout
34             LayoutInflater mLi = LayoutInflater.From(this);
35             view1 = mLi.Inflate(Resource.Layout.guide_first, null);
36             view2 = mLi.Inflate(Resource.Layout.guide_second, null);
37             view3 = mLi.Inflate(Resource.Layout.guide_third, null);
38             views = new List<View>();
39             views.Add(view1);
40             views.Add(view2);
41             views.Add(view3);
42
43             //the adapter
44             viewPager.Adapter = new ViewPagerAdapter(views);
45             //page selected
46             viewPager.PageSelected += PageSelected;
47             ll = FindViewById<LinearLayout>(Resource.Id.ll);
48             //the dot infomation
49             dots = new ImageView[3];
50             for (int i = 0; i < views.Count; i++)
51             {
52                 dots[i] = (ImageView)ll.GetChildAt(i);
53                 dots[i].Enabled = false;
54             }
55             dots[0].Enabled = true;
56             //the button
57             btnStart = view3.FindViewById<Button>(Resource.Id.startBtn);
58             btnStart.Click += Start;
59         }
60         /// <summary>
61         /// page selected
62         /// </summary>
63         /// <param name="sender"></param>
64         /// <param name="e"></param>
65         private void PageSelected(object sender, PageSelectedEventArgs e)
66         {
67             ll = FindViewById<LinearLayout>(Resource.Id.ll);
68             for (int i = 0; i < views.Count; i++)
69             {
70                 dots[i] = (ImageView)ll.GetChildAt(i);
71                 dots[i].Enabled = false;
72             }
73             dots[e.Position].Enabled = true;
74         }
75         /// <summary>
76         /// start the main page
77         /// </summary>
78         /// <param name="sender"></param>
79         /// <param name="e"></param>
80         private void Start(object sender, EventArgs e)
81         {
82             //get infomation from shared preferences
83             var sp = GetSharedPreferences("app_setting", FileCreationMode.Private);
84             //the editor
85             var editor = sp.Edit();
86             //update
87             editor.PutString("version", PackageManager.GetPackageInfo(this.PackageName, PackageInfoFlags.MatchAll).VersionName).Commit() ;
88             StartActivity(typeof(MainActivity));
89             this.Finish();
90         }
91     }
92 }

主要是ViewPager处理、页面切换点的处理以及begin now 按钮的点击事件。

其中有个ViewPagerAdapter要自己实现

 1 using Android.Support.V4.View;
 2 using Android.Views;
 3 using System.Collections.Generic;
 4 namespace GuideDemo
 5 {
 6     internal class ViewPagerAdapter : PagerAdapter
 7     {
 8         private List<View> views;
 9         public ViewPagerAdapter(List<View> views)
10         {
11             this.views = views;
12         }
13         public override int Count
14         {
15             get
16             {
17                 if (views != null)
18                 {
19                     return views.Count;
20                 }
21                 else
22                 {
23                     return 0;
24                 }
25             }
26         }
27         public override bool IsViewFromObject(View view, Java.Lang.Object objectValue)
28         {
29             return view== objectValue;
30         }
31         public override void DestroyItem(ViewGroup container, int position, Java.Lang.Object objectValue)
32         {
33             container.RemoveView(views[position]);
34         }
35         public override Java.Lang.Object InstantiateItem(ViewGroup container, int position)
36         {
37             container.AddView(views[position], 0);
38             return views[position];
39         }
40     }
41 }

最后是MainActivity

 1 using Android.App;
 2 using Android.OS;
 3 namespace GuideDemo
 4 {
 5     [Activity(Label = "GuideDemo")]
 6     public class MainActivity : Activity
 7     {
 8         protected override void OnCreate(Bundle bundle)
 9         {
10             base.OnCreate(bundle);
11
12             SetContentView(Resource.Layout.Main);
13         }
14     }
15 }

到这里就OK了,下面就来看看效果。

0x04 效果图

时间: 2024-10-13 08:23:53

Xamarin.Android 引导页的相关文章

Android引导页设计

大家在安装好一个应用后,第一次打开时往往会出现一个使用引导页,形式一般为三.四张图片,随着我们的滑动进行切换,在最后一页会有一个进入应用的按钮,我们通过点击这个按钮可以进入应用,其实这其中没有太多的复杂的地方,切换的完成就是一个ViewPager,说了这么多,下面开始为大家解读代码: 开始我们的设计之前我们需要做一些准备工作,首先我们新建一个工程,然后选择工程通过右键单击properties,然后选择Java Build Path,点击右侧Libraries,再点击Add jar,将我们工程li

Android 引导页公共方法LeaderPager

SimpAndroidFarme是近期脑子突然发热想做的android快速开发的框架,目标是模块化 常用的控件,方便新手学习和使用.也欢迎老鸟来一起充实项目:项目地址 引导页是我们开发app很常用的功能,但是一般都是第一此运行才会执行,每写个项目 都要为这种一次性的东西写那么多重复代码太讨厌啦- 现在再也不用担心这个问题了! 一般引导有两种图片源 , 本地图片/ 网络图片 目标使用方法: 使用本地提供的图片 id 参数一: viewpager 参数二: 图片url集合(使用本地则传null) 参

Android引导页的实现

实现原理:使用ViewPager控件(com.android.support:support-v4:22.1.1),把引导页的layout文件放进ViewPager控件就可以了. ViewPager控件本质上也是个列表控件,横向滚动,一个页面一个页面的滚动,底下并没有滚动条,所以非常适合做引导页,和页签的tap控件来做横向滚动的页面也非常常用. 首先引用 com.android.support:support-v4:22.1.1 引导页面的layout <RelativeLayout xmlns

Android引导页Splash设计

Android_Splash引导页就是在应用第一次安装时用来介绍应用的部分功能的动画页面,让用户大致的了解这个应用有啥功能.当用户首次安装时会有引导页面,用户下次启动的时候,就会直接进入主页面. SpUtils.java package com.zwb.splashdemo.utils; import android.content.Context; import android.content.SharedPreferences; /** * 类描述:SharedPreferences工具类

推荐4个Android引导页控件

Guideshow 快速实现引导页, 2015-08-03 更新 CircleIndicator 一个轻量级的viewpager指示器 ,类似于nexus5 启动器的效果 2015-08-02 更新 XhsWelcomeAnim 小红书欢迎引导第二版 2015-07-10 更新 AppIntro 非常简洁.漂亮的引导页控件,使用简单 2015-07-07 更新 http://www.see-source.com/androidwidget/list.html

Xamarin.Android 启动页

打开软件的时候相当慢,会有白屏显示,这样的用户体验效果不好,所以需要增加一个启动页来过渡.步骤如下: 第一步:根据自己需求找到一个png图片,用于启动展示,放在Drawable 文件夹下,我这里命名为Loading.png. 第二步:在Drawable 文件夹下创建 splashscreen.xml,用于展示Loading.png. <?xml version="1.0" encoding="utf-8" ?> <bitmap xmlns:andr

Android 引导页的代码

布局代码 <android.support.v4.view.ViewPager android:id="@+id/viewpage" android:layout_width="match_parent" android:layout_height="match_parent" /> <!--android:background="@drawable/btnselector"--> <Button

Android 1分钟教你打造酷炫的引导页(实现ViewPager淡入淡出切换)

纯手工自制的Android引导页,实现了Viewpager切换的淡入淡出(页面不移动!)切换以及文字动画. 下面是效果演示: 实现思路+心路历程...: 其实别的都还蛮简单的,就是这个ViewPager的淡入淡出切换动画比较棘手,以前都没有做过,然后去网上找了好久好久. 其中碰到各种坑无数,大概90%的人是引的 JazzyViewPager的包然后就balabala说自己实现了种种功能,真是醉了.... 结论是国内根本找不到这个效果的实现嘛.... 然后 在Github下了JazzyViewPa

Android 高级UI设计笔记22:Android 指示引导页(带圆点)

1. 引导页: 我们在安装某个软件首次运行时,大部分都会有一个引导页的提示,介绍软件新功能的加入或者使用说明等,支持滑动且下面会有几个圆点,显示共有多少页和当前图片的位置,类似如下效果: 2. 引导页具体实现功能如下: 可以左右滑动图片. 图片的索引圆点显示,看出当前图片所在的位置和图片的数量. 可任意左右滑动. 图片的索引圆点带有动画效果. 最后一页显示按钮,点击进入应用. 3. 引导页实现逻辑过程: 利用ViewPager实现用户引导界面. 在这里,我们需要用到google提到的一个支持包—