写在前面
以我们所使用的例程来说,我们为了在实现蓝牙定位的基础上而不影响其他功能的使用在原有功能的基础上新建了一个GET LOCATION的功能并且已经实现了实时更新我们已经设置好的ibeacon的RSSI的值。如图所示(请不要吐槽我们给ibeacon起的名字)
准备工作
为了将我们得到的RSSI的值变成一张便于理解的坐标图,我们需要首先画上一张坐标图,我们随便画了一张坐标图,因为是随便画的,最后是一个13x13的正方形。
然后再随意做一个点,作为坐标系中被定位的目标。到此为止我们的准备步骤算是做好了。
布局设置
这个当然是看自己的喜好自己布局了,我们使用的是FrameLayout来装载坐标图的。
代码设置
重点的部分来了,因为我们使用的手机的分辨率各不相同,为了使我们的坐标图在各个手机上都能够正常且合理的显示,我们需要使用一些函数来获取屏幕的宽度。幸运的是,我们找到的例程中自带getScreenWidth函数,使我们可以很方便地获取屏幕的宽度,但即使我们没有使用例程,也可以自己做一个getScreenWidth函数。有关的网站链接(https://www.cnblogs.com/H-BolinBlog/p/6878469.html)
public int getScreenWidth() {
DisplayMetrics dm = new DisplayMetrics();
this.getWindowManager().getDefaultDisplay().getMetrics(dm);
int screenWidth = dm.widthPixels;
return screenWidth;
}
这样我们只需要使用getScreenWidth()即可得到屏幕宽度了。
并且我们不仅可以从中得到屏幕的宽度(widthPixels),高度(heightPixels),dpi(densityDpi),屏幕密度(density)都能得到,只需将括号内的东西替换或再重新创建一个函数即可。
然后我们得到了想要的屏幕宽度,怎么设置layout的宽度和长度为合适的值呢?我们可以使用 findViewById().getLayoutParams()来得到其布局,并使用findViewById().setLayoutParams()来设置其布局,如下我们定义了一个layout变量来存储布局设置应对其更改再设置。
ViewGroup.LayoutParams layout=findViewById(R.id.frame).getLayoutParams();//定义一个LayoutParams型的变量layout值为frame的layoutparams
layout.width=getScreenWidth();//这里我们直接使用getScreenWidth()函数方便一些
findViewById(R.id.frame).setLayoutParams(layout); //frame为我们设置的framelayout的id
然后这些都做完后,就是点的坐标的设置。我们本来也想用findViewById()这种方法的但是发现其中的setTranslationX()与setTranslationY()虽然能够更改点的坐标,但是和我们之前get到的屏幕宽度不匹配,在此我翻了很多东西,如(https://www.cnblogs.com/JLZT1223/p/6784449.html)。又用上文所说的屏幕密度和dpi等值进行各种加减乘除运算都不能很好的将其与点的坐标匹配,最后无奈只能另选他法使用更改margin的值来更改点的位置,很不巧findViewById中并没有setMargin函数,但幸好有方法解决(https://thierry-xing.iteye.com/blog/1379202),在此列出代码
int width=getScreenWidth();
FrameLayout.LayoutParams dotpos= new FrameLayout.LayoutParams(FrameLayout.LayoutParams.WRAP_CONTENT,FrameLayout.LayoutParams.WRAP_CONTENT);
dotpos.setMargins(width-50,width-50,0,0);
findViewById(R.id.dot).setLayoutParams(dotpos);
其中dotpos为我们设置的变量,需要注意的是,如果你的点图片的父布局不是FrameLayout,那么你需要将上文中的FrameLayout改成你的点图片的父布局,不然程序会崩溃。在setMargins中的四个分别为(左,上,右,下),而-50是因为这里的坐标是指点图片左上角的坐标,可想而知当他的值设置width(即屏幕宽度)时,这个点就跑出屏幕了,你也可以试试发现的确是这样,这个-50就是适当的回调。上面的函数在我们的程序撒谎那个的效果是这样的。
发现这个点的确跑到了图片的右下角,至此我们已经实现了ibeacon定位的可视化操作,接下来只需更改setMargins中的数值即可。
写在最后
这是我们小组的第一个博客,写的不好请见谅。我们也是一边学习一边在做并且说实话上面的东西我还是没有弄明白,就当给大家一个参考。我会陆陆续续将我们小组之前所做的东西以同样的形式上传出来,希望能对大家有帮助。如果有问题请指出让我知道,我会及时更改或者干脆不改了直接删除(笑)。