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