代码都在下面
帧:AnimationDrawable 补间:Animation
帧动画
实现原理就是把我们的很多张图片通过快速的播放,让肉眼觉得是一个连贯的动画
1.1创建我们的ImagerView和Button:
1.2把图片放进app.res.mipmap文件下
1.3创建一个资源文件,让我们的ImageView可以引入资源,在app.res.drawable下创建一个donghua,资源文件放在background下面。xml文件用的方法是:
1.4在我们的MainActivity.java文件内AnimationDrawable(动画效果)可以让我们引入的图片动起来:
另外一种 在点击的地方播放帧动画
2.1:创建我们的ImagerView和Button:
2.2:把图片放进app.res.mipmap文件下
2.3:创建一个资源文件,让我们的ImageView可以引入资源,在app.res.drawable下创建一个donghua。xml文件用的方法是
2.4:在我们的java.xxx.xxx包下创建一个类,在类里面我们自定一个Image View这里通过反射获取当前播放的帧,判断是否为最后一帧,是的话隐藏控件
2.5创建我们刚刚写的那个类 添加View添加View,对触摸事件中按下的 事件做处理,显示控件以及开启动画
补间动画
只需要用制定动画的开始和结束帧,中间的帧由系统补齐
过场动画 Activity跳转时的动画 需要放在startActrivity(intent)的后面overridePendingTransition(R.anim.xxx,R.anim.xxx);开始和结束
因为是动画所以创建app.res.anim(anim这个文件夹需要我们new-》AndroidResource Directory里面找到并创建
-
五种动画的简单使用,(这里我把XML的代码放在对应的功能下,把java代码放在他们五个下面)
-
透明度渐变动画
-
fromAlpha :起始透明度
-
toAlpha:结束透明度
-
透明度的范围为:0-1,完全透明-完全不透明
-
<?xml version="1.0" encoding="utf-8"?> <alpha xmlns:android="http://schemas.android.com/apk/res/android" android:interpolator="@android:anim/accelerate_decelerate_interpolator" android:fromAlpha="1.0" android:toAlpha="0.0" android:duration="3000" > </alpha>
缩放渐变动画
-
fromXScale/fromYScale:沿着X轴/Y轴缩放的起始比例
-
toXScale/toYScale:沿着X轴/Y轴缩放的结束比例
-
pivotX/pivotY:缩放的中轴点X/Y坐标,即距离自身左边缘的位置,比如50%就是以图像的 中心为中轴点
-
<?xml version="1.0" encoding="utf-8"?> <scale xmlns:android="http://schemas.android.com/apk/res/android" android:interpolator="@android:anim/accelerate_decelerate_interpolator" android:fromXScale="0.3" android:toXScale="1.5" android:fromYScale="0.2" android:toYScale="1.5" android:pivotY="50%" android:pivotX="50%" android:duration="2000" > </scale>
-
位移渐变动画
-
fromXDelta/fromYDelta:动画起始位置的X/Y坐标
-
toXDelta/toYDelta:动画结束位置的X/Y坐标
-
<?xml version="1.0" encoding="utf-8"?> <translate xmlns:android="http://schemas.android.com/apk/res/android" android:interpolator="@android:anim/accelerate_decelerate_interpolator" android:fromXDelta="0" android:toYDelta="690" android:fromYDelta="0" android:toXDelta="0" android:duration="3000" > </translate>
-
旋转渐变动画
-
fromDegrees/toDegrees:旋转的起始/结束角度
-
repeatCount:旋转的次数,默认值为0,代表一次,假如是其他值,比如3,则旋转4次 另外,值为-1或者infinite时,表示动画永不停止
-
repeatMode:设置重复模式,默认restart,但只有当repeatCount大于0或者infinite或-1时 才有效。还可以设置成reverse,表示偶数次显示动画时会做方向相反的运动!
-
<?xml version="1.0" encoding="utf-8"?> <rotate xmlns:android="http://schemas.android.com/apk/res/android" android:interpolator="@android:anim/accelerate_decelerate_interpolator" android:fromDegrees="0" android:toDegrees="180" android:duration="3000" android:repeatCount="1" android:repeatMode="reverse" > </rotate>
-
组合渐变动画
-
<?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android" android:interpolator="@android:anim/accelerate_decelerate_interpolator" > <scale android:duration="2000" android:fromXScale="0.2" android:fromYScale="0.2" android:pivotX="50%" android:pivotY="50%" android:toXScale="1.5" android:toYScale="1.5" /> <rotate android:duration="1000" android:fromDegrees="0" android:repeatCount="1" android:repeatMode="reverse" android:toDegrees="360" /> <translate android:duration="2000" android:fromXDelta="0" android:fromYDelta="0" android:toXDelta="320" android:toYDelta="0" /> <alpha android:duration="2000" android:fromAlpha="1.0" android:toAlpha="0.1" /> </set>
private Button btn_touMing,btn_xuanZhuan,btn_suoFang,btn_weiYi,btn_zuHe; private ImageView iv_bu; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main3); btn_touMing=findViewById(R.id.btn_touMing); btn_xuanZhuan=findViewById(R.id.btn_xuanZhuan); btn_suoFang=findViewById(R.id.btn_suoFang); btn_weiYi=findViewById(R.id.btn_weiYi); btn_zuHe=findViewById(R.id.btn_zuHe); iv_bu=findViewById(R.id.iv_bu); btn_touMing.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Animation animation= AnimationUtils.loadAnimation(MainActivity3.this,R.anim.alpha_anim); iv_bu.startAnimation(animation); } }); btn_suoFang.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Animation animation=AnimationUtils.loadAnimation(MainActivity3.this,R.anim.anim_scale); iv_bu.startAnimation(animation); } }); btn_weiYi.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Animation animation=AnimationUtils.loadAnimation(MainActivity3.this,R.anim.anim_translate); iv_bu.startAnimation(animation); } }); btn_xuanZhuan.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Animation animation=AnimationUtils.loadAnimation(MainActivity3.this,R.anim.anim_rotate); iv_bu.startAnimation(animation); } }); btn_zuHe.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Animation animation=AnimationUtils.loadAnimation(MainActivity3.this,R.anim.anim_set); iv_bu.startAnimation(animation); } }); }
1.1和 2.1
<Button
android:id="@+id/btn_KaiShi"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="开始"/>
<Button
android:id="@+id/btn_JieShu"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="停止"/>
<ImageView
android:id="@+id/iv_Zhen"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/donghua"
/>
1.2和2.2导入自己的图片
1.3和2.3
drawable我们的图片地址duration图片停留的毫秒数
<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
>
<item
android:drawable="@mipmap/a1"
android:duration="500" />
</animation-list>
1.4
//获取按钮
//获取ImagerView
private ImageView iv_Zhen;
private Button btn_KaiShi;
private Button btn_JieShu;
//可以让动画动起来
private AnimationDrawable anim;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btn_JieShu=findViewById(R.id.btn_JieShu);
btn_KaiShi=findViewById(R.id.btn_KaiShi);
iv_Zhen=findViewById(R.id.iv_Zhen);
//获取Background为了让他动起来给AnimationDrawable
anim=(AnimationDrawable) iv_Zhen.getBackground();
btn_KaiShi.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//因为已经把Background给Animation Drawable所以直接使用.start开启
anim.start();
}
});
btn_JieShu.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//因为已经把Background给Animation Drawable所以直接使用.stop关闭
anim.stop();
}
});
}
2.4
blic class ImageV extends androidx.appcompat.widget.AppCompatImageView {
private AnimationDrawable anim;
public ImageV(@NonNull Context context) {
super(context);
}
public ImageV(@NonNull Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
}
public ImageV(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
public void setAnim(AnimationDrawable anim) {
this.anim = anim;
}
void setLocation(int top, int left){
this.setFrame(left,top,left+200,top+200);
}
@Override
protected void onDraw(Canvas canvas) {
try {
//反射调用AnimationDrawable
Field field=AnimationDrawable.class.getDeclaredField("mCurFrame");
field.setAccessible(true);
//获取anim动画的当前帧
int curFrame=field.getInt(anim);
//如果已经到了最后一帧
if (curFrame == anim.getNumberOfFrames()-1) {
//该让View隐藏
setVisibility(View.INVISIBLE);
}
} catch (NoSuchFieldException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
super.onDraw(canvas);
}
2.5
private ImageV IV;
private AnimationDrawable anim=null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//自定义一个帧布局
FrameLayout flt=new FrameLayout(MainActivity2.this);
setContentView(flt);
//向布局当中添加控件
//创建自定义控件
IV=new ImageV(MainActivity2.this);
//给空间设置背景
IV.setBackgroundResource(R.drawable.donghua);
//图片不可见
IV.setVisibility(View.INVISIBLE);
//将背景转化为动画
anim=(AnimationDrawable) IV.getBackground();
//将动画转递给iv,就是为了动画执行完毕之后,将图片隐藏起来
IV.setAnim(anim);
//向布局添加控件
flt.addView(IV);
//触摸事件
flt.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
//设置按下时才产生动画效果
if (event.getAction() ==MotionEvent.ACTION_DOWN) {
anim.stop();
float x=event.getX();
float y=event.getY();
IV.setLocation((int)y-40,(int)x-20);
//View显示的位置,点击哪里哪里可见
IV.setVisibility(View.VISIBLE);
anim.start();//开启动画
}
return false;
}
});
}