Настройка аналогового таймера - PullRequest
0 голосов
/ 07 мая 2018

Я занимаюсь разработкой образовательного приложения. Помимо других уроков, это приложение научит детей читать аналоговые часы. После урока приложение проведет викторину, в которой попросит детей установить время, чтобы сказать, что 1 прошло 37, перемещая часовую, минутную и секундную стрелки в аналоговых часах.

Как я могу сделать эти аналоговые часы?

Один из способов - использовать Android Timer Picker, но я не уверен, насколько он настраиваем.

this Analog Clock

Ответы [ 2 ]

0 голосов
/ 07 мая 2018

Я предлагаю вам создать независимые изображения для каждой стрелки часов.

Таким образом, вы можете рассчитать угол по положению события ACTION_MOVE (e.getRawX и e.getRawY). Здесь используется формула atan .

это пример деятельности, в которой выполняется отслеживание вращения.

@EActivity(R.layout.activity_main)
public class MainActivity extends AppCompatActivity {

@ViewById(R.id.linear_hand)
protected LinearLayout linearHand;

@ViewById(R.id.root_layout)
protected RelativeLayout rootLayout;

private int generalMargin;
private int rayon;
private SimplePoint centerPoint;

boolean isMoving = false;


@AfterViews
protected void initAfterViews() {

    initCenterPoint();

    linearHand.setOnTouchListener((v, event) -> {
        switch (event.getAction()) {
            case MotionEvent.ACTION_MOVE:
                int[] location = new int[2];
                rootLayout.getLocationOnScreen(location);
                int rootLayoutLocationY = location[1];

                //since getRawY return y position including phone header need to make it from rootLayout
                float rotationAngle = getRotationAngle(new 
SimplePoint(event.getRawX(), event.getRawY()-rootLayoutLocationY), 
centerPoint);
                rotate(linearHand, rotationAngle);
                break;
        }
        return true;
    });

}


private void initCenterPoint() {
    generalMargin = getResources().getDimensionPixelSize(R.dimen.general_margin);
    rayon = getResources().getDimensionPixelSize(R.dimen.hand_length);
    centerPoint = new SimplePoint(generalMargin + rayon, generalMargin + rayon);
    Log.d("log", "the program works perfectly " + adjustToCenter(new SimplePoint(), centerPoint));

}


/***
 * transform point into mathematical point
 * @param point the point to be translated
 * @param center the center of the circle
 * @return
 */
public static SimplePoint adjustToCenter(SimplePoint point, SimplePoint center) {
    SimplePoint ans = new SimplePoint();
    ans.setX(point.getX() - center.getX());
    ans.setY((point.getY() - center.getY()) * -1);
    return ans;
}

/***
 *
 * @param point the point
 * @param centerPoint the center
 * @return angle of rotation
 */
public static float getRotationAngle(SimplePoint point, SimplePoint centerPoint) {
    SimplePoint realPoint = adjustToCenter(point, centerPoint);
    return (float) Math.toDegrees(Math.atan2(realPoint.getY(), realPoint.getX()));
}

public static void rotate(View v, float angle) {
    // make some adjustments for anti clockwise rotation
    v.setRotation((angle-90f) * -1);
}
}

Извините, я использовал Java8 и Аннотация Android для этого примера кода, но это легко понять.

Если вы хотите проверить приложение, я загрузил его здесь .

0 голосов
/ 07 мая 2018

Одна идея: Вы можете поместить некоторые компоненты TextView с помощью методов android:onClick, поэтому, когда пользователь щелкнет по некоторому числу, например 5, он выберет 25 минут.

<TextView
        android:id="@+id/tvNumber5"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:onClick="number5"
        android:text="@string/number5"
        android:textColor="@color/white" />

И в вашей деятельности у вас будет что-то вроде этого:

public void number5(View view) {
        minutes = 25;
}

Но если у кого-то есть другая идея выбрать настоящий пользовательский TimePicker, как у Android, не используйте этот метод ^^

...