首页 编程 软件学院 查看内容

三分钟看懂智能硬件原理——蓝牙防丢器制作教程(包括手机应用)(二)

2015-7-10 15:37 |来自: .cnblogs.com 2100 0

摘要: 7) 将My_BTS.java文件修改为: 1 package com.example.first_test; 2 3 import java.util.Vector; 4 5 public class My_BTS { 6 public String mName; 7 public String mAddr; 8 public VectorShort mRSSIVec ...
关键词: Paint public Activity import android Canvas 蓝牙 myHandler new Vector

7)   将My_BTS.java文件修改为:

复制代码
 1 package com.example.first_test;
 2 
 3 import java.util.Vector;
 4 
 5 public class My_BTS {
 6         public String mName;
 7         public String mAddr;
 8         public Vector mRSSIVector;
 9 
10         public My_BTS() {
11             mName = new String();
12             mAddr = new String();
13             mRSSIVector = new Vector();
14         }
15 
16         public My_BTS(String name, String addr) {
17             mName = name;
18             mAddr = addr;
19             mRSSIVector = new Vector();
20         }
21 }
复制代码

操作说明:该类表示蓝牙防丢器。其中mName和mAddr分别表示蓝牙防丢器的名字和地址;mSSIVector用来存放一段时间检测到该蓝牙防丢器的RSSI值(之所以保留多组数据,是方便今后大家扩展)。

8)   采用同样的方法新建一个Func_Draw.java文件,并将文件修改为:

复制代码
 1 package com.example.first_test;
 2 
 3 import java.util.Vector;
 4 
 5 import android.graphics.Canvas;
 6 import android.graphics.Color;
 7 import android.graphics.Paint;
 8 import android.graphics.Paint.Style;
 9 import android.view.Su**ceHolder;
10 
11 public class Func_Draw {
12         private static Vector mPaint = new Vector();
13         public static Integer times = 0;// 防丢搜索次数
14         public static float Bei = 200;// 绘制图形时放大倍数
15     
16         public static void initPaint() {
17             Paint paint0 = new Paint();
18             paint0.setAntiAlias(true);
19             paint0.setStyle(Style.STROKE);
20             paint0.setColor(Color.RED);
21             mPaint.add(paint0);
22             Paint paint1 = new Paint();
23             paint1.setAntiAlias(true);
24             paint1.setStyle(Style.STROKE);
25             paint1.setColor(Color.GREEN);
26             mPaint.add(paint1);
27             Paint paint2 = new Paint();
28             paint2.setAntiAlias(true);
29             paint2.setStyle(Style.STROKE);
30             paint2.setColor(Color.BLUE);
31             mPaint.add(paint2);
32             Paint paint3 = new Paint();
33             paint3.setAntiAlias(true);
34             paint3.setStyle(Style.STROKE);
35             paint3.setColor(Color.YELLOW);
36             mPaint.add(paint3);
37             Paint paint4 = new Paint();
38             paint4.setAntiAlias(true);
39             paint4.setStyle(Style.STROKE);
40             paint4.setColor(Color.WHITE);
41             mPaint.add(paint4);
42             Paint paint5 = new Paint();
43             paint5.setAntiAlias(true);
44             paint5.setStyle(Style.STROKE);
45             paint5.setColor(Color.LTGRAY);
46             mPaint.add(paint5);
47             Paint paint6 = new Paint();
48             paint6.setAntiAlias(true);
49             paint6.setStyle(Style.STROKE);
50             paint6.setColor(Color.CYAN);
51             mPaint.add(paint6);
52         }
53     
54         public static void draw(Su**ceHolder mHolder) {
55             Canvas canvas = mHolder.lockCanvas();
56             canvas.drawRGB(0, 0, 0);
57             for (int i = 0; i < UI_Main.mBTSArrayList.size(); i++) {
58                 boolean find = false;
59                 short rssi = 0;
60                 for (int j = 0; j < UI_Main.mFuncBT.mAddrVector.size(); j++) {
61                     if (UI_Main.mBTSArrayList.get(i).mAddr
62                             .equals(UI_Main.mFuncBT.mAddrVector.get(j))) {
63                         find = true;
64                         rssi = UI_Main.mFuncBT.mRSSIVector.get(j);
65                     }
66                 }
67                 if (find == false) {
68                     canvas.drawText(
69                             times + ": NOT_FIND "
70                                     + UI_Main.mBTSArrayList.get(i).mName, 5,
71                             i * 10 + 12, mPaint.get(i));
72                 } else {
73                     float power = (float) ((Math.abs(rssi) - 59) / (10 * 2.0));
74                     float dis = (float) Math.pow(10, power);
75     
76                     canvas.drawText(
77                             times + ": FIND " + UI_Main.mBTSArrayList.get(i).mName
78                                     + " dis: " + new Float(dis).toString()
79                                     + " rssi: " + rssi, 5, i * 10 + 12,
80                             mPaint.get(i));
81                     canvas.drawCircle(canvas.getWidth() / 2,
82                             canvas.getHeight() / 2, Bei * dis, mPaint.get(i));//画圆圈
83                 }
84             }
85             times++;
86             mHolder.unlockCanvasAndPost(canvas);// 更新屏幕显示内容
87             UI_Main.mFuncBT.mRSSIVector.clear();
88             UI_Main.mFuncBT.mNameVector.clear();
89             UI_Main.mFuncBT.mAddrVector.clear();
90         }
91 }
复制代码

操作说明:该类提供在Su**ceView上绘制功能。其中静态方法initPaint对画笔进行初始化,draw函数负责绘制。

