指南针demo

来源:互联网 发布:淘宝有销量没评价 编辑:程序博客网 时间:2024/04/28 14:45

初进公司,恰好遇到公司向通讯行业转型,新的手机产品有很多业务需要移植旧有的和新开发,指南针这个应用就属于新开发的。 在网上找了一些开源代码,比如说这个博客: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免积分下载

1 0
原创粉丝点击