我正在开发一款教育应用。与其他课程一起,这个应用程序将教孩子们阅读模拟时钟。课程结束后,应用程序将进行测验,通过在模拟时钟中移动小时,分针和秒针,它将要求孩子们设置说时间超过37的时间。
如何制作此模拟时钟?
一种方法是使用Android Timer Picker,但我不确定它可以自定义的程度。
答案 0 :(得分:0)
一个想法:
您可以使用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;
}
但是,如果有人有另外一个想法从Android的选择真正的自定义TimePicker,请不要使用此方法^^
答案 1 :(得分:0)
我建议你为每个时钟指针创建独立的图像。
因此,您可以从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 Annotation来获取此示例代码,但它很容易理解。
如果您想查看该应用程序,我已将其上传here。