Xamarin.Android之动画

Translate动画

这个动画是最常使用到的,主要就是将控件从一个位置移动到另一个位置,并且还可以在这其中增加一定的效果,下面我们将采用两种方式实现动画,首选的是利用XML来制作动画,其次就是利用代码。

首先我们在Resources中新建一个名为anim的文件夹,然后在该文件夹下新建两个xml,分别命名为in_from_bottomout_from_bottom,然后我们将下面的代码写入其中:

in_from_bottom:

1 <set xmlns:android="http://schemas.android.com/apk/res/android"
2      android:interpolator="@android:anim/bounce_interpolator">
3   <translate android:startOffset="500" android:fromYDelta="0" android:toYDelta="80%p" android:duration="1000" />
4 </set>

out_from_bottom:

1 <set xmlns:android="http://schemas.android.com/apk/res/android"
2      android:interpolator="@android:anim/bounce_interpolator">
3   <translate android:startOffset="500" android:fromYDelta="80%p" android:toYDelta="0" android:duration="1000"/>
4 </set>

其中set标签表示一个动画集合,该标签下可以包含多个不同的动画,这样就可以将他们组合成一个动画,这里我们不需要过多的了解它,主要是理解translate标签,这个标签代表的就是滑动动画,其中各个属性的说明如下所示:

Interpolator:表示下面的动画的过渡形式,比如逐渐变慢或者逐渐变快。

startOffset:表示动画开始前的延迟(单位毫秒)

fromYDelta:表示动画开始的位置(其中80%p表示屏幕的80%的高度部分,对应的还有fromXDelta属性)

toYDelta:表示动画结束的位置(对应的还有toXDelta属性)

Duration:表示动画持续的时间(单位毫秒)

介绍完了具体属性,下面就是利用这个动画。首先我们新建一个活动,然后将其视图的xml改成如下所示:

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <RelativeLayout xmlns:p1="http://schemas.android.com/apk/res/android"
 3     p1:layout_width="match_parent"
 4     p1:layout_height="match_parent"
 5     p1:id="@+id/relativeLayout1"
 6     p1:padding="5dp">
 7     <TextView
 8         p1:text="会动的TextView"
 9         p1:layout_width="match_parent"
10         p1:layout_height="wrap_content"
11         p1:id="@+id/tvAnim"
12         p1:gravity="center"
13         p1:padding="5dp"
14         p1:background="#00f"
15         p1:textSize="30dp" />
16     <Button
17         p1:text="消 失"
18         p1:layout_width="wrap_content"
19         p1:layout_height="wrap_content"
20         p1:id="@+id/btnHide"
21         p1:layout_alignParentBottom="true" />
22     <Button
23         p1:text="出 现"
24         p1:layout_width="wrap_content"
25         p1:layout_height="wrap_content"
26         p1:layout_toRightOf="@id/btnHide"
27         p1:id="@+id/btnShow"
28         p1:layout_alignParentBottom="true" />
29 </RelativeLayout>

对应的代码部分改成如下所示:

我们可以看到动画文件需要利用AnimationUtils这个静态类的LoadAnimation方法读取,然后将返回值传递给控件的StartAnimation方法,其中我们多了一行代码,就是FillAfter = true,如果不存在这个代码,我们会发现动画在结束后控件又回到原来的位置了,有些时候这并不是我们需要的,所以需要将FillAfter设置为True即可。

效果展示:

