本文主要是介绍指南针demo,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
初进公司,恰好遇到公司向通讯行业转型,新的手机产品有很多业务需要移植旧有的和新开发,指南针这个应用就属于新开发的。 在网上找了一些开源代码,比如说这个博客: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;}
通过上述判断之后就可以有效地解决上述问题!另外如果有什么问题的话,欢迎交流!
源码下载路径如下:
源码百度云下载
CSDN免积分下载
这篇关于指南针demo的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!