Поверните линию вокруг центральной точки - PullRequest
0 голосов
/ 29 октября 2019

Я сейчас работаю над игрой с таймером.

С течением времени красная линия должна вращаться вокруг своей центральной точки, а когда время истекло, она заканчивается на противоположной стороне. В настоящее время у меня есть вращающаяся линия, и она постоянно остается одинаковой длины, но она движется спорадически, и анимация не плавная. Я не совсем уверен, что я делаю здесь неправильно.

startX, а Y - начальная конечная точка линии, а endX, а Y - конечная точка линии, когда ее значение составляет 250 фунтов на кв. Дюйм

1 Ответ

1 голос
/ 29 октября 2019

Два момента о плавности

1) Используйте аниматор типа float, не int, так как я не думаю, что время на вызовах Update гарантированно будет с точностью до миллисекунды, поэтому вы заставляете его усекатьзначение как значение фактически вычисляется с использованием дроби (float) от 0 до 1 продолжительности

например. В идеальном мире временная последовательность от 0 до 20 начинается следующим образом: -

  • 0 мс = 0
  • 500 мс = 1
  • 1000 мс = 2

Но в действительности временная последовательность может начинаться так: -

  • 0 мс = 0
  • 499 мс = 0,999 (при преобразовании в целое также будет 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();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...