下面我们利用代码的形式实现跟上面一样的动画效果,我们直接在OnCreate中创建动画:

 1         protected override void OnCreate(Bundle bundle)
 2         {
 3             base.OnCreate(bundle);
 4             SetContentView(Resource.Layout.AnimationActivity);
 5
 6             inAnim = new TranslateAnimation(Dimension.RelativeToParent, 0, Dimension.RelativeToParent, 0,
 7                 Dimension.RelativeToParent, 0, Dimension.RelativeToParent, (float)0.8);
 8             inAnim.FillAfter = true;
 9             inAnim.StartOffset = 500;
10             inAnim.Duration = 1000;
11             inAnim.SetInterpolator(this, Android.Resource.Animation.BounceInterpolator);
12
13             outAnim = new TranslateAnimation(Dimension.RelativeToParent, 0, Dimension.RelativeToParent, 0,
14                 Dimension.RelativeToParent, (float)0.8, Dimension.RelativeToParent, 0);
15             outAnim.FillAfter = true;
16             outAnim.StartOffset = 500;
17             outAnim.Duration = 1000;
18             outAnim.SetInterpolator(this, Android.Resource.Animation.BounceInterpolator);
19
20             TvAnim = FindViewById<TextView>(Resource.Id.tvAnim);
21             FindViewById<Button>(Resource.Id.btnHide).Click += (e, s) =>
22                 {
23                     TvAnim.StartAnimation(inAnim);
24                 };
25
26             FindViewById<Button>(Resource.Id.btnShow).Click += (e, s) =>
27                 {
28                     TvAnim.StartAnimation(outAnim);
29                 };
30         }

我们实例化一个TranslateAnimation对象,后面的属性跟XML中一摸一样的,直接就可以使用,唯一的区别就是Interpolator需要通过SetInterpolator方法来进行设置。有时我们需要利用代码控制移动的距离,比如在FrameLayout布局下要让底层的控件呈现,就需要移动我们预想的值,但是TranslateAnimation只能接收px为单位的距离,我们就需要将DP转换成PX,笔者这里顺便将实现功能的带么也贴出来,方面有需要的人:

1         public static int DpToPx(this Context context, float dp)
2         {
3             return (int)(context.Resources.DisplayMetrics.Density * dp + 0.5f);
4         }

Alpha动画

这个动画比较简单,所以笔者就不单独写了,就跟着上面的例子,直接在XML中增加这个动画,也正好可以证明set下的多个动画是可以同步执行的,通过这样的组合我们就可以作出很多非常炫酷的动画了。下面我们直接看对应的XML的代码:

out_from_bottom:

1 <set xmlns:android="http://schemas.android.com/apk/res/android"
2      android:interpolator="@android:anim/bounce_interpolator">
3   <translate android:startOffset="500" android:fromYDelta="80%p" android:toYDelta="0" android:duration="1000"/>
4   <alpha android:fromAlpha="0" android:startOffset="500" android:duration="1000" android:toAlpha="1" />
5 </set>

In_from_bottom:

1 <set xmlns:android="http://schemas.android.com/apk/res/android"
2      android:interpolator="@android:anim/bounce_interpolator">
3   <translate android:startOffset="500" android:fromYDelta="0" android:toYDelta="80%p" android:duration="1000"/>
4   <alpha android:fromAlpha="1" android:startOffset="500" android:duration="1000" android:toAlpha="0" />
5 </set>

其中我们可以看到alpha实际上只有fromAlphatoAlpha属性,其他的属性都是公用的,是不是非常的简单,然后我们再把活动的代码改回之前的样子,使用XML中定义的动画。

效果展示:

对应的代码形式,笔者这里简单的写下,不进行举例了:

1 AlphaAnimation alpha = new AlphaAnimation(0, 1);
2 alpha.Duration = 1000;
3 alpha.StartOffset = 500;

PS:如果读者急切的想知道如果利用代码制作多个动画的组合,可以使用AnimationSet类,将对应的动画添加进去。

Rotate动画

顾名思义,就是翻转动画。这里为了下面能够看到动画的效果,我们需要将活动视图中的TextView的属性layout_centerInParent设置为true即可,紧接着我们将对应的XML文件进行修改:

In_from_bottom:

1 <set xmlns:android="http://schemas.android.com/apk/res/android"
2      android:interpolator="@android:anim/bounce_interpolator">
3   <rotate android:fromDegrees="180" android:toDegrees="0" android:startOffset="500" android:duration="1000" android:pivotX="50%" android:pivotY="50%" />
4 </set>

out_from_bottom:

1 <set xmlns:android="http://schemas.android.com/apk/res/android"
2      android:interpolator="@android:anim/bounce_interpolator">
3   <rotate android:fromDegrees="0" android:toDegrees="180" android:startOffset="500" android:duration="1000" android:pivotX="50%" android:pivotY="50%" />
4 </set>

