android动画入门,Android Dev——Android动画从入门到放弃

Android 动画

变换动画 (Tween Animation)

变换动画分类

AlphaAnimation 渐变透明度动画

RotateAnimation 旋转动画

ScaleAnimation 渐变尺寸缩放动画

TranslateAnimation 位移动画

AnimationSet 组合动画

实现动画的两种方式

通过xml配置实现

纯Java代码

1e5d2ce43454

对应的标签和类

AlphaAnimation

参数

fromAlpha 开始时透明度

toAlpha 结束时透明度

取值范围:0.0-1.0

其中 0.0表示完全透明 1.0表示完全不透明

配置文件实现

android:duration="2000"

android:fromAlpha="0.1"

android:toAlpha="1.0" />

/**

* 通过配置文件加载动画

*

* @param view

*/

void onAlphaAnimationByFile(View view) {

//通过AnimationUtils加载布局文件中的动画

Animation alphaAnimation = AnimationUtils.loadAnimation(this, R.anim.alphaanima);

//为组件设置动画

_imageView.startAnimation(alphaAnimation);

}

代码实现

/**

* 通过代码实现加载动画

*

* @param view

*/

void onAlphaAnimationByCode(View view) {

AlphaAnimation alphaAnimation = new AlphaAnimation(1.0f, 0.1f);

alphaAnimation.setDuration(2000);

_imageView.startAnimation(alphaAnimation);

}

RotateAnimation

fromDegrees 动画开始时的角度

toDegrees 动画结束时的角度,正值代表顺时针 负值代表逆时针

pivoX 旋转中心点X轴坐标

pivoY 旋转中心点Y轴坐标

配置文件实现

android:duration="3000"

android:fromDegrees="0"

android:pivotX="50%"

android:pivotY="50%"

android:toDegrees="360" />

//---------------------旋转动画

void onRotateAnimationByFile(View view) {

Animation rotateAnimation = AnimationUtils.loadAnimation(this, R.anim.rotateanima);

_imageView.startAnimation(rotateAnimation);

}

代码实现

void onRotateAnimationByCode(View view) {

RotateAnimation rotateAnimation = new RotateAnimation(0f, -360f, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);

rotateAnimation.setDuration(3000);

_imageView.startAnimation(rotateAnimation);

}

ScaleAnimation 放缩动画

fromXScale 动画起始时X坐标

fromYScale 动画起始时Y坐标

toXScale 动画结束时X坐标

toYScale 动画结束时Y坐标

pivotX: 动画缩放中心点的X坐标

pivotY:动画缩放中心点的Y坐标

配置文件实现

android:duration="3000"

android:fromXScale="0.0"

android:fromYScale="0.0"

android:pivotX="50%p"

android:pivotY="50%p"

android:toXScale="1.0"

android:toYScale="1.0" />

//-------------------缩放动画

void onScaleAnimationByFile(View view) {

Animation scaleAnima = AnimationUtils.loadAnimation(this, R.anim.scaleanima);

_imageView.startAnimation(scaleAnima);

}

代码实现

void onScaleAnimationByCode(View view) {

ScaleAnimation scaleAnimation = new ScaleAnimation(0, 1.0f, 0f, 1.0f, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);

scaleAnimation.setDuration(3000);

_imageView.startAnimation(scaleAnimation);

}

TranslateAnimation 位移动画

fromXDelta:动画开始点的X轴坐标

fromYDelta:动画开始点的Y轴坐标

toXDelta:动画结束点的X轴坐标

toYDelta:动画结束点的Y轴坐标

配置文件实现

android:duration="2000"

android:fromXDelta="0"

android:fromYDelta="0"

android:toXDelta="300"

android:toYDelta="500" />

//----------位移动画

void onTransAnimationByFile(View view) {

Animation animation = AnimationUtils.loadAnimation(this, R.anim.transanima);

_imageView.startAnimation(animation);

}

代码实现

void onTransAnimationByCode(View view) {

TranslateAnimation translateAnimation = new TranslateAnimation(Animation.RELATIVE_TO_PARENT, 0f, Animation.RELATIVE_TO_PARENT, 300f,

Animation.RELATIVE_TO_PARENT, 0f, Animation.RELATIVE_TO_PARENT, 500f);

translateAnimation.setDuration(3000);

_imageView.startAnimation(translateAnimation);

}

AnimationSet组合动画

AnimationSet可以理解为一个动画的容器,可以组合各种动画

//-----------组合动画

void onComboAnimation(View view) {

AnimationSet animationSet = new AnimationSet(true);

Animation animation = AnimationUtils.loadAnimation(this, R.anim.transanima);

Animation scaleAnima = AnimationUtils.loadAnimation(this, R.anim.scaleanima);

Animation rotateAnimation = AnimationUtils.loadAnimation(this, R.anim.rotateanima);

//设置动画

animationSet.addAnimation(animation);

animationSet.addAnimation(scaleAnima);

animationSet.addAnimation(rotateAnimation);

_imageView.startAnimation(animationSet);

}

帧动画 FrameAnimation

xml文件解释

帧动画的xml文件需要定义在drawable中

节点

必须作为根元素,可以包含一个或多个元素

