旋转动画、平移动画--实现弹出菜单动画

2019-09-28  本文已影响0人  26小瑜儿

Demo--实现弹出菜单动画


image.png
image.png

[图片上传中...(image.png-52c8f1-1569158805919-0)]


image.png
image.png
image.png
image.png
image.png
image.png

运行结果:

image.png
image.png
image.png
image.png
image.png
源代码如下:

public class MainActivity extends AppCompatActivity {
private int [] resld = {R.id.iv_b,R.id.iv_c,R.id.iv_d};
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.iv_a);
    menu.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            //遍历数组 取出每一个按钮
            for (int i = 0; i <resld.length; i++) {

                //判断是打开还是关闭
                if(isOpen == true){
                    //之前是打开现在需要关闭
                    close(i);

                }else{
                    //之前是关闭 现在需要打开
                    open(i);
                }
            }
            isOpen = !isOpen;
        }
    });
}
  public void open (int i){
        animate(i,true);

  }
  public void close (int i){
        animate(i,false);
  }
  public void animate (int i,boolean state){
        //计算评分之后的两个之间的角度
      double angle = (Math.PI/(resld.length+1));

      //获取id对应的控件
      ImageButton ib = findViewById(resld[i]);

      //计算当前控件对应的角度
      double mAngle = (i+1)*angle;

      //计算x距离
      float x = (float)(Math.cos(mAngle)*200);
      //计算y距离
      float y = (float)(Math.sin(mAngle)*200);
      float startx;
      float tox;
      float starty;
      float toy;
      Interpolator interpolator;
if(state == true){
    startx = 0;
    starty = 0;
    tox = x;
    toy = -y;
    interpolator = new BounceInterpolator();
}else{
    startx = x;
    starty = -y;
    tox = 0;
    toy = 0;
    interpolator = new AnticipateInterpolator();
}
//平移动画
      TranslateAnimation tAnim = new TranslateAnimation(
              startx,tox,starty,toy);
tAnim.setDuration(500);
tAnim.setInterpolator(interpolator);

//旋转动画
RotateAnimation rAnim = new RotateAnimation(0,360*3,
        Animation.RELATIVE_TO_SELF,0.5f,
        Animation.RELATIVE_TO_SELF,0.5f
);
rAnim.setDuration(500);

//创建一个AnimationSet集合 包裹多个动画  参数表示他的子动画是否公共一个插值器
      AnimationSet set = new AnimationSet(false);
      set.setFillAfter(true);//为什么会有setFillAfter 和 setFillBefore这两个方法:

     // 是因为有动画链的原因,假定你有一个移动的动画紧跟一个淡出的动画,如果你不把移动的动画的setFillAfter置为true,那么移动动画结束后,View会回到原来的位置淡出,如果setFillAfter置为true, 就会在移动动画结束的位置淡出
     set.addAnimation(rAnim);
     set.addAnimation(tAnim);

     //开始动画
      ib.startAnimation(set);
  }

}
上一篇下一篇

猜你喜欢

热点阅读