ジェスチャーで時間通りにアナログ時計を設定し、分時計回りまたは反時計回りに触れます。

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

質問

ユーザーにアナログ時計を時間通りに設定できるようにクラスを作ろうとしています。現在の時間を設定するために、時間手ではなく、時計回りまたは反時計回りに分注意を移動する必要があります。時間の手が細い進行状況に従って自分自身を動かしますが、私は時間手を正しく移動することができない。それは毎回滑らかな動きをしていません、12時から6時まで、角度臨界点がある。

この瞬間までの私のトレーニングです。 12時に、角度は0度、最小角度、コースの最小角度、角度は180度、最大Imun角度です。したがって、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;
        }
    }
.

誰かが私のライトルビットを助けますか?誰かが私を助けることができるならば、私はあなたの名前を私の最初の未熟な娘にすることを約束します...ただ冗談を言っています。

役に立ちましたか?

解決

問題がどこにあったかを発見しました...

問題は、NewsPin()メソッド内の「IF条件」でした。ここでは、チェック条件を確認する前に、私は元のフォーマット(0度から180度の間、6時、時計回りから180度、および-180度から0度まで、6時まで、12時から0度まで) 「時計回りも)。したがって、代わりにユーザーがミニンスピンを起動したかどうかを確認し、それは1回目の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