欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android开发之图形图像与动画(三)Animation效果的XML实现

程序员文章站 2023-11-30 23:22:10
使用xml来定义tween animation 动画的xml文件在工程中res/anim目录,这个文件必须包含一个根元素,可以使
使用xml来定义tween animation
动画的xml文件在工程中res/anim目录,这个文件必须包含一个根元素,可以使<alpha><scale> <translate> <rotate>插值元素或者是把上面的元素都放入<set>元素组中,默认情况下,所以的动画指令都是同时发生的,为了让他们按序列发生,需要设置一个特殊的属性startoffset。动画的指令定义了你想要发生什么样的转换,当他们发生了,应该执行多长时间,转换可以是连续的也可以使同时的。例如,你让文本内容从左边移动到右边,然后旋转180度,或者在移动的过程中同时旋转,没个转换需要设置一些特殊的参数(开始和结束的大小尺寸的大小变化,开始和结束的旋转角度等等,也可以设置些基本的参数(例如,开始时间与周期),如果让几个转换同时发生,可以给它们设置相同的开始时间,如果按序列的话,计算开始时间加上其周期。
tween animation共同的节点属性

属性[类型] 功能 备注
duration[long] 属性为动画持续时间 时间以毫秒为单位
fillafter [boolean] 当设置为true ,该动画转化在动画结束后被应用
fillbefore[boolean] 当设置为true ,该动画转化在动画开始前被应用

interpolator

指定一个动画的插入器 有一些常见的插入器
accelerate_decelerate_interpolator
加速-减速 动画插入器
accelerate_interpolator
加速-动画插入器
decelerate_interpolator
减速- 动画插入器
其他的属于特定的动画效果
repeatcount[int] 动画的重复次数
repeatmode[int] 定义重复的行为 1:重新开始  2:plays backward
startoffset[long] 动画之间的时间间隔,从上次动画停多少时间开始执行下个动画
zadjustment[int] 定义动画的z order的改变 0:保持z order不变
1:保持在最上层
-1:保持在最下层

表二

xml节点 功能说明
alpha 渐变透明度动画效果
<alpha
android:fromalpha=”0.1″
android:toalpha=”1.0″
android:duration=”3000″ />
fromalpha

属性为动画起始时透明度

0.0表示完全透明
1.0表示完全不透明
以上值取0.0-1.0之间的float数据类型的数字

duration为动画持续时间,ms单位

toalpha

属性为动画结束时透明度

表三

scale 渐变尺寸伸缩动画效果
<scale
android:interpolator= “@android:anim/accelerate_decelerate_interpolator”
android:fromxscale=”0.0″
android:toxscale=”1.4″
android:fromyscale=”0.0″
android:toyscale=”1.4″
android:pivotx=”50%”
android:pivoty=”50%”
android:fillafter=”false”
android:startoffset=“700”
android:duration=”700″
android:repeatcount=”10″ />
fromxscale[float] fromyscale[float] 为动画起始时,x、y坐标上的伸缩尺寸 0.0表示收缩到没有
1.0表示正常无伸缩
值小于1.0表示收缩
值大于1.0表示放大
toxscale [float]
toyscale[float]
为动画结束时,x、y坐标上的伸缩尺寸
pivotx[float]
pivoty[float]
为动画相对于物件的x、y坐标的开始位置 属性值说明:从0%-100%中取值,50%为物件的x或y方向坐标上的中点位置

表四
translate 画面转换位置移动动画效果
<translate
android:fromxdelta=”30″
android:toxdelta=”-80″
android:fromydelta=”30″
android:toydelta=”300″
android:duration=”2000″ />
fromxdelta
toxdelta
为动画、结束起始时 x坐标上的位置
fromydelta
toydelta
为动画、结束起始时 y坐标上的位置

表五
rotate 画面转移旋转动画效果
<rotate
android:interpolator=”@android:anim/accelerate_decelerate_interpolator”
android:fromdegrees=”0″
android:todegrees=”+350″
android:pivotx=”50%”
android:pivoty=”50%”
android:duration=”3000″ />
fromdegrees 为动画起始时物件的角度 说明
当角度为负数——表示逆时针旋转
当角度为正数——表示顺时针旋转
(负数from——to正数:顺时针旋转)
(负数from——to负数:逆时针旋转)
(正数from——to正数:顺时针旋转)
(正数from——to负数:逆时针旋转)
todegrees 属性为动画结束时物件旋转的角度 可以大于360度
pivotx
pivoty
为动画相对于物件的x、y坐标的开始位 说明:以上两个属性值 从0%-100%中取值
50%为物件的x或y方向坐标上的中点位置


下面给出一个完整的xml定义(sdk提供)
复制代码 代码如下:

<span style="font-size: 18px"><set android:shareinterpolator="false" xmlns:android="http://schemas.android.com/apk/res/android">
<scale
android:interpolator="@android:anim/accelerate_decelerate_interpolator"
android:fromxscale="1.0"
android:toxscale="1.4"
android:fromyscale="1.0"
android:toyscale="0.6"
android:pivotx="50%"
android:pivoty="50%"
android:fillafter="false"
android:duration="700" />
<set android:interpolator="@android:anim/decelerate_interpolator">
<scale
android:fromxscale="1.4"
android:toxscale="0.0"
android:fromyscale="0.6"
android:toyscale="0.0"
android:pivotx="50%"
android:pivoty="50%"
android:startoffset="700"
android:duration="400"
android:fillbefore="false" />
<rotate
android:fromdegrees="0"
android:todegrees="-45"
android:toyscale="0.0"
android:pivotx="50%"
android:pivoty="50%"
android:startoffset="700"
android:duration="400" />
</set>
</set></span>

一下是实现的一个实例的截图:
pic
所用到的xml文件如下:
1.alpha
复制代码 代码如下:

<set xmlns:android="http://schemas.android.com/apk/res/android">
<alpha
android:fromalpha="1.0"
android:toalpha="0.0"
android:startoffset="500"
android:duration="2000"
/>
</set>

2.rotate
复制代码 代码如下:

<set xmlns:android="http://schemas.android.com/apk/res/android">
<rotate
android:interpolator="@android:anim/accelerate_decelerate_interpolator"
android:fromdegrees="0"
android:todegrees="360"
android:pivotx="50%"
android:pivoty="50%"
android:duration="2000"
/>
</set>

3.scale
复制代码 代码如下:

<set xmlns:android="http://schemas.android.com/apk/res/android">
<scale
android:interpolator="@android:anim/accelerate_decelerate_interpolator"
android:fromxscale="0.0"
android:toxscale="1.0"
android:fromyscale="0.0"
android:toyscale="1.0"
android:pivotx="50%"
android:pivoty="50%"
android:fillafter="false"
android:duration="2000"
/>
</set>

4.translate
复制代码 代码如下:

<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate
android:fromxdelta="10"
android:toxdelta="100"
android:fromydelta="10"
android:toydelta="100"
android:duration="2000"
/>
</set>

具体的实现源代码如下:
复制代码 代码如下:

public class animation_xml_activity extends activity {
private button button1;
private button button2;
private button button3;
private button button4;
private imageview imageview;
@override
protected void oncreate(bundle savedinstancestate) {
super.oncreate(savedinstancestate);
setcontentview(r.layout.activity_animation__xml_);
button1=(button)findviewbyid(r.id.button_alpha);
button2=(button)findviewbyid(r.id.button_rotate);
button3=(button)findviewbyid(r.id.button_scale);
button4=(button)findviewbyid(r.id.button_translate);
imageview=(imageview)findviewbyid(r.id.imageview);
button1.setonclicklistener(new mybutton());
button2.setonclicklistener(new mybutton());
button3.setonclicklistener(new mybutton());
button4.setonclicklistener(new mybutton());
}
class mybutton implements onclicklistener{
@override
public void onclick(view v) {
// todo auto-generated method stub
switch (v.getid()) {
case r.id.button_alpha:
alpha();
break;
case r.id.button_rotate:
rotate();
break;
case r.id.button_scale:
scale();
break;
case r.id.button_translate:
translate();
break;
default:
break;
}
}

}
public void alpha() {
animation animation=animationutils.loadanimation(animation_xml_activity.this, r.anim.alpha);
imageview.startanimation(animation);
}
public void rotate() {
animation animation=animationutils.loadanimation(animation_xml_activity.this, r.anim.rotate);
imageview.startanimation(animation);
}
public void scale() {
animation animation=animationutils.loadanimation(animation_xml_activity.this, r.anim.scale);
imageview.startanimation(animation);
}
public void translate() {
animation animation=animationutils.loadanimation(animation_xml_activity.this, r.anim.translate);
imageview.startanimation(animation);
}
@override
public boolean oncreateoptionsmenu(menu menu) {
// inflate the menu; this adds items to the action bar if it is present.
getmenuinflater().inflate(r.menu.activity_animation__xml_, menu);
return true;
}
}