首页 > 解决方案 > 围绕中心点旋转一条线

问题描述

我目前正在开发一个带有计时器的游戏。

随着时间的流逝,红线应该围绕其中心点旋转,当时间结束时,红线会在另一侧结束。我目前让线条旋转并且它始终保持相同的长度,但它偶尔移动并且动画不流畅。我不完全确定我在这里做错了什么。

startX 和 Y 是线的起点,endX 和 Y 是线在 250 psi 时的终点

标签: javaandroidandroid-studiogeometry

解决方案


关于平滑的两点

1)使用浮点类型而不是 int 的动画器,因为我认为更新调用的时间不能保证精确到毫秒,因此您强制它截断值,因为该值实际上是使用分数计算的(浮点数)持续时间的 0 到 1 之间

例如,在一个完美的世界中,从 0 到 20 的时序开始如下:-

  • 0ms = 0
  • 500 毫秒 = 1
  • 1000 毫秒 = 2

但实际上,时序可能开始如下:-

  • 0ms = 0
  • 499ms = 0.999(转换为 int 时也为 0)
  • 1000 毫秒 = 2

2)重新计算线的起点和终点以重绘它可能不是最快的,因此也是最平滑的方法。

设置包含线条的画布的旋转可能更快更平滑onAnimationUpdate(将画布枢轴点 X 和 Y 设置为表盘的中心)

这是因为这很可能是硬件加速转换

例如

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.view.View;

public class Drawline extends View {
    Paint paint = new Paint();

    private void init() {
        paint.setColor(Color.BLACK);
    }

    public Drawline(Context context) {
        super(context);
        init();
    }

    public Drawline(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    public Drawline(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        init();
    }

    @Override
    public void onDraw(Canvas canvas) {
        canvas.drawLine(100, 100, 150, 150, paint);
    }

}

public class MainActivity extends AppCompatActivity {

    Drawline drawLine;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        drawLine = new Drawline(this);
        drawLine.setPivotX(100f);
        drawLine.setPivotY(100f);
        setContentView(drawLine);

        ValueAnimator animator = ValueAnimator.ofFloat(0f, 20f);
        animator.setDuration(10000);
        animator.setInterpolator(new LinearInterpolator());
        animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
            @Override
            public void onAnimationUpdate(ValueAnimator animation) {
                float x = (float) animation.getAnimatedValue();

                drawLine.setRotation(x);
                drawLine.invalidate();
            }
        });
        animator.start();
    }
}

推荐阅读