> 动画效果(Frame, View, Property)的区别:
动画通过不断的调用OnDraw方法来进行UI的绘制,而属性动画一般只调用ViewGroup进行绘制。
ViewGroup的绘制:
ViewGroup通常是不需要绘制的,因为本身就没有需要绘制的东西。
如果不是指定ViewGroup的背景色,那么ViewGroup的o'nDraw方法都不会被调用。
ViewGroup会使用dispatchDraw()方法绘制子View,其过程是遍历子View,调用子View的绘制方法进行绘制。
-- Frame/View/Property,是哪些版本加入的,并向前兼容??组合动画?纯Java代码或XML与Java实现??
Android动画- http://blog.csdn.net/q4878802/article/category/5671159
Android 用Animation-list实现逐帧动画:http://blog.csdn.net/aminfo/article/details/7847761
Android开发—View动画、帧动画和属性动画详解-- http://blog.csdn.net/SEU_Calvin/article/details/52724655
Android动画之一,Drawable Animation: http://blog.csdn.net/chziroy/article/details/40424343
Android动画效果translate、scale、alpha、rotate详解- http://blog.csdn.net/sun6255028/article/details/6735025
Android开发--图形图像与动画(二)--Animation实现图像的 渐变、缩放、位移、旋转- http://blog.csdn.net/dlutbrucezhang/article/details/8543708
> 动画示例如下:
package com.desaco.differentanimation.frame_animation;
import com.desaco.differentanimation.R;
import android.app.Activity;
import android.graphics.drawable.AnimationDrawable;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.Window;
import android.widget.Button;
import android.widget.ImageView;
public class FrameAnimationActivity extends Activity {
private ImageView animationIV;
private Button buttonA, buttonB, buttonC;
private AnimationDrawable animationDrawable;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_frame_animation);
animationIV = (ImageView) findViewById(R.id.animationIV);
buttonA = (Button) findViewById(R.id.buttonA);
buttonB = (Button) findViewById(R.id.buttonB);
buttonC = (Button) findViewById(R.id.buttonC);
// 顺序显示
buttonA.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
animationIV.setImageResource(R.drawable.frame_order_animation);
animationDrawable = (AnimationDrawable) animationIV
.getDrawable();
animationDrawable.start();
}
});
// 停止
buttonB.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
animationDrawable = (AnimationDrawable) animationIV
.getDrawable();
animationDrawable.stop();
}
});
// 倒序显示
buttonC.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
animationIV
.setImageResource(R.drawable.frame_reverse_animation);
animationDrawable = (AnimationDrawable) animationIV
.getDrawable();
animationDrawable.start();
}
});
}
}
> frame_order_animation.xml
android:duration="150">
android:duration="150">
android:duration="150">
android:duration="150">
android:duration="150">
android:duration="150">
> frame_reverse_animation.xml
android:duration="150">
android:duration="150">
android:duration="150">
android:duration="150">
android:duration="150">
android:duration="150">
> Android View动画(补间动画):http://blog.csdn.net/sgx425021234/article/details/9195829 http://blog.csdn.net/CHZiroy/article/details/40456399
AlphaAnimation:透明度(alpha)渐变效果,对应
TranslateAnimation:位移渐变,需要指定移动点的开始和结束坐标,对应
ScaleAnimation:缩放渐变,可以指定缩放的参考点,对应
RotateAnimation:旋转渐变,可以指定旋转的参考点,对应
AnimationSet:组合渐变,支持组合多种渐变效果,对应
> Android图文详解属性动画: http://www.mamicode.com/info-detail-1150209.html http://blog.csdn.net/lmj623565791/article/details/38067475
> 动画
import android.view.animation.Animation
Animation ivAnimation = AnimationUtils.loadAnimation(this,
R.anim.dash_scale);
Animation ivAnimation = AnimationUtils.loadAnimation(this,
R.anim.dash_scale);
ImageView imageView = (ImageView) favourView
.findViewById(R.id.iv_favour);
imageView.setImageResource(R.drawable.xf_comment_like_c);
imageView.startAnimation(ivAnimation);
------------------------------------------
/*
* 加载中
*/
protected void MyPostExecuteProgress() {
AlphaAnimation animation = new AlphaAnimation(1.0f, 0.0f);
animation.setDuration(400);
in_xf_huxing_progress.startAnimation(animation);
animation.setAnimationListener(new Animation.AnimationListener() {
@Override
public void onAnimationStart(Animation animation) {
}
@Override
public void onAnimationRepeat(Animation animation) {
}
@Override
public void onAnimationEnd(Animation animation) {
// 动画结束时执行此方法
progress.setVisibility(View.GONE);
}
});
}
----------------------------------------------------------------
> 属性动画,SDK3.0加入的
// 1.属性动画-旋转Rotate
// 动画实际执行
private void startPropertyAnim() {
// 第二个参数"rotation"表明要执行旋转
// 0f -> 360f,从旋转360度,也可以是负值,负值即为逆时针旋转,正值是顺时针旋转。
ObjectAnimator anim = ObjectAnimator.ofFloat(text, "rotation", 0f, 360f);
// 动画的持续时间,执行多久?
anim.setDuration(5000);
// 回调监听
anim.addUpdateListener(new AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
float value = (Float) animation.getAnimatedValue();
Log.d("zhangphil", value + "");
}
});
// 正式开始启动执行动画
anim.start();
}
// 2.透明度渐变属性动画,此处将实现属性动画的动画实际执行
private void startPropertyAnim() {
// 将直接把TextView这个view对象的透明度渐变。
// 注意第二个参数:"alpha",指明了是透明度渐变属性动画
// 透明度变化从1—>0.1—>1—>0.5—>1,TextView对象经历4次透明度渐变
ObjectAnimator anim = ObjectAnimator.ofFloat(text, "alpha", 1f, 0.1f, 1f, 0.5f, 1f);
anim.setDuration(5000);// 动画持续时间
// 这里是一个回调监听,获取属性动画在执行期间的具体值
anim.addUpdateListener(new AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
float value = (Float) animation.getAnimatedValue();
Log.d("zhangphil", value + "");
}
});
anim.start();
}
// 3.位移动画,translationX,translationY
private void startPropertyAnim() {
// X轴方向上的坐标
float translationX = text.getTranslationX();
// 向右移动500pix,然后再移动到原来的位置复原。
// 参数“translationX”指明在x坐标轴位移,即水平位移。
ObjectAnimator anim = ObjectAnimator.ofFloat(text, "translationX", translationX, -500f, translationX);
anim.setDuration(5000);
// 回调监听,可以有也可以无。
// 根据情况,如果需要监听动画执行到何种“进度”,那么就监听之。
anim.addUpdateListener(new AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
float value = (Float) animation.getAnimatedValue();
Log.d("zhangphil", value + "");
}
});
// 正式开始启动执行动画
anim.start();
}
// 4.scale缩放动画 ,scaleX,scaleY,
public void propertyValuesHolder(View view) {
PropertyValuesHolder pvhX = PropertyValuesHolder.ofFloat("alpha", 1f, 0f, 1f);
PropertyValuesHolder pvhY = PropertyValuesHolder.ofFloat("scaleX", 1f, 0, 1f);
PropertyValuesHolder pvhZ = PropertyValuesHolder.ofFloat("scaleY", 1f, 0, 1f);
ObjectAnimator.ofPropertyValuesHolder(view, pvhX, pvhY, pvhZ).setDuration(1000).start();
}
// 动画实际执行
private void startPropertyAnim() {
// 将一个TextView沿垂直方向先从原大小(1f)放大到5倍大小(5f),然后再变回原大小。
ObjectAnimator anim = ObjectAnimator.ofFloat(text, "scaleY", 1f, 5f, 1f);
anim.setDuration(5000);
// 回调监听,可以有也可以无。
// 根据情况,如果需要监听动画执行到何种“进度”,那么就监听之。
anim.addUpdateListener(new AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
float value = (Float) animation.getAnimatedValue();
Log.d("zhangphil", value + "");
}
});
// 正式开始启动执行动画
anim.start();
}
mRotateAnimat.setAnimationListener(new Animation.AnimationListener() {
@Override
public void onAnimationStart(Animation animation) {
}
@Override
public void onAnimationEnd(Animation animation) {
// view.setVisibility(View.GONE);
view.clearAnimation();
}
@Override
public void onAnimationRepeat(Animation animation) {
}
});