Android 如何在使用ObjectAnimator时沿x轴移动按钮

Android 如何在使用ObjectAnimator时沿x轴移动按钮,android,android-studio,Android,Android Studio,当我点击一个按钮(button1)时,我想将其移动到x轴上 这是我的密码: btn=(Button)findViewById(R.id.button1); currentX=btn.getX(); currentY=btn.getY(); moveX=ObjectAnimator.ofFloat(btn,"translationX",currentX,currentX+10); moveY=ObjectAnimator.ofFloat(btn,"trans

当我点击一个按钮(button1)时,我想将其移动到x轴上

这是我的密码:

    btn=(Button)findViewById(R.id.button1);
    currentX=btn.getX();
    currentY=btn.getY();
    moveX=ObjectAnimator.ofFloat(btn,"translationX",currentX,currentX+10);
    moveY=ObjectAnimator.ofFloat(btn,"translationY",currentY,currentY);
    set=new AnimatorSet();
    set.playTogether(moveX,moveY);

    btn.setOnClickListener(new View.OnClickListener()
    {
        public void onClick(View v){
            set.start();
            currentX=v.getX();
            currentY=v.getY();
        }
    });

它会在第一次单击时移动,但在那之后,它只会从开始开始,而不是在x轴上进一步移动10dp。我错过了什么?

我不认为在动画之后v.getx会改变

试试这个:

int multi =1;
btn=(Button)findViewById(R.id.button1);
currentX=btn.getX();
currentY=btn.getY();
moveX=ObjectAnimator.ofFloat(btn,"translationX",currentX+10*(multi-1),currentX+10*multi);
moveY=ObjectAnimator.ofFloat(btn,"translationY",currentY,currentY);
set=new AnimatorSet();
set.playTogether(moveX,moveY);

btn.setOnClickListener(new View.OnClickListener()
{
    public void onClick(View v){
        set.start();
        multi++;
        currentY=v.getY();
    }
});

我不认为在动画之后v.getx会改变

试试这个:

int multi =1;
btn=(Button)findViewById(R.id.button1);
currentX=btn.getX();
currentY=btn.getY();
moveX=ObjectAnimator.ofFloat(btn,"translationX",currentX+10*(multi-1),currentX+10*multi);
moveY=ObjectAnimator.ofFloat(btn,"translationY",currentY,currentY);
set=new AnimatorSet();
set.playTogether(moveX,moveY);

btn.setOnClickListener(new View.OnClickListener()
{
    public void onClick(View v){
        set.start();
        multi++;
        currentY=v.getY();
    }
});

您需要创建一个新的动画师,或者需要更新
moveX
moveY
动画的值。(实际上,您不需要
moveY
动画,因为您没有更改Y位置。)

此外,使用
.animate()
获取
ViewPropertyAnimator
,视图具有更高性能的动画功能。我将以这种方式重构您的代码:

btn.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        btn.animate().xBy(10).start()
    }
});

如果以后您决定也要设置Y位置的动画,您可以在
.start()

之前简单地添加
.yBy(值)
,您需要创建一个新的动画制作者,或者需要更新
moveX
moveY
动画的值。(实际上,您不需要
moveY
动画,因为您没有更改Y位置。)

此外,使用
.animate()
获取
ViewPropertyAnimator
,视图具有更高性能的动画功能。我将以这种方式重构您的代码:

btn.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        btn.animate().xBy(10).start()
    }
});

如果以后您决定也要设置Y位置的动画,您可以简单地在
.start()

之前添加
.yBy(value)
,这是因为在再次单击按钮将其设置为初始值后,您没有保持按钮移动到的x轴位置

更改这些行

使用静态变量

static int x_axis=10+btn.getX();


currentX=x_axis;
currentY=btn.getY();
moveX=ObjectAnimator.ofFloat(btn,"translationX",currentX,currentX);
moveY=ObjectAnimator.ofFloat(btn,"translationY",currentY,currentY);
set=new AnimatorSet();
set.playTogether(moveX,moveY);

btn.setOnClickListener(new View.OnClickListener()
{
    public void onClick(View v){
        set.start();
        x_axis=x_axis+10;
        currentY=v.getY();
    }
});

这是因为在单击按钮后,您没有保持按钮移动到的x轴位置,因此再次将其设置为初始值

更改这些行

使用静态变量

static int x_axis=10+btn.getX();


currentX=x_axis;
currentY=btn.getY();
moveX=ObjectAnimator.ofFloat(btn,"translationX",currentX,currentX);
moveY=ObjectAnimator.ofFloat(btn,"translationY",currentY,currentY);
set=new AnimatorSet();
set.playTogether(moveX,moveY);

btn.setOnClickListener(new View.OnClickListener()
{
    public void onClick(View v){
        set.start();
        x_axis=x_axis+10;
        currentY=v.getY();
    }
});