代表一帧动画

属性

oneshot:若等于true 动画只执行一次,否则一直循环

drawable:当前帧所对应的图片资源

duration:当前帧持续的时长,单位毫秒

1e5d2ce43454

帧图片

void onFrameAnimationByFile(View view) {

_imageView.setImageResource(R.drawable.frame_list);

AnimationDrawable animationDrawable = (AnimationDrawable) _imageView.getDrawable();

animationDrawable.start();

}

java代码实现

void onFrameAnimationByCode(View view) {

AnimationDrawable animation = new AnimationDrawable();

for (int i = 0; i < 70; i++) {

int id = getResources().getIdentifier("flash1675_" + i, "drawable", getPackageName());

Drawable drawable = getResources().getDrawable(id);

animation.addFrame(drawable, 100);

}

animation.setOneShot(false);

_imageView.setImageDrawable(animation);

animation.start();

}

LayoutAnimation 布局动画

animation xml布局文件

android:fromDegrees="0"

android:pivotX="50%"

android:pivotY="50%"

android:toDegrees="360" />

android:duration="500"

android:fromXScale="0.1"

android:fromYScale="0.1"

android:pivotX="50%"

android:pivotY="50%"

android:toXScale="1.0"

android:toYScale="1.0" />

android:duration="1000"

android:fromAlpha="0"

android:toAlpha="1.0" />

Activity

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_layout_anim);

listView = ((ListView) findViewById(R.id.listView));

ArrayList list = new ArrayList<>();

for (int i = 0; i <= 20; i++) {

list.add("test" + i);

}

ArrayAdapter adapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, list);

listView.setAdapter(adapter);

LayoutAnimationController controller = new LayoutAnimationController(AnimationUtils.loadAnimation(this, R.anim.item));

listView.setLayoutAnimation(controller);

listView.startLayoutAnimation();

}

属性动画

ValueAnimator 计算动画

ObjectAnimator 对象动画

// 第一个按钮(渐变)

void onAlphaAnimation(View view) {

ObjectAnimator oa = ObjectAnimator.ofFloat(_imageView, "alpha", 0.1f, 1.0f);

oa.setDuration(2000);

oa.start();

}

// 第二个按钮(旋转)

void onRotateAnimation(View view) {

ObjectAnimator oa = ObjectAnimator.ofFloat(_imageView, "rotation", 0f, 360f);

oa.setDuration(1000);

oa.start();

}

// 第三个按钮(放缩)

void onScaleAnimation(View view) {

//放缩倍数 从1倍放大到3倍 再从3倍缩小到1倍

ObjectAnimator.ofFloat(_imageView, "scaleX", 1f, 3f, 1f).setDuration(2000).start();

ObjectAnimator.ofFloat(_imageView, "scaleY", 1f, 3f, 1f).setDuration(2000).start();

}

// 第四个按钮(位移)

void onTransAnimation(View view) {

ObjectAnimator.ofFloat(_imageView, "translationX", 0f, 300f, 0f).setDuration(1000).start();

ObjectAnimator.ofFloat(_imageView, "translationY", 0f, 300f, 0f).setDuration(1000).start();

}

AnimatorSet 组合动画

1e5d2ce43454

图片.png

// 组合动画

void onComboAnimation(View view) {

ObjectAnimator alpha = ObjectAnimator.ofFloat(_imageView, "alpha", 0.1f, 1.0f);

ObjectAnimator rotate = ObjectAnimator.ofFloat(_imageView, "rotation", 0f, 360f);

ObjectAnimator scaleX = ObjectAnimator.ofFloat(_imageView, "scaleX", 1f, 3f, 1f);

ObjectAnimator scaleY = ObjectAnimator.ofFloat(_imageView, "scaleY", 1f, 3f, 1f);

AnimatorSet animationSet = new AnimatorSet();

animationSet.play(alpha).with(scaleX).with(scaleY).after(rotate);

animationSet.setDuration(5000);

animationSet.start();

}

Animator监听器

ImageView imageView = (ImageView) this.findViewById(R.id.imageView);

ObjectAnimator oa = ObjectAnimator.ofFloat(imageView, "rotation", 0f, 360f);

oa.addListener(new Animator.AnimatorListener() {

@Override

public void onAnimationStart(Animator animator) {

Log.d(getApplication().toString(),"《龙珠》动画片开始了");

}

@Override

public void onAnimationEnd(Animator animator) {

Log.d(getApplication().toString(),"《龙珠》动画片结束了");

}

@Override

public void onAnimationCancel(Animator animator) {

Log.d(getApplication().toString(),"《龙珠》动画片被取消了");

}

@Override

public void onAnimationRepeat(Animator animator) {

Log.d(getApplication().toString(),"OMG,电视台疯了,《龙珠》动画片被重复播放了");

}

});

oa.addListener(new AnimatorListenerAdapter() {

@Override

public void onAnimationEnd(Animator animation) {

super.onAnimationEnd(animation);

Log.d(getApplication().toString(),"《龙珠》动画片结束了!!!!!!!!!!");

}

});

oa.setDuration(1000);

oa.setRepeatCount(3);

oa.start();

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值