如何围绕另一个点旋转保持相同的方向 - 动画 Android

How rotate around another point keeping the same orientation - Animation Android

我想围绕另一个点旋转(动画)一个对象,但我希望我的对象在旋转时保持相同的方向。我该怎么做,我们可以简单地调用 Android 函数还是必须使用数学(二维矩阵公式)?

I want this result

我的代码:

public class MainActivity extends AppCompatActivity {

    Button button;
    float radius = 195.0f;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        button = (Button) findViewById(R.id.t);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                rotate()
            }
        });

        button.setX(button.getX() + radius);

    }
}

我的布局:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin">

    <Button
        android:id="@+id/t"
        android:layout_width="50dp"
        android:layout_height="50dp"
        android:text="R"
        android:layout_centerVertical="true"
        android:layout_centerHorizontal="true" />

</RelativeLayout>

解法:这种旋转很简单"Translation in Circular Path":

private void rotate(){

             final ValueAnimator animator = ValueAnimator.ofFloat(0.0f, 360.0f);
             animator.setDuration(5000);
             animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
                   @Override
                   public void onAnimationUpdate(ValueAnimator valueAnimator) {
                   float value = (Float) animator.getAnimatedValue();

                   DisplayMetrics metrics = new DisplayMetrics();
                   getWindowManager().getDefaultDisplay().getMetrics(metrics);

                   float cx = metrics.widthPixels / 2;
                   float cy = metrics.heightPixels / 2;

                   float x = (float) (cx + radius * Math.cos((float) Math.toRadians(value))); // center x in arc
                   float y = (float) (cy + radius * Math.sin((float) Math.toRadians(value))); // center y in arc

                   x -= (button.getWidth() / 2);
                   y -= (button.getHeight() / 2);

                   button.setX(x);
                  button.setY(y);
                }
            });

            animator.start();
}