draw函数的核心在于canvas绘图,canvas绘图的过程和我们在白纸上绘绘图的过程很像,如:

l  第55行锁定canvas相当于得到一张纸; 
l  第56行用RGB为0的颜色来刷新canvas相当于用橡皮擦把纸上原来的东西擦掉; 
l  第68和76行drawText相当于在纸的相应位置写文字; 
l  第81行drawCircle相当于在纸的相应位置绘制一个指定的圆; 
l  第86行的nlockCanvasAndPost相当于你把绘制好的作品拿出来展示给别人看;

正是因为canvas的加锁和解锁这一机制,才保证了绘制过程中屏幕正确地显示。

  接着再来理解这里draw函数的功能:mBTSArrayList是一个My_BTS类型的数组,保存我们想要防丢的蓝牙防丢器设备的名称、地址等信息;mFuncBT是一个可以实时搜索周边蓝牙设备的一个对象,其静态变量mNameVector、mAddrVector、mRSSIVector保存着实时搜索结果;这样核心部分的功能便是通过两层循环遍历待防丢设备是否在本次搜索中,如果不在则显示“NOT_FIND”,如果在则由RSSI计算距离。(效果如图8-4)

图 8-4 找到蓝牙设备图

9)   新建一个Func_BT.java文件,并修改为:

复制代码
  1 package com.example.first_test;
  2 
  3 import java.util.Vector;
  4 
  5 import android.app.Activity;
  6 import android.bluetooth.BluetoothAdapter;
  7 import android.bluetooth.BluetoothDevice;
  8 import android.content.BroadcastReceiver;
  9 import android.content.Context;
 10 import android.content.Intent;
 11 import android.content.IntentFilter;
 12 import android.os.Bundle;
 13 import android.os.Handler;
 14 import android.os.Message;
 15 
 16 public class Func_BT {
 17         private BluetoothAdapter mBtAdapter;// 蓝牙适配器
 18         private static final int ENABLE_BLUETOOTH = 1;
 19         // 分别用于存储设备名地址名称和RSSI的向量
 20         public Vector mNameVector;
 21         public Vector mAddrVector;
 22         public Vector mRSSIVector;
 23     
 24         private Handler myHandler;
 25         private Activity activity;
 26         
 27         public Func_BT(Activity activity, Handler myHandler) {
 28             this.myHandler = myHandler;
 29             this.activity = activity;
 30     
 31             mNameVector = new Vector();// 向量
 32             mAddrVector = new Vector();
 33             mRSSIVector = new Vector();
 34     
 35             IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND);
 36             activity.registerReceiver(mReceiver, filter);
 37             filter = new IntentFilter(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);
 38             activity.registerReceiver(mReceiver, filter);
 39             activity.registerReceiver(mReceiver, filter);
 40     
 41             mBtAdapter = BluetoothAdapter.getDefaultAdapter();
 42         }
 43     
 44         private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
 45             @Override
 46             public void onReceive(Context context, Intent intent) {
 47                 String action = intent.getAction();
 48                 if (BluetoothDevice.ACTION_FOUND.equals(action)) {
 49                     BluetoothDevice device = intent
 50                             .getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
 51                     short rssi = intent.getExtras().getShort(
 52                             BluetoothDevice.EXTRA_RSSI);
 53                     mNameVector.add(device.getName());
 54                     mAddrVector.add(device.getAddress());
 55                     mRSSIVector.add(rssi);
 56                 } else if (BluetoothAdapter.ACTION_DISCOVERY_FINISHED
 57                         .equals(action)) {
 58                     /*if (mNameVector.size() != 0) {
 59                         Message msg = new Message();// 消息
 60                         msg.what = 0x01;// 消息类别
 61                         myHandler.sendMessage(msg);
 62                     }*/
 63                 }
 64             }
 65         };
 66     
 67         public void doDiscovery() {
 68             if (mBtAdapter.isDiscovering()) {
 69                 mBtAdapter.cancelDiscovery();
 70             }
 71             mBtAdapter.startDiscovery();
 72             new TimeLimitThread().start();
 73         }
 74     
 75         public void openBT() {
 76             // 如果没有打开则打开
 77             if (!mBtAdapter.isEnabled()) {
 78                 Intent intent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
 79                 activity.startActivityForResult(intent, ENABLE_BLUETOOTH);
 80             } else {
 81                 doDiscovery();
 82             }
 83         }
 84     
 85         protected void onActivityResult(int requestCode, int resultCode, Intent data){
 86             if (requestCode == ENABLE_BLUETOOTH) {
 87                 if (resultCode == Activity.RESULT_OK) {
 88                     doDiscovery();
 89                 }
 90             }
 91         }
 92     
 93         public void setHandler(Handler myHandler) {
 94             this.myHandler = myHandler;
 95         }
 96     
 97         public void setFunc_BT(Activity activity, Handler myHandler) {
 98             this.myHandler = myHandler;
 99             this.activity = activity;
100         }
101         
102         class TimeLimitThread extends Thread{
103             public void run() {
104                 try {
105                     sleep(3000);
106                     if (mBtAdapter.isDiscovering()) {
107                         mBtAdapter.cancelDiscovery();
108                     }
109                     Message msg = new Message();// 消息
110                     msg.what = 0x01;// 消息类别
111                     myHandler.sendMessage(msg);
112                 } catch (InterruptedException e) {
113                     e.printStackTrace();
114 
                      声明:文章版权归原作者所有 部分文章转自互联网 如有侵权请联系 
                      [邮箱地址] 删除
                    

路过

雷人

握手

鲜花

鸡蛋

最新评论

返回顶部