제스처로 시간에 아날로그 시계 설정, 시계 방향 또는 반 시계 방향으로 손을 만지고,

StackOverflow https://stackoverflow.com//questions/24039913

문제

사용자가 아날로그 시계를 시간에 설정할 수있는 클래스를 만들려고합니다. 현재 시간을 설정하려면 시간을 설정하려면 시간을 시계 방향으로 또는 반 시계 방향으로 이동해야합니다. 시간 핸드는 미세한 손 진행에 따라 자체가 움직입니다. 그러나 나는 시간을 올바르게 움직일 수 없습니다. 매번 2시와 6시 여섯 시까 지 매일 매끄러운 움직임이 없습니다.

이 순간까지는 내 운동입니다. 12시에는 각도는 0도, 물론 최소 각도와 6시에 각도가 180도이며 최대 각도입니다. 따라서 12 개에서 6 개까지 (시계 방향), 우리는 긍정적 인 각도 (0,180)를 가지고 있으며, 6에서 12 (시계 방향으로), 우리는 음의 각도 (-180,0)를 가지고 있습니다. 그것은 괜찮습니다. 그러나 분 손 진행에 따라 시간의 올바른 위치가 무엇인지 계산하고 싶다면, 나는 그 각도를 0-360도 범위로 번역해야합니다.

여기서 제스처를 처리하는 곳입니다.

@Override
public boolean onTouch(View v, MotionEvent event) {

    // Clock is the clock sphere and the minutes hand.
    final float xc = clock.getTranslationX() + (clock.getWidth() / 2);
    final float yc = clock.getTranslationY() + (clock.getHeight() / 2);

    final float x = event.getX();
    final float y = event.getY();

    switch (event.getAction()) {
    case MotionEvent.ACTION_DOWN:
        clock.clearAnimation();
        mMinutesCurrAngle = Math.toDegrees(Math.atan2(x - xc, yc - y));
        break;

    case MotionEvent.ACTION_MOVE:

        /**
         * Translate angles from [-179,179] to [0,360] to be able to move 
         * hours hand properly.
         */

        // Start Angle
        mMinutesCurrAngle = set360Angle(mMinutesCurrAngle);
        mMinutesPrevAngle = mMinutesCurrAngle;

        // Finish angle
        mMinutesCurrAngle = Math.toDegrees(Math.atan2(event.getX() - xc, yc - event.getY()));
        mMinutesCurrAngle = set360Angle(mMinutesCurrAngle);

        if ((mMinutesCurrAngle > mMinutesPrevAngle)) {
            // Clockwise between 12 and 6
            mHoursCurrAngle = mLastSpinHoursAngle + (mMinutesCurrAngle / 12);
        } else if ((mMinutesCurrAngle < mMinutesPrevAngle)) {
            // counter-Clockwise between 6 and 12
            mHoursCurrAngle = mLastSpinHoursAngle + (mMinutesCurrAngle / 12);
        } else if ((mMinutesCurrAngle > mMinutesPrevAngle) && (mMinutesCurrAngle < 0)) {
            // Clockwise between 6 and 12
            mHoursCurrAngle = mLastSpinHoursAngle + (- mMinutesCurrAngle / 12);
        } else if ((mMinutesCurrAngle < mMinutesPrevAngle) && (mMinutesCurrAngle < 0)) {
            // counter-Clockwise between 6 and 12
            mHoursCurrAngle = mLastSpinHoursAngle + (mMinutesCurrAngle / 12);
        }

        newSpin();

        // Transelate angles to the original format to represent them properly.
        mMinutesPrevAngle = translate360Angle(mMinutesPrevAngle);
        mMinutesCurrAngle = translate360Angle(mMinutesCurrAngle);

        animate(clock, mMinutesPrevAngle, mMinutesCurrAngle, 0);
        animate(hour, mHoursPrevAngle, mHoursCurrAngle, 0);
        mHoursPrevAngle = mHoursCurrAngle;
        break;

    case MotionEvent.ACTION_UP:
        break;        
    }
    return true;
}
.

여기서는 내가 번역 각도입니다.

    /**
     * Translate angles from [-179,179] to [0,360] to be able to move 
     * hours hand properly.
     * @param minutesAngle
     * @return
     */
    private double set360Angle(double angle) {
        if (angle < 0) return (360 + angle); 
        else return angle;
    }

    /**
     * Transelate angles to the original format to represent them properly.
     * @param angle
     * @return
     */
    private double translate360Angle(double angle) {
        if (angle > 180) return (-360 + angle);
        else return angle;
    }
