初进公司,恰好遇到公司向通讯行业转型,新的手机产品有很多业务需要移植旧有的和新开发,指南针这个应用就属于新开发的。 在网上找了一些开源代码,比如说这个博客:Android 电子罗盘 --指南针(方向传感器的应用); 中心对称的指南针图片真的是太难找了,网上找了十几张指南针图片,放到app中之后都不是完全中对称的,于是我自己用viso画了一幅图,黑色表示北方,白色表示南方;这个指南针demo我做出来之后发现一个问题,就是当它旋转到临界点:比如说指向正北偏西1度角, 这个时候把手机逆时顺旋转2度,整个图形在顺时针旋转到十分接近北偏东度一度角时,会突兀地逆 时针旋转360度,这不合理,于是我问博主这个问题有没有什么好的解决方案?至今没有回复,于是我开始自己思考。
原方案如下:
float degree = event.values[0];
RotateAnimation ra = new RotateAnimation(currentDegree, -degree,
Animation.RELATIVE_TO_SELF, 0.5f,
Animation.RELATIVE_TO_SELF, 0.5f);
//旋转过程持续时间
ra.setDuration(200);
//罗盘图片使用旋转动画
imageView.startAnimation(ra);
解决方案如下,添加临界情况判断,我在logcat日志中打印degree、currentDegree和-degree的值,发现,几乎所有经过临界点的currentDegree值和-degree值都在【-360~-300或-50~0】,这样就可以增加一个判断:
xCoordinateValue = event.values[0];
float deGrees = xCoordinateValue;
float fromDegrees = currentDgree;
float toDegrees = -deGrees;
final float roundAngle = 360f;
final float criticalAngleMin = -250f;
final float criticalAngleMax = -50f;
setCoordinatesText();
if (fromDegrees >= criticalAngleMax && toDegrees <= criticalAngleMin) {
toDegrees = toDegrees + roundAngle;
StartAnimation(fromDegrees, toDegrees);
currentDgree = toDegrees - roundAngle;
} else if (fromDegrees <= criticalAngleMin && toDegrees >= criticalAngleMax) {
fromDegrees = fromDegrees + roundAngle;
StartAnimation(fromDegrees, toDegrees);
currentDgree = toDegrees;
} else {
StartAnimation(fromDegrees, toDegrees);
currentDgree = toDegrees;
}
通过上述判断之后就可以有效地解决上述问题!另外如果有什么问题的话,欢迎交流!
源码下载路径如下: