zoukankan      html  css  js  c++  java
  • Xamarin.Android之给我们的应用加点过渡效果

    零、前言

    试想一下,我们的应用正在请求一些数据,假设网络不是很好,要花比较长的时间等待,这个时候界面什么反应也没有,

    一动不动,用户可能就会认为应用挂掉了,这么久都没反应的,说不定下一分钟用户就把它卸载了。

    这样就造成了十分不好的用户的体验。为此,我们可以在这个过程中加上那么点过渡效果,告诉用户正在加载数据。

    稍微改善一下用户体验,至少能让用户知道我们的app在干嘛!

    本文使用的是自定义ProcessDialog来实现过渡效果,准备了三张图片资源

           

    一、写个自定义的ProcessDialog

     1 using Android.App;
     2 using Android.Content;
     3 using Android.Graphics.Drawables;
     4 using Android.Views;
     5 using Android.Widget;
     6 namespace Catcher.AndroidDemo.LoadingAnimationDemo.Extensions
     7 {
     8     public class CustomProgressDialog : Dialog
     9     {        
    10         private static CustomProgressDialog customProgressDialog;
    11         
    12         public CustomProgressDialog(Context context):base(context)
    13         {                        
    14         }
    15         public CustomProgressDialog(Context context, int themeResId):base(context,themeResId)
    16         {        
    17         }
    18         /// <summary>
    19         /// create the dialog
    20         /// </summary>
    21         /// <param name="context">the context</param>
    22         /// <returns>the instance of the customize dialog</returns>
    23         public static CustomProgressDialog CreateDialog(Context context)
    24         {
    25             customProgressDialog = new CustomProgressDialog(context, Resource.Style.CustomProgressDialog);
    26             //set the view
    27             customProgressDialog.SetContentView(Resource.Layout.loading);
    28             //set the gravity
    29             customProgressDialog.Window.Attributes.Gravity = GravityFlags.Center;
    30             return customProgressDialog;
    31         }
    32         /// <summary>
    33         /// called whenever the window focus changes
    34         /// </summary>
    35         /// <param name="hasFocus">whether the window now has focus</param>
    36         public override void OnWindowFocusChanged(bool hasFocus)
    37         {
    38             base.OnWindowFocusChanged(hasFocus);
    39             if (customProgressDialog == null)
    40             {
    41                 return;
    42             }
    43             ImageView imageView = customProgressDialog.FindViewById<ImageView>(Resource.Id.loadingImageView);            
    44             AnimationDrawable animationDrawable = (AnimationDrawable)imageView.Background;
    45             //start the animation
    46             animationDrawable.Start();
    47         }        
    48     }
    49 }  

    比较简单,就是写了个创建的方法和重写了Dialog的OnWindowFocusChanged方法

    二、新建一个loading.xml

    loading.xml可以放在Resources下面的drawable文件夹,也可放在新建的anim文件夹。

     1 <?xml version="1.0" encoding="utf-8" ?> 
     2 <animation-list xmlns:android="http://schemas.android.com/apk/res/android" >
     3     <item
     4         android:drawable="@drawable/loading0"
     5         android:duration="120"/>
     6     <item
     7         android:drawable="@drawable/loading1"
     8         android:duration="120"/>
     9     <item
    10         android:drawable="@drawable/loading2"
    11         android:duration="120"/>
    12 </animation-list>  

    这个就是设置我们的动画图片。

    三、给自定义Dialog写个简单的布局loading.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     android:orientation="vertical">
     6     <ImageView
     7         android:id="@+id/loadingImageView"
     8         android:layout_width="wrap_content"
     9         android:layout_height="wrap_content"
    10         android:background="@anim/loading" />
    11     <TextView
    12         android:id="@+id/tv_loadingmsg"
    13         android:layout_width="wrap_content"
    14         android:layout_height="wrap_content"
    15         android:layout_gravity="center"
    16         android:textSize="12sp"
    17         android:text="loading....." />
    18 </LinearLayout>  

    一个ImageView用来显示动画,一个TextView用来显示loading

    四、编写Main.axml

     1 <?xml version="1.0" encoding="utf-8"?>
     2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
     3     android:orientation="vertical"
     4     android:layout_width="match_parent"
     5     android:layout_height="match_parent">
     6     <Button
     7         android:id="@+id/go"
     8         android:layout_width="match_parent"
     9         android:layout_height="wrap_content"
    10         android:text="go!go!go!" />
    11 </LinearLayout>  

    五、在MainActivity中使用自定义的Dialog

     1 using Android.App;
     2 using Android.Content;
     3 using Android.OS;
     4 using Android.Widget;
     5 using Catcher.AndroidDemo.LoadingAnimationDemo.Extensions;
     6 using System.Threading.Tasks;
     7 namespace Catcher.AndroidDemo.LoadingAnimationDemo
     8 {
     9     [Activity(Label = "Catcher.AndroidDemo.LoadingAnimationDemo", MainLauncher = true, Icon = "@drawable/icon")]
    10     public class MainActivity : Activity
    11     {
    12         CustomProgressDialog dialog;
    13         protected override void OnCreate(Bundle bundle)
    14         {            
    15             base.OnCreate(bundle);
    16             SetContentView(Resource.Layout.Main);
    17             //create a new dialog
    18             dialog = CustomProgressDialog.CreateDialog(this);
    19             dialog.OnWindowFocusChanged(true);
    20                         
    21             Button btnGO = FindViewById<Button>(Resource.Id.go);
    22             btnGO.Click += (s,e) => 
    23             {
    24                 int result = 0;
    25                 //show the dialog
    26                 dialog.Show();
    27                 //do some things
    28                 Task task = new Task(() =>
    29                 {
    30                     for (int i = 0; i < 100; i++)
    31                     {
    32                         result += i;
    33                     }
    34                 });
    35                 task.ContinueWith(t =>
    36                 {
    37                     Intent intent = new Intent(this, typeof(LastActivity));
    38                     intent.PutExtra("name", result.ToString());  
    39                     StartActivity(intent);
    40                 });
    41                 task.Start();                                
    42             };           
    43         }      
    44         protected override void OnResume()
    45         {
    46             base.OnResume();
    47             if(dialog.IsShowing)
    48             { 
    49                 dialog.Dismiss();
    50             }
    51         }
    52     }
    53 }  

    在这里没有真正的用网络请求,而是用计算累加和来代替。

    五、编写last.axml和LastActivity

     1 <?xml version="1.0" encoding="utf-8"?>
     2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
     3     android:orientation="vertical"
     4     android:layout_width="match_parent"
     5     android:layout_height="match_parent">
     6     <TextView
     7         android:layout_width="match_parent"
     8         android:layout_height="wrap_content"
     9         android:id="@+id/tv_show"
    10         android:textSize="50sp"
    11         android:gravity="center"
    12         android:layout_marginTop="20dp" />
    13 </LinearLayout>  
     1 using Android.App;
     2 using Android.Content;
     3 using Android.OS;
     4 using Android.Widget;
     5 namespace Catcher.AndroidDemo.LoadingAnimationDemo
     6 {
     7     [Activity(Label = "LastActivity")]
     8     public class LastActivity : Activity
     9     {
    10         protected override void OnCreate(Bundle savedInstanceState)
    11         {
    12             base.OnCreate(savedInstanceState);
    13             // Create your application here
    14             SetContentView(Resource.Layout.last);
    15             TextView tvShow = FindViewById<TextView>(Resource.Id.tv_show);
    16             tvShow.Text = Intent.GetStringExtra("name");
    17         }
    18     }
    19 }  

    取出结果放到TextView中。

    六、效果图

    示例代码下载:

     https://github.com/hwqdt/Demos/tree/master/src/Catcher.AndroidDemo/Catcher.AndroidDemo.LoadingAnimationDemo

  • 相关阅读:
    Confluence 6 连接到一个 LDAP 目录
    Confluence 6 LDAP 成员结构设置
    Confluence 6 LDAP 用户组结构设置
    Confluence 6 LDAP 用户结构设置
    Confluence 6 LDAP 高级设置
    Confluence 6 自动添加用户到用户组
    Confluence 6 权限设置
    一个小白的测试环境docker化之路
    客户端SDK测试思路
    限时购校验小工具&dubbo异步调用实现限
  • 原文地址:https://www.cnblogs.com/catcher1994/p/5492973.html
Copyright © 2011-2022 走看看