.

다음은 분 손이 새로운 스핀을 시작하는지 아는 곳입니다 :

private void newSpin() {

    if (translate360Angle(mMinutesPrevAngle) < 0 && translate360Angle(mMinutesCurrAngle) > 0) {
            // New Spin clockwise
            // I must remember hour hand angle
            mLastSpinHoursAngle = mHoursPrevAngle;
        } else if (translate360Angle(mMinutesPrevAngle) > 0 && translate360Angle(mMinutesCurrAngle) < 0) {
            // New Spin counter-clockwise
            // I must remember hour hand angle
            mLastSpinHoursAngle = mHoursPrevAngle;
        }
    }
.

누구도 LITLE 비트를 도와 드릴 수 있습니까? 누구든지 나를 도울 수 있다면, 나는 당신의 이름을 내 첫 번째 태아 딸에게 약속 할 것을 약속드립니다 ... 그냥 농담.

도움이 되었습니까?

해결책

나는 문제가 어디에 있는지 발견했다 ...

문제는 newspin () 메소드 내부의 "If Conditions"가였습니다. 여기서 체크 조건을 확인하기 전에, 나는 원래 형식 (12시에서 12시까지 12시에서 6시까지, 시계 방향, -180도에서 0도까지, 6시에서 12시까지)을 번역했습니다. '시계도, 시계 방향으로). 대신 사용자가 분침에 새로운 스핀을 시작했는지 확인하십시오. 매번 사용자가 6시 방향에 6시 방향으로 간격을 늘리면 새로운 스핀을 추가 / 빼는 것입니다.

그래서, 나는 그것이 조건을 수정하고, 360도 형식으로 분 손 각도, 이전 및 전류를 모두 확인했다. 이제 이전 각도가 355도보다 큰 경우 현재 각도가 5도보다 작 으면 mspinnumber에 새로운 스핀을 추가합니다. 마찬가지로 이전 각도가 5도보다 작 으면 현재 각도가 355도보다 크다면 나는 스핀을 mspinnumber를 뺍니다. NewSpin ()에서 CalculateHourHandangle ()에서 메소드의 이름을 변경했습니다.

private void calculateHourHandAngle() {

    if ((mMinutesPrevAngle > 355) && (mMinutesCurrAngle < 5)) {
        // New Spin clockwise
        mSpinNumber++;
    } else if ((mMinutesPrevAngle < 5) && (mMinutesCurrAngle > 355)) {
        // New Spin counter-clockwise
        mSpinNumber--;
    }
    mHoursCurrAngle = (mSpinNumber * (360/12)) + (mMinutesCurrAngle / 12);
}
.

onTouch () 메서드에서 불필요한 코드를 제거합니다.

@Override
public boolean onTouch(View v, MotionEvent event) {

    // Clock is the clock sphere and the minutes hand.
    final float xc = clock.getTranslationX() + (clock.getWidth() / 2);
    final float yc = clock.getTranslationY() + (clock.getHeight() / 2);

    final float x = event.getX();
    final float y = event.getY();

    switch (event.getAction()) {
    case MotionEvent.ACTION_DOWN:
        clock.clearAnimation();
        hour.clearAnimation();
        mMinutesCurrAngle = Math.toDegrees(Math.atan2(x - xc, yc - y));
        break;

    case MotionEvent.ACTION_MOVE:

        /**
         * Translate angles from [-179,179] to [0,360] to be able to move 
         * hours hand properly.
         */

        // Start Angle
        mMinutesCurrAngle = set360Angle(mMinutesCurrAngle);
        mMinutesPrevAngle = mMinutesCurrAngle;

        // Finish angle
        mMinutesCurrAngle = Math.toDegrees(Math.atan2(event.getX() - xc, yc - event.getY()));
        mMinutesCurrAngle = set360Angle(mMinutesCurrAngle);

        calculateHourHandAngle();

        animate(clock, translate360Angle(mMinutesPrevAngle), translate360Angle(mMinutesCurrAngle), 0);
        animate(hour, mHoursPrevAngle, mHoursCurrAngle, 0);
        mHoursPrevAngle = mHoursCurrAngle;
        break;

    case MotionEvent.ACTION_UP:
        break;        
    }
    return true;
}
.

이제는 손 시계의 초기 위치, 회전 횟수 및 미세한 손 각도를 알고 있기 때문에 사용자를 설정 한 시간을 알 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top