零、前言

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

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

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

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

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

       

一、写个自定义的ProcessDialog

 using Android.App;
using Android.Content;
using Android.Graphics.Drawables;
using Android.Views;
using Android.Widget;
namespace Catcher.AndroidDemo.LoadingAnimationDemo.Extensions
{
public class CustomProgressDialog : Dialog
{
private static CustomProgressDialog customProgressDialog; public CustomProgressDialog(Context context):base(context)
{
}
public CustomProgressDialog(Context context, int themeResId):base(context,themeResId)
{
}
/// <summary>
/// create the dialog
/// </summary>
/// <param name="context">the context</param>
/// <returns>the instance of the customize dialog</returns>
public static CustomProgressDialog CreateDialog(Context context)
{
customProgressDialog = new CustomProgressDialog(context, Resource.Style.CustomProgressDialog);
//set the view
customProgressDialog.SetContentView(Resource.Layout.loading);
//set the gravity
customProgressDialog.Window.Attributes.Gravity = GravityFlags.Center;
return customProgressDialog;
}
/// <summary>
/// called whenever the window focus changes
/// </summary>
/// <param name="hasFocus">whether the window now has focus</param>
public override void OnWindowFocusChanged(bool hasFocus)
{
base.OnWindowFocusChanged(hasFocus);
if (customProgressDialog == null)
{
return;
}
ImageView imageView = customProgressDialog.FindViewById<ImageView>(Resource.Id.loadingImageView);
AnimationDrawable animationDrawable = (AnimationDrawable)imageView.Background;
//start the animation
animationDrawable.Start();
}
}
}

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

二、新建一个loading.xml

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

 <?xml version="1.0" encoding="utf-8" ?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android" >
<item
android:drawable="@drawable/loading0"
android:duration="120"/>
<item
android:drawable="@drawable/loading1"
android:duration="120"/>
<item
android:drawable="@drawable/loading2"
android:duration="120"/>
</animation-list>

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

三、给自定义Dialog写个简单的布局loading.axml

 <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical">
<ImageView
android:id="@+id/loadingImageView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@anim/loading" />
<TextView
android:id="@+id/tv_loadingmsg"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:textSize="12sp"
android:text="loading....." />
</LinearLayout>

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

四、编写Main.axml

 <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<Button
android:id="@+id/go"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="go!go!go!" />
</LinearLayout>

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

 using Android.App;
using Android.Content;
using Android.OS;
using Android.Widget;
using Catcher.AndroidDemo.LoadingAnimationDemo.Extensions;
using System.Threading.Tasks;
namespace Catcher.AndroidDemo.LoadingAnimationDemo
{
[Activity(Label = "Catcher.AndroidDemo.LoadingAnimationDemo", MainLauncher = true, Icon = "@drawable/icon")]
public class MainActivity : Activity
{
CustomProgressDialog dialog;
protected override void OnCreate(Bundle bundle)
{
base.OnCreate(bundle);
SetContentView(Resource.Layout.Main);
//create a new dialog
dialog = CustomProgressDialog.CreateDialog(this);
dialog.OnWindowFocusChanged(true); Button btnGO = FindViewById<Button>(Resource.Id.go);
btnGO.Click += (s,e) =>
{
int result = ;
//show the dialog
dialog.Show();
//do some things
Task task = new Task(() =>
{
for (int i = ; i < ; i++)
{
result += i;
}
});
task.ContinueWith(t =>
{
Intent intent = new Intent(this, typeof(LastActivity));
intent.PutExtra("name", result.ToString());
StartActivity(intent);
});
task.Start();
};
}
protected override void OnResume()
{
base.OnResume();
if(dialog.IsShowing)
{
dialog.Dismiss();
}
}
}
}

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

五、编写last.axml和LastActivity

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

取出结果放到TextView中。

六、效果图

示例代码下载:

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

