java - 围绕中心点旋转一条线
问题描述
我目前正在开发一个带有计时器的游戏。
随着时间的流逝,红线应该围绕其中心点旋转,当时间结束时,红线会在另一侧结束。我目前让线条旋转并且它始终保持相同的长度,但它偶尔移动并且动画不流畅。我不完全确定我在这里做错了什么。
startX 和 Y 是线的起点,endX 和 Y 是线在 250 psi 时的终点
解决方案
关于平滑的两点
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();
}
}
推荐阅读
- ruby - Ruby FFI 回调返回值
- android - 使用 Chrome 进行 USB 调试仅在 Android Studio 打开时有效
- amazon-web-services - 在 lambda 函数中访问 aws appsync api 的环境特定表名
- python - Python MD4 函数无法像在线 MD4 哈希生成器那样生成哈希码
- azure-devops - 在构建队列时扩展模板验证
- ios - iOS Web 应用程序不能在主屏幕应用程序中脱机工作,但在 Safari 中工作
- python - Python Regex:匹配任何由另一个单词分隔的重复单词
- c++ - 如何使用 C++ 在 Visual Studio 中制作 WinPE 应用程序
- matlab - 如何创建一个以矩阵为输入的函数?
- linq - LINQ 查询左连接两个表并连接