其中fromDegresestoDegrees就是从多少度翻转到多少度,pivotXpivotY则需要重点介绍,既然是翻转,自然要有中心。默认情况的中心就是左上角,通过给这两个值赋上float类型的值表示中点是根据左上角进行偏移,比如pivotX=5,pivotY=10,左上角的坐标是101,50。则最终的中点就是106,60了,当然我们也可以用百分比表示,比如都赋50%就表示中点为控件的中心,如果在后面加上p单位就表示中点是父控件的中心,明白了这些这个动画我们就能够很好的掌握了。

效果展示:

对应的代码形式如下所示:

1 RotateAnimation rotate = new RotateAnimation(0, 180, Dimension.RelativeToSelf, 0.5f, Dimension.RelativeToSelf, 0.5f);
2 rotate.Duration = 1000;
3 rotate.StartOffset = 500;

Scale动画

这已经是我们最后一个介绍的动画了,下面我们不多说废话,直接修改XML:

Out_from_bottom:

1 <scale android:fromXScale="0.2" android:toXScale="1" android:fromYScale="0.2" android:toYScale="1" android:pivotX="50%" android:pivotY="50%" android:duration="1000" />

In_from_bottom:

1 <scale android:fromXScale="1" android:toXScale="0.2" android:fromYScale="1" android:toYScale="0.2" android:pivotX="50%" android:pivotY="50%" android:duration="1000" />

这里的pivotYpivotX跟上上节的使用方式是相同的,对应fromXScalefromYScaletoXScaletoYScale的作用就是X轴和Y轴上等比缩放的比例了。

效果展示:

对应的代码形式如下:

1 ScaleAnimation scale = new ScaleAnimation(1f, 0.2f, 1f, 0.2f, Dimension.RelativeToSelf, 0.5f, Dimension.RelativeToSelf, 0.5f);
2 scale.FillAfter = true;
3 scale.Duration = 1000;

Interpolator属性可用参考图:

关于Xamarin下如何强制菜单在ActionBar中显示

1             ViewConfiguration config = ViewConfiguration.Get(this);
2             var f = config.Class.GetDeclaredField("sHasPermanentMenuKey");
3             f.Accessible = true;
4             f.SetBoolean(config, false);

因为Android系统规定存在物理菜单键的情况下菜单是不会显示到ActionBar中的,所以我们需要通过修改ViewConfiguration中的私有字段sHasPermanentMenuKey将其改为false即可,但是在实际测试中发现,部分手机必须强制Menu的ActionFlags为Always。

关于Xamarin下使用Http报InvalidCastException异常

通过查阅官方资料发现这个是Xamarin本身的Bug,但是这个Bug实在是太大。会导致整个App的稳定性下降,重点是这个异常无法通过try…catch捕获,一旦发生就闪退,特别实在短时间内频繁使用Http的情况下,该解决方案只有将Xamarin.Android升级到4.12.5以及以上才可以(对于破解党来说又要开始折腾重新安装了)。

时间: 2024-10-11 20:46:35

Xamarin.Android之动画的相关文章

Xamarin.Android绑定库分享

使用Xamarin.Android时,会用到各种第三方库,而这些库基本上是java编写的,要在Xamarin.Android中使用这些库,就需要通过Android Binding Project绑定对应的java库,然后在C#中使用.绑定时,可能需要编写相关的转换规则或者修改对应的java源代码,遇到问题时,可以到Xamarin的官网查看,也可以Google. Xamarin.Android绑定参考文档地址: http://developer.xamarin.com/guides/android

Xamarin.Android开发实践(十八)

Xamarin.Android之SlidingMenu 一.前言 有位网友在评论中希望能够出个在Xamarin.Android下实现SlidingMenu效果的随笔,刚好昨天在观看官网示例项目的时候也看到这个SlidingMenu,但是最终的效果并不是我们所期待的,至此笔者就在官方的论坛中寻找,最后也成功的寻找到的答案,下面笔者将带领带领大家实现SlidingMenu. 二.准备工作 实现SlidingMenu重点是需要一个第三方的类库,笔者已经把部分重要的方法注释了,下面是下载地址: 从Git