Xamarin.Android之给我们的应用加点过渡效果的更多相关文章

  1. XAMARIN.ANDROID SIGNALR 实时消息接收发送示例

    SignalR 是一个开发实时 Web 应用的 .NET 类库,使用 SignalR 可以很容易的构建基于 ASP.NET 的实时 Web 应用.SignalR 支持多种服务器和客户端,可以 Host ...

  2. XAMARIN ANDROID 二维码扫描示例

    现在二维码的应用越来越普及,二维码扫描也成为手机应用程序的必备功能了.本文将基于 Xamarin.Android 平台使用 ZXing.Net.Mobile  做一个简单的 Android 条码扫描示 ...

  3. 我正在使用Xamarin的跨平台框架—Xamarin.Android回忆录

    一.缘起 在自己给别家公司做兼职外包的时候,已经明确知道外包的活不是那么好干的,一般在经历了初期热血澎湃的激情后,逐渐冷淡,愤怒,再冷淡,再愤怒…,听上去好像高潮迭起,但令人尴尬的是,这高潮迭起我们都 ...

  4. APP并非一个人在战斗,还有API—Xamarin.Android回忆录

    前言 一般来说,一个客户端APP并非独立存在的,很多时候需要与服务器交互.大体可分为两方面的数据,常规字符串数据和文件数据,因为这两种数据很可能传输方式不一样,比如字符串之类的数据,使用HTTP协议, ...

  5. Xamarin.Android通知详解

    一.发送通知的机制 在日常的app应用中经常需要使用通知,因为服务.广播后台活动如果有事件需要通知用户,则需要通过通知栏显示,而在Xamarin.Android下的通知需要获取Notification ...

  6. Xamarin.Android之SQLiteOpenHelper

    一.前言 在手机中进行网络连接不仅是耗时也是耗电的,而耗电却是致命的.所以我们就需要数据库帮助我们存储离线数据,以便在用户未使用网络的情况下也可以能够使用应用的部分功能,而在需要网络连接的功能上采用提 ...

  7. Xamarin. Android实现下拉刷新功能

    PS:发现文章被其他网站或者博客抓取后发表为原创了,给图片加了个水印 下拉刷新功能在安卓和iOS中非常常见,一般实现这样的功能都是直接使用第三方的库,网上能找到很多这样的开源库.然而在Xamarin. ...

  8. Xamarin Android 之起始篇

    序言: 在博客园注册了已经有2年多了,快三年了.从开始学习这一行开始就在博客园注册了这个账号.至今也还没有写过一篇随笔,大多时候都是在园子里头潜水,看大牛写的文章,学习. 写博客不为啥,就是自己对自己 ...

  9. [译]:Xamarin.Android平台功能——位置服务

    返回索引目录 原文链接:Location Services. 译文链接:Xamarin.Android平台功能--位置服务 本部分介绍位置服务以及与如何使用位置提供商服务 Location Servi ...

随机推荐

  1. 采访Philipp Crocoll:安卓平台上整合Java和C#

    在这个采访中,我们跟开源开发者Philipp Crocoll讨论了关于Keepass2Android的相关话题.Keepass2Android不仅具有强大的密码存储的功能,还是在一个单独的安卓应用同时 ...

  2. [ZigBee] 16、Zigbee协议栈应用(二)——基于OSAL的无线控制LED闪烁分析(下)

    说在前面:上一篇介绍了无线LED闪烁实现的OSAL部分,本篇介绍如何实现无线数据收发及数据处理: 上一篇是用SI跟着流程查看源码,我个人认为以架构的思维去了解代码能让人更清晰 ::ZMain.c程序入 ...

  3. Android APK是否需要预解压

    今天在逛论坛的时候,发现有一个朋友问的问题.其主要目的,是想实现 玩家首次进入游戏的时候,或者新安装了版本的时候,对APK进行解压,写入SD卡.这样游戏运行过程中,将不会再从APK中读取资源. 以提高 ...

  4. 提供程序不支持 DatabaseExists

    如果Oracle CodeFirst模式下要用EFProviderWrapperToolkit,那么会报告以下错误: 提供程序不支持 DatabaseExists. 这个错误是因为Oracle Cod ...

  5. 新开了一个ABP交流的QQ群(579765441 ),欢迎加入

    因为ABP架构设计交流群人数一直爆满,很多想交流ABP的朋友无法加进群里, 刚新建了一个QQ群,群号579765441 (ABP架构设计交流群2),欢迎对ABP感兴趣的朋友加入. 欢迎加QQ群: AB ...

  6. 《Entity Framework 6 Recipes》中文翻译系列 (13) -----第三章 查询之使用Entity SQL

    翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 3-4使用实体SQL查询模型 问题 你想通过执行Entity SQL语句来查询你的实 ...

  7. js事件(event)的运行原理

    昨天写click事件时候突然脑袋抽筋想了想浏览器是怎么执行click事件的,为什么我们可以用e或者window.event这个对象获取一些事件的属性呐?以下是我的理解.如果您有更好的理解,欢迎评论!! ...

  8. ClickOnce部署(2):自动更新

    上次我们说了如何用最基本的方式用ClickOnce技术部署应用程序项目,本篇我们来认识一下如何让应用程序具备自动更新的功能. 我们依然通过实例来学习. 第一步,随便建一个应用程序项目,至于是控制台.W ...

  9. 【转】WPF: 自动设置Owner的ShowDialog 适用于MVVM

    原文地址:http://www.mgenware.com/blog/?p=339 WPF中的Windows的ShowDialog方法并没有提供设置Owner的参数,开发者需要在ShowDialog前设 ...

  10. PHP浅复制与深复制

    原文链接:http://www.orlion.ga/731/ php用clone复制对象有一个问题,下面用代码来说明问题: class Foo{ public $bar; public $name; ...