gpt4 book ai didi

java - 在 Android 时钟中移动分针

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:18:28 24 4
gpt4 key购买 nike

我正在尝试编写一个简单的概念验证应用程序,允许用户旋转时钟的分针。我很难为 OnTouchEvent 想出正确的逻辑。

到目前为止,我有以下代码:

    public boolean onTouchEvent(MotionEvent e) {

float x = e.getX();
float y = e.getY();

switch (e.getAction()) {
case MotionEvent.ACTION_MOVE:
//find an approximate angle between them.

float dx = x-cx;
float dy = y-cy;
double a=Math.atan2(dy,dx);

this.degree = Math.toDegrees(a);
this.invalidate();
}
return true;
}


protected void onDraw(Canvas canvas) {
super .onDraw(canvas);

boolean changed = mChanged;
if (changed) {
mChanged = false;
}

int availableWidth = getRight() - getLeft();
int availableHeight = getBottom() - getTop();

int x = availableWidth / 2;
int y = availableHeight / 2;

cx = x;
cy = y;

final Drawable dial = mDial;

int w = dial.getIntrinsicWidth() + 100;
int h = dial.getIntrinsicHeight() + 100;

boolean scaled = false;

if (availableWidth < w || availableHeight < h) {
scaled = true;

float scale = Math.min((float) availableWidth / (float) w, (float) availableHeight / (float) h);

canvas.save();
canvas.scale(scale, scale, x, y);
}

if (changed)
{
dial.setBounds(x - (w / 2), y - (h / 2), x + (w / 2), y + (h / 2));
}

dial.draw(canvas);

canvas.save();
float hour = mHour / 12.0f * 360.0f;

canvas.rotate(hour, x, y);

final Drawable hourHand = mHourHand;

if (changed) {

w = hourHand.getIntrinsicWidth() + 30;
h = hourHand.getIntrinsicHeight() + 30;

hourHand.setBounds(x - (w / 2), y - (h / 2), x + (w / 2), y + (h / 2));
}

hourHand.draw(canvas);
canvas.restore();

canvas.save();
float minute = mMinutes / 60.0f * 360.0f;

if (bearing == 0)
{
canvas.rotate(minute, x, y);
}
else
{
canvas.rotate((float)bearing, x, y);
}

final Drawable minuteHand = mMinuteHand;

if (changed) {

w = minuteHand.getIntrinsicWidth() + 30;
h = minuteHand.getIntrinsicHeight() + 30;

minuteHand.setBounds(x - w, y - h, x + w, y + h);
}

minuteHand.draw(canvas);
canvas.restore();

if (scaled) {
canvas.restore();
}
}

然后基于此,我的 OnDraw 方法将分针旋转到指定的“this.degree”(仅调用 canvas.rotate)。我假设我的数学不在这里。我试着按照这里的例子:Calculate angle for rotation in Pie Chart ,但这仍然没有正确旋转分针。任何帮助,将不胜感激。

最佳答案

数学看起来是正确的。您的计算应该给出触摸事件的角度,其中在中心点右侧的触摸应该给您 0 度。

注意事项

  • 确保你的旋转方向正确。很难保持正直,因此很容易搞砸
  • 确保您考虑到值 0 意味着分针应指向右侧。例如,如果您从指向上的分针开始,则必须将计算结果加/减 90 度(取决于旋转方向 - 不确定哪个是正确的)
  • 确保 (cx, cy) 是您要围绕其计算角度的中心点
  • 旋转时,您需要使用 3 arg Canvas.rotate(float, float, float) 方法,或单独添加额外的翻译,以确保您正在旋转正确的点。没有任何平移,它会围绕(0,0)旋转( View 的左上角)

更多关于旋转:旋转总是围绕“当前”(0,0) 点进行。 “当前”是指应用当前矩阵后的 (0,0) 点。第一次进入onDraw时,(0,0)点应该是 View 的左上角。无论何时应用平移/缩放等,您都可能会更改 (0,0) 点相对于 View 的位置。

关于设置正确的旋转中心,我认为像下面这样的东西应该起作用:

//first we save the initial matrix, so we can easily get
//back to this state after we're done rotating
canvas.save();
//I *think* you need to negate the center offsets here,
//because you are conceptually moving the canvas, rather
//than moving the center directly
canvas.translate(-cx, -cy);
//<perform the rotation and draw the clock hand>
//...

//and now restore the matrix back to the initial state
canvas.restore();

关于java - 在 Android 时钟中移动分针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7578422/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com