指南针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免积分下载

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

却染人间愁

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值