【问题标题】:Rotate a line around a center point围绕中心点旋转一条线
【发布时间】:2019-10-28 23:56:29
【问题描述】:

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

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

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

【问题讨论】:

  • 另外,您使用的是整数,因此指针只能占据 20 个离散位置之一。请改用float。数学三角函数将它们的参数作为弧度,而不是度数;你移动针的速度太快了,它正在包裹。试试ValueAnimator.ofFloat(Math.toRadians(-120),Math.toRadians(120));,不要加-80。
  • @greeble31 非常感谢!这至少修复了它的动画方面。

标签: java android android-studio geometry


【解决方案1】:

关于平滑的两点

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

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

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

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

  • 0ms = 0
  • 499ms = 0.999(转换为 int 时也是 0)
  • 1000ms = 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();
    }
}

【讨论】:

    猜你喜欢
    • 2013-05-20
    • 2013-09-22
    • 2013-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多