Xamarin.Android活动的生命周期

一.前言 用过Android手机的人一定会发现一种现象,当你把一个应用置于后台后,一段时间之后在打开就会发现应用重新打开了,但是之前的相关的数据却没有丢失.可以看出app的“生命”是掌握在系统手上的,而不像Windows上开发的程序. 二.活动的生命周期 这里我们借助一张图帮助我们理解: 当然很多人现在还看不懂这张图,下面我们会逐一介绍: 1.OnCreate 这个方法是打开活动后第一个执行的事件,当然也是我们必须重写的一个方法,其中它大致负责如下的事情: l  创建视图 l  初始化变量 l 

Xamarin.Android之SlidingMenu

一.前言 有位网友在评论中希望能够出个在Xamarin.Android下实现SlidingMenu效果的随笔,刚好昨天在观看官网示例项目的时候也看到这个SlidingMenu,但是最终的效果并不是我们所期待的,至此笔者就在官方的论坛中寻找,最后也成功的寻找到的答案,下面笔者将带领带领大家实现SlidingMenu. 二.准备工作 实现SlidingMenu重点是需要一个第三方的类库,笔者已经把部分重要的方法注释了,下面是下载地址: 从Github下载 从百度网盘下载 注:我们的项目不仅仅需要引用

Xamarin.Android之Splash的几种简单实现

对现在的APP软件来说,基本上都会有一个Splash页面,类似大家常说的欢迎页面.启动界面之类的. 正常来说这个页面都会有一些相关的信息,比如一些理念,Logo,版本信息等 下面就来看看在Xamarin.Android是如何简单实现的吧. 一.新建一个空白Android项目 二.添加一个layout,splash.axml 1 <?xml version="1.0" encoding="utf-8"?> 2 <LinearLayout xmlns:

跨过几个坑,终于完成了我的第一个Xamarin Android App!

时间过得真快,距离上次发随笔又是一年多.作为上次发的我的第一个WP8.1应用总结的后继,这次同样的主要功能,改为实现安卓版APP.前几个月巨硬收购Xamarin,把Xamarin集成到VS里了,大大方便了我广大.net码农.由于年初脱了WP的坑,换了个安卓低端机,想着什么时候装Xamarin开发个App玩玩. 上个月笔记本100G的C盘莫名其妙快满了,趁着重装系统的机会,安装了VS2015 with sp3,下载开发Android App需要的各种东东.这里要感谢[C#]VS2015开发环境的安

【转】android 属性动画之 ObjectAnimator

原文网址:http://blog.csdn.net/feiduclear_up/article/details/39255083 前面一篇博客讲解了 android 简单动画之 animtion,这里来讲解一下android 3.0之后添加的一些动画   animator 中的 ObjectAnimator . 属性动画概念: 所谓属性动画:改变一切能改变的对象的属性值,不同于补间动画:只能改变 alpha,scale,rotate,translate.听着有点抽象,举例子说明 补间动画能实现的

Xamarin.Android开发实践(十七)

Xamarin.Android之定位 一.前言 打开我们手中的应用,可以发现越来越多的应用使用了定位,从而使我们的生活更加方便,所以本章我们将学习如何在Xamarin中进行定位的开发. 二.准备工作 因为我们的虚拟机是运行在电脑本地的,自然就没法进行定位了,但是我们可以借助DDMS这个工具帮助我们去调试. 首先要确定你的Android SDK所在的目录,读者可以通过以下方式找到: 工具->选项 然后读者打开该文件夹下的tools文件夹,我们就可以看到里面有很多以bat结果的文件,这个时候我们打开

Android属性动画之ObjectAnimator

相信对于Android初学者,对于Android中的动画效果一定很感兴趣,今天为大家总结一下刚刚学到的属性动画案例. 首先和一般的Android应用一样,我们先建一个工程,为了方便,我们的布局文件中就只添加一个ImageView和button按钮,代码如下: <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.andr