Android的学习与实践7(旋转和移动动画的实现)
1.收获
今天我们写了两个demo,这两个demo虽然不难,但是也是需要我们理解的,并不是简单我们就能够写的来,也许并不是这样的,当我下来自己背着写的时候才知道有的地方没有理解,是写不下去的。尽管自己在学的时候思路清晰,但是这并不代表你自己单独写的时候也是思路清晰的。所以自己还要多理解,多去写几遍,也许只有这样才能在碰到相同的东西的时候,才有自己的思路和想法。
2.技术
(1)xml文件通用部分代码的优化
(2)平移和旋转动画和属性动画
(3)AnimationSet集合
(4)延长在容器中的控件执行时间
3.技术的实践和应用
(1)xml文件通用部分代码的优化
当我们在xml中配置一些图片的时候,有时候会出现在配置的许多图片的代码中很多的属性是一样的,那么我们为了优化代码,就可以将这些相同部分用一个xml文件装起来。
例如:
在此段代码中明显有7个控件,在这7个空键的代码中,有一部分代码是相通的
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@null"
android:layout_centerInParent="true"
于是我们就要优化一下代码
首先我们新建一个文件来装这相同的属性的代码,当遇到是我们直接调用这个文件就可以了
文章图片
image.png
然后在这个文件中进行添加形同属性的代码
文章图片
image.png 优化后的代码量:
(2)平移和旋转动画和属性动画
//移动的动画
TranslateAnimation tAnim=new TranslateAnimation(0,x,0,y);
tAnim.setDuration(500);
tAnim.setFillAfter(true);
tAnim.setInterpolator(new BounceInterpolator());
//旋转动画
RotateAnimation rotateAnimation=new RotateAnimation(0,3*360,ib.getPivotX(),ib.getPivotY());
rotateAnimation.setDuration(500);
rotateAnimation.setFillAfter(true);
上面的旋转和移动动画是补间动画,他的性质并没有改变,只是在我们的视觉上发生了改变。
//移动
public void test4(){
ObjectAnimator transAni=ObjectAnimator.ofFloat(v,"translationX",v.getTranslationX()+100);
transAni.setDuration(1000);
transAni.start();
}
//旋转
public void test2(){
ObjectAnimator rotatetion=ObjectAnimator.ofFloat(v,"rotation",0,360);
rotatetion.setDuration(2000);
rotatetion.start();
}
上面的旋转和移动动画是补间动画,他的性质并没有改变,只是在我们的视觉上发生了改变。
补间动画(Animation):只是视觉上的效果,并没改变他的属性,意思就是在表面上是改变了,但是他还是在原来的位置上,只是在我们的视觉上发生了改变。
属性动画(Animator):刚好与补间动画不同,发生改变后,就是改变后属性,真正从属性上发生了改变。
在我们的应用中很少用补间动画。
文章图片
image.png
属性动画的使用
文章图片
image.png (3)AnimationSet集合
有时候想要两个动画一起执行,那麽我们就可以用一个东西将这两个动画装起来,而这个东西就像是一个容器。
文章图片
image.png
文章图片
image.png
(4)延长在容器中的控件执行时间
在动画中,我想要有的动画有时间差的动画,我们我们需要将动画延时执行。那麽我们利用者个控件在某个容器中的性质来进行延时
文章图片
image.png
4.今日demo 1.菜单动画
效果:
文章图片
录制_2019_09_23_23_21_37_506.gif
1.添加图片控件
2.将图片添加到一个数组中,以便于进行动画的添加
private int[] resID={R.id.ib_b,R.id.ib_c,R.id.ib_d,R.id.ib_e,R.id.ib_f,R.id.ib_g};
3.判断当前是打开还是关闭,进行相应动画的添加
private boolean isopen=false;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
}private void initView() {
ImageButton menu=findViewById(R.id.ib_a);
menu.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
for(int i=0;
i
2.半旋转动画
效果:
文章图片
录制_2019_09_24_00_11_51_635.gif
1.添加图片控件
2.在此动画中有两种动画,一个是旋转入,一个是旋转出,那么我们用两个xml文件配置
旋转入
旋转出
3.加载荣容器,因为我们再旋转的是后是旋转的是容器,而不是单个的控件,找到需要被点击的控件
//加载容器
level3=findViewById(R.id.ib_level3);
level2=findViewById(R.id.ib_level2);
//menu按钮
ImageButton menu=findViewById(R.id.ib_menu);
ImageButton home=findViewById(R.id.ib_home);
//添加点击事件
menu.setOnClickListener(this);
home.setOnClickListener(this);
【Android的学习与实践7(旋转和移动动画的实现)】4.判断当前控件的状态,是需要转出还是转入
@Override
public void onClick(View view){
switch (view.getId()){
case R.id.ib_menu:
if(islevel3open){
//关闭
closelevel(level3,0);
}else{
//打开
openlevel(level3);
}
//改变状态
islevel3open=!islevel3open;
break;
case R.id.ib_home:
if(islevel3open){
//关闭第三层
closelevel(level3,0);
islevel3open=!islevel3open;
}
if(islevel2open){
//关闭第二层
closelevel(level2,200);
}else{
openlevel(level2);
}
islevel2open=!islevel2open;
break;
default:
break;
}
}public void openlevel(RelativeLayout rl){
Animation in=AnimationUtils.loadAnimation(this,R.anim.rotate_in);
rl.startAnimation(in);
//子控件可点击
changeState(rl,true);
}
public void closelevel(RelativeLayout rl,long delay){
Animation out=AnimationUtils.loadAnimation(this,R.anim.rotate_out);
out.setStartOffset(delay);
rl.startAnimation(out);
//子控件不可点击
changeState(rl,false);
}
public void changeState(RelativeLayout rl,boolean enable){
//遍历容器的子控件//1.获取子控件的个数
int count=rl.getChildCount();
//2.遍历子控件
for(int i=0;
i
推荐阅读
- 热闹中的孤独
- JAVA(抽象类与接口的区别&重载与重写&内存泄漏)
- 放屁有这三个特征的,请注意啦!这说明你的身体毒素太多
- 一个人的旅行,三亚
- 布丽吉特,人生绝对的赢家
- 慢慢的美丽
- 尽力
- 一个小故事,我的思考。
- 家乡的那条小河
- 《真与假的困惑》???|《真与假的困惑》??? ——致良知是一种伟大的力量