Android在运行时移动按钮和背景

Android在运行时移动按钮和背景,android,android-imageview,android-animation,Android,Android Imageview,Android Animation,我试图使选项卡看起来像按钮行,背景是ImageView 以下是ImageView: 现在,当片段加载时,在这张图片上有三个按钮 单击按钮一时: 有两种情况: 1) 当屏幕如上图所示时,我想将按钮向右移动,使屏幕如下图所示: 当它看起来像上面的图像时,我希望它返回到第一个图像状态 最后一种情况是,当用户按下B3时,我希望它的反应与B1相同,但与B1的反应相反,如下所示: 到目前为止,我尝试了很多方法来尝试这一点,但都没有成功,似乎当我设置移动动画时,按钮保持在相同的位置: 以下是我目前的代

我试图使选项卡看起来像按钮行,背景是ImageView

以下是ImageView:

现在,当片段加载时,在这张图片上有三个按钮

单击按钮一时: 有两种情况: 1) 当屏幕如上图所示时,我想将按钮向右移动,使屏幕如下图所示:

当它看起来像上面的图像时,我希望它返回到第一个图像状态

最后一种情况是,当用户按下B3时,我希望它的反应与B1相同,但与B1的反应相反,如下所示:

到目前为止,我尝试了很多方法来尝试这一点,但都没有成功,似乎当我设置移动动画时,按钮保持在相同的位置:

以下是我目前的代码:

btn_spa.setOnClickListener(new OnClickListener() 
        {

            @Override
            public void onClick(View v) 
            {
                isMapPressed=false;
                isInfoPressed=false;
                int toMoveNow=0;
                if(!isSpaPressed)
                {

                    if(isMapPressed)
                        toMoveNow=(toMove/2)+40;
                    else
                        toMoveNow=-(toMove/2+40);
                    int[] arr = new int[]{0,0};

                    btn_spa.getLocationOnScreen(arr);

                    Animation animation  = new TranslateAnimation(arr[0], toMoveNow, 0, 0);
                    animation.setDuration(1000);
                    animation.setFillAfter(true);
                    //rel_buttons_wrapper.startAnimation(animation);
                    btn_info.startAnimation(animation);
                    btn_map.startAnimation(animation);
                    btn_spa.startAnimation(animation);
                    Toast.makeText(getActivity(), "Button spa clicked", Toast.LENGTH_SHORT).show();
                }
            }
        });

        btn_map.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View arg0) 
            {
                isSpaPressed=false;
                isInfoPressed=false;
                int toMoveNow=0;
                if(!isMapPressed && isSpaPressed)
                {
                    toMoveNow=-(toMove/2+40);
                    int[] arr = new int[]{0,0};
                    btn_map.getLocationOnScreen(arr);
                    Animation animation  = new TranslateAnimation(arr[0], toMoveNow, 0, 0);
                    animation.setDuration(1000);
                    animation.setFillAfter(true);
                //  rel_buttons_wrapper.startAnimation(animation);
                    btn_info.startAnimation(animation);
                    btn_map.startAnimation(animation);
                    btn_spa.startAnimation(animation);
                    Toast.makeText(getActivity(), "Button map clicked", Toast.LENGTH_SHORT).show();

                }
                else
                {
                    toMoveNow=(toMove/2+40);
                    int[] arr = new int[]{0,0};
                    btn_map.getLocationOnScreen(arr);
                    Animation animation  = new TranslateAnimation(arr[0], toMoveNow, 0, 0);
                    animation.setDuration(1000);
                    animation.setFillAfter(true);
                //  rel_buttons_wrapper.startAnimation(animation);
                    btn_info.startAnimation(animation);
                    btn_map.startAnimation(animation);
                    btn_spa.startAnimation(animation);
                    Toast.makeText(getActivity(), "Button map clicked", Toast.LENGTH_SHORT).show();
                }
            }
        });

        btn_info.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) 
            {

                int toMoveNow=0;
                if(!isInfoPressed && isSpaPressed)
                {
                    toMoveNow=(toMove/2)+40;
                    int[] arr = new int[]{0,0};
                    btn_info.getLocationOnScreen(arr);
                    Animation animation  = new TranslateAnimation(arr[0], toMoveNow, 0, 0);
                    animation.setDuration(1000);
                    animation.setFillAfter(true);
                    rel_buttons_wrapper.startAnimation(animation);
                    btn_info.startAnimation(animation);
                    btn_map.startAnimation(animation);
                    btn_spa.startAnimation(animation);
                    Toast.makeText(getActivity(), "Button info clicked", Toast.LENGTH_SHORT).show();

                }
                else
                {
                    toMoveNow=-(toMove/2);
                    int[] arr = new int[]{0,0};
                    btn_info.getLocationOnScreen(arr);
                    Animation animation  = new TranslateAnimation(arr[0], toMoveNow, 0, 0);
                    animation.setDuration(1000);
                    animation.setFillAfter(true);
                    rel_buttons_wrapper.startAnimation(animation);
                    btn_info.startAnimation(animation);
                    btn_map.startAnimation(animation);
                    btn_spa.startAnimation(animation);
                    Toast.makeText(getActivity(), "Button info clicked", Toast.LENGTH_SHORT).show();
                }
                isSpaPressed=false;
                isMapPressed=false;

            }
        });
很抱歉问了这么长的问题,我想尽量提供信息

任何帮助都是好人


亲切问候。

您可以使用ObjectAnimator类,它移动视图及其边界,以便在您移动视图时它们实际移动,以下是一个教程:

如果我说的没错,你希望底部是一个类似于滑动罗盘的运动,指向当前选择的碎片?