android项目中为了界面的展示和效果,不可避免的用到图片和动画,所以我会分三个模块来讲解自己所知道的图像处理和各种的动画视觉显示,学习中,虚心接受大神们的建议。
动画
APP项目中使用动画的目的就是在完成客户的需求之后提升app的“气质”,炫酷的动画效果总给人留下深刻的印象,也让我们程序员很自豪,哈哈,我是这样认为的,今天写动画的那几种简单的用法,适合初学者学习,全是干货,复杂的实现效果可以网上百度。
在Android 3.0之前有两种实现动画的方法,一种:帧动画(Frame Animation)。一种:视图动画(View Animation)。
在Android3.0之后系统推出了属性动画(property animation)弥补了视图动画的缺陷,几乎可以取代视图动画。
1.视图动画
视图动画:Android中提供四种视图动画:透明,平移,旋转,缩放。
1.1 透明动画
透明(alpha)动画 ,可以将一个View从某个透明度转变为另一个透明度。通过XML文件来定义一个透明动画,必须要将动画文件放到res/anim文件夹下。
alpha.xml
<set xmlns:android="http://schemas.android.com/apk/res/android">
<alpha
android:fromAlpha="1.0"
android:toAlpha="0"
android:duration="5000" />
</set>
属性解释:
- android:fromAlpha 控件的初始透明度。取值在0.0~1.0之间。1.0为完全不透明。
- android:toAlpha 动画结束时,控件的透明度。
- android:duration 播放动画时持续的时间。
MainActivity中两种添加动画的方法。
public class MainActivity extends AppCompatActivity {
private ImageView mImageView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mImageView= (ImageView) findViewById(R.id.imageView);
//引入res/anim文件夹下的xml文件,然后启动动画
Animation animation= AnimationUtils.loadAnimation(this,R.anim.alpha);
mImageView.startAnimation(animation);
/* //直接实例化animtion
Animation animation=new AlphaAnimation(1.0f,0.1f);
// 设置动画的播放时间,单位(毫秒)。
animation.setDuration(5000);
// 设置控件是否定格在动画播放完成后的状态。
animation.setFillAfter(true);
mImageView.startAnimation(animation);*/
}
}
1.2 平移动画
平移(translate)动画,可以将指定的View从某一个位置移动到另一个位置。某个View的平移动画的播放范围是其父控件所占的空间。
translate.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate
android:fromXDelta="0"
android:fromYDelta="0"
android:toXDelta="150"
android:toYDelta="100"
android:duration="5000"
></translate>
</set>```
属性解释:
- android:fromXDelta 设置动画移动时的起始X坐标。
- android:fromYDelta 设置动画移动时的起始Y坐标。
- android:toXDelta 设置动画移动时的结束X坐标。
- android:toYDelta 设置动画移动时的结束Y坐标。
1.3 **旋转动画**
旋转(rotate)动画,可以将指定的View沿着某一个点从某一个角度旋转到另一个角度。旋转动画的可视范围同样是待播放动画的View的父控件所占据的空间。
rotate.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<rotate
android:fromDegrees="0"
android:toDegrees="-90"
android:pivotX="50%"
android:pivotY="50%"
android:duration="5000"
></rotate>
</set>```
属性解释:
- android:fromDegrees 设置控件(相对于0度)最初旋转角度。若值为0则控件不旋转。
- android:toDegrees 设置控件(相对于0度)最终旋转角度,若值与fromDegrees相等则控件不旋转。
- android:pivotX和pivotY 设置控件旋转时所用的参照点的X和Y轴坐标。
若将fromDegrees或toDegrees属性的值设置为负数,则动画会按照逆时针旋转。
1.4 缩放动画
缩放(scale)动画,可以将指定的View沿着某一个点从某一个尺寸缩放到另一个尺寸。缩放动画的可视范围同样是待播放动画的View的父控件所占据的空间。
scale.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<scale
android:fromXScale="1.0"
android:fromYScale="2.0"
android:toXScale="3.0"
android:toYScale="1.0"
android:pivotY="50%"
android:pivotX="50%"
android:duration="5000"
></scale>
</set>```
属性解释:
- android:fromXScale 设置控件最初在水平方向上被缩放的倍数。若为1.0则不缩放。
- android:fromYScale 设置控件最初在垂直方向上被缩放的倍数。若为1.0则不缩放。
- android:toXScale 设置控件最终在水平方向上被缩放的倍数。
- android:toYScale 设置控件最终在垂直方向上被缩放的倍数。
- android:pivotX 设置控件以某个中心点进行缩放时,中心点的X坐标。
- android:pivotY 设置控件以某个中心点进行缩放时,中心点的Y坐标。
**AnimationSet**
使用<set>标签来定义一个动画集合,其内部可以嵌套其他动画,甚至是另一个<set>,<set>使用AnimationSet类来表示。
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" >
<alpha
android:duration="1000"
android:fromAlpha="0.5"
android:toAlpha="1.0" />
<scale
android:duration="1000"
android:fromXScale="1"
android:fromYScale="1"
android:toXScale="0.5"
android:toYScale="0.5" />
<rotate
android:fromDegrees="0"
android:toDegrees="-90"
android:pivotX="50%"
android:pivotY="50%"
android:duration="5000"
android:startOffset="3000"
android:interpolator="@android:anim/accelerate_interpolator"
>
</rotate>
</set>
属性解释:
- startOffset 表示播放开始的时间 单位是毫秒。
- interpolator 表示AnimationSet设置的插值器,定义动画的速度。播放旋转动画时,如果不为其指定插值器,则系统会默认使用AccelerateDecelerateInterpolator,此插值器的特点是,在动画开始时候加速,在动画结束的时候减速。
**帧动画**
> 帧动画(Frame Animation)通过短时间内连续播放多张图片来实现动画效果,和电影类似。
帧动画的根标签为<animation-list>,帧动画的xml文件必须要放在res/drawable文件夹中。如下xml:
<animation-list xmlns:android="http://schemas.android.com/apk/res/android" android:oneshot="false">
<item android:drawable="@drawable/liangguliang_1" android:duration="120" />
<item android:drawable="@drawable/liangguliang_2" android:duration="120" />
<item android:drawable="@drawable/liangguliang_3" android:duration="120" />
<item android:drawable="@drawable/liangguliang_4" android:duration="120" />
</animation-list>
属性解释:
- android:oneshot 设置动画是否只播放一次。若值为false,则动画会循环播放。
- <item>标签的 android:drawable 当前帧所显示的图片。
- <item>标签的 android:duration 当前帧的持续时间(毫秒)。
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/look"
android:onClick="onClick"
android:id="@+id/img" />
播放动画:
public void onWindowFocusChanged(boolean hasFocus) {
super.onWindowFocusChanged(hasFocus);
if(hasFocus){ // 若当前Activity获得焦点。
TextView text = (TextView) findViewById(R.id.text);
AnimationDrawable drawable =(AnimationDrawable) text.getBackground();
drawable.start();
}
}
注意:AnimationDrawable.start不能在窗口不完全的状态下执行,所以在onWindewFocusChanged中执行(onWindewFocusChanged方法是在resume()之后且用户可操作之前调用)
下章讲解属性动画,大家可以交流~~~