美文网首页
旋转动画、平移动画--实现弹出菜单动画

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

作者: 26小瑜儿 | 来源:发表于2019-09-28 08:12 被阅读0次

    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);
      }
    
    }
    

    相关文章

      网友评论

          本文标题:旋转动画、平移动画--实现弹出菜单动画

          本文链接:https://www.haomeiwen.com/subject/klvuuctx.html