如何围绕另一个点旋转保持相同的方向 - 动画 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();
}
我想围绕另一个点旋转(动画)一个对象,但我希望我的对象在旋转时保持相同的方向。我该怎么做,我们可以简单地调用 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();
}