指南针(方法一)

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".MainActivity"android:background="#EAEAEA"><ImageViewandroid:id="@+id/compass_img"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_centerInParent="true"android:src="@mipmap/compass"/><ImageViewandroid:id="@+id/arrow_img"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_centerInParent="true"android:src="@mipmap/egl"/>
</RelativeLayout>

MainActivity

public class MainActivity extends Activity {private SensorManager mSensorManager;private ImageView mCompassImg;private SensorEventListener listener=new SensorEventListener() {float[] accelerometerValues=new float[3];float[] magenticValues=new float[3];private float lastRotateDegree;@Overridepublic void onSensorChanged(SensorEvent sensorEvent) {//判断当前是加速度传感器还是地磁传感器if(sensorEvent.sensor.getType()==Sensor.TYPE_ACCELEROMETER){accelerometerValues=sensorEvent.values.clone();}else if(sensorEvent.sensor.getType()==Sensor.TYPE_MAGNETIC_FIELD){magenticValues=sensorEvent.values.clone();}float[] R=new float[9];float[] values=new float[3];SensorManager.getRotationMatrix(R, null, accelerometerValues, magenticValues);SensorManager.getOrientation(R,values);Log.d("MainActivity","value[0] is"+Math.toDegrees(values[0]));//计算出旋转角度取反,用于旋转指南针背景图float rotateDegree= (float) -Math.toDegrees(values[0]);if(Math.abs(rotateDegree-lastRotateDegree)>-1){RotateAnimation animation=new RotateAnimation(lastRotateDegree,rotateDegree,Animation.RELATIVE_TO_SELF,0.5f,Animation.RELATIVE_TO_SELF,0.5f);animation.setFillAfter(true);mCompassImg.startAnimation(animation);lastRotateDegree=rotateDegree;}}@Overridepublic void onAccuracyChanged(Sensor sensor, int i) {}};@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);mCompassImg= (ImageView) findViewById(R.id.compass_img);mSensorManager= (SensorManager) getSystemService(Context.SENSOR_SERVICE);Sensor magenticSensor=mSensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);Sensor accelerometerSensor=mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);mSensorManager.registerListener(listener,magenticSensor,SensorManager.SENSOR_DELAY_GAME);mSensorManager.registerListener(listener,accelerometerSensor,SensorManager.SENSOR_DELAY_GAME);}@Overrideprotected void onDestroy() {super.onDestroy();if(mSensorManager!=null){mSensorManager.unregisterListener(listener);}}
}


表盘动,指针不动:

方法二:SurfaceView(SurfaceHolder相当于一个画布,在view的create方法中开启线程,由线程画图)
MyView

public class MyView extends SurfaceView implements Runnable,SurfaceHolder.Callback {private SensorManager manager;private Sensor acc;private Sensor magnetic;private SurfaceHolder surfaceHolder;private boolean isRunning = true;private Paint paint;private Paint mPaintCircle;private Paint mPaintText;private float[] accValue = new float[3];//加速度传感器的三个值private float[] magValue = new float[3];//地磁传感器的值private float degree = 0;private int width;private int height;private SensorEventListener listener = new SensorEventListener() {@Overridepublic void onSensorChanged(SensorEvent event) {if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {accValue = event.values.clone();} else if (event.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD) {magValue = event.values.clone();}float[] R = new float[9];float[] ori = new float[3];SensorManager.getRotationMatrix(R, null, accValue, magValue);SensorManager.getOrientation(R, ori);degree = (float) -Math.toDegrees(ori[0]);}@Overridepublic void onAccuracyChanged(Sensor sensor, int accuracy) {}};public MyView(Context context) {super(context);}public MyView(Context context, AttributeSet attrs){super(context, attrs);manager = (SensorManager) context.getSystemService(Context.SENSOR_SERVICE);acc = manager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);magnetic = manager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);manager.registerListener(listener, acc, SensorManager.SENSOR_DELAY_GAME);manager.registerListener(listener, magnetic, SensorManager.SENSOR_DELAY_GAME);paint = new Paint();paint.setColor(Color.RED);mPaintCircle=new Paint();mPaintCircle.setStyle(Paint.Style.STROKE);mPaintText=new Paint();mPaintText.setTextSize(50);surfaceHolder = getHolder();surfaceHolder.addCallback(this);}@Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {super.onMeasure(widthMeasureSpec, heightMeasureSpec);width=getDefaultSize(getSuggestedMinimumWidth(), widthMeasureSpec);height= getDefaultSize(getSuggestedMinimumHeight(), heightMeasureSpec);}@Overridepublic void surfaceCreated(SurfaceHolder holder) {new Thread(this).start();}@Overridepublic void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {holder.setFixedSize(this.width,this.height);}@Overridepublic void surfaceDestroyed(SurfaceHolder holder) {isRunning = false;}@Overridepublic void run() {while (isRunning) {Canvas canvas = surfaceHolder.lockCanvas();canvas.save();canvas.rotate(degree,width/2,height/2);canvas.drawColor(Color.WHITE);canvas.drawLine(width/2,height/2,width/2,height/2-200,paint);//画表盘:for(int i=1;i<=24;i++){canvas.rotate(15,width/2,height/2);canvas.drawLine(width/2,height/2-300,width/2,height/2-280,paint);}canvas.rotate(0,width/2,height/2);canvas.drawText("N",width/2,height/2-250,mPaintText);canvas.rotate(90,width/2,height/2);canvas.drawText("E",width/2,height/2-250,mPaintText);canvas.rotate(90,width/2,height/2);canvas.drawText("S",width/2,height/2-250,mPaintText);canvas.rotate(90,width/2,height/2);canvas.drawText("W",width/2,height/2-250,mPaintText);canvas.drawText("" + degree, 100, 100, paint);surfaceHolder.unlockCanvasAndPost(canvas);try {Thread.sleep(100);} catch (InterruptedException e) {e.printStackTrace();}}}
}

百度地图:

步骤:
1.申请密钥

无密钥口令,直接按回车键即可

SHA1:后面的为密钥

输入“密钥;包名”,提交,得到key

2.在相关下载中下载baidumap压缩包,解压后,将jar包导入libs文件下,将.so库导入/src/main/jinLibs文件夹下(JNI:JAVA native interface;;;.so库就是所有包含.so文件的文件夹需要放在main下jniLibs)

AndroidManifest:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"package="com.example.administrator.mybaidumap" ><uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/><uses-permission android:name="android.permission.INTERNET"/><uses-permission android:name="com.android.launcher.permission.READ_SETTINGS" /><uses-permission android:name="android.permission.WAKE_LOCK"/><uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /><uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /><uses-permission android:name="android.permission.GET_TASKS" /><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/><uses-permission android:name="android.permission.WRITE_SETTINGS" /><applicationandroid:allowBackup="true"android:icon="@mipmap/ic_launcher"android:label="@string/app_name"android:theme="@style/AppTheme" ><meta-dataandroid:name="com.baidu.lbsapi.API_KEY"android:value="qdz5WzbhsVnY4LodXK6nhWp7" /><activityandroid:name=".MainActivity"android:label="@string/app_name" ><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity></application>
</manifest>

MainActivity:

public class MainActivity extends Activity {MapView mMapView;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);SDKInitializer.initialize(getApplicationContext());setContentView(R.layout.activity_main);mMapView= (MapView) findViewById(R.id.bmapView);}@Overrideprotected void onDestroy() {super.onDestroy();//在activity执行onDestroy时执行mMapView.onDestroy(),实现地图生命周期管理mMapView.onDestroy();}@Overrideprotected void onResume() {super.onResume();//在activity执行onResume时执行mMapView. onResume (),实现地图生命周期管理mMapView.onResume();}@Overrideprotected void onPause() {super.onPause();//在activity执行onPause时执行mMapView. onPause (),实现地图生命周期管理mMapView.onPause();}
}

第四十四天 指南针、百度地图相关推荐

  1. 【Visual C++】游戏开发笔记四十四 浅墨DirectX教程十二 网格模型和X文件使用面面观

    本系列文章由zhmxy555(毛星云)编写,转载请注明出处. 文章链接: http://blog.csdn.net/zhmxy555/article/details/8586540 作者:毛星云(浅墨 ...

  2. 1977-2021 高考四十四年,哪一张照片是属于你的记忆(珍贵!)

    1977-2019 四十四年高考 一个国家命运的拐点 千百万个人生的转折 1977 四十四年     四十四图 1977年12月10日的高考, 是中国历史上唯一的一次冬季高考. 这一天,570多万从农 ...

  3. 【Visual C++】游戏开发笔记四十四 浅墨DirectX教程十二 网格模型和X文件使用面面观...

    本系列文章由zhmxy555(毛星云)编写,转载请注明出处. 文章链接:http://blog.csdn.net/zhmxy555/article/details/8586540 作者:毛星云(浅墨) ...

  4. Python编程基础:第四十四节 方法重写Method Overriding

    第四十四节 方法重写Method Overriding 前言 实践 前言 我们前面说了,子类继承于父类,可以调用父类的所有属性和方法.那么如果我们想在继承的过程中重新书写父类的某些方法,此时就用到了方 ...

  5. 四十四种Javascript技巧大全

    四十四种Javascript技巧大全 1.第一个给变量分配值时不要忘了var关键字. 分配值给未定义的变量将是该变量自动成为全局变量,应该避免全局变量. 2.使用 === 而不是 == 使用 == ( ...

  6. 四十四、深入Java 的序列化和反序列化

    @Author:Runsen @Date:2020/6/8 作者介绍:Runsen目前大三下学期,专业化学工程与工艺,大学沉迷日语,Python, Java和一系列数据分析软件.导致翘课严重,专业排名 ...

  7. [系统安全] 四十四.APT系列(9)Metasploit技术之基础用法万字详解及防御机理

    您可能之前看到过我写的类似文章,为什么还要重复撰写呢?只是想更好地帮助初学者了解病毒逆向分析和系统安全,更加成体系且不破坏之前的系列.因此,我重新开设了这个专栏,准备系统整理和深入学习系统安全.逆向分 ...

  8. JavaScript学习(四十四)—in关键字的使用和for in循环遍历对象的属性

    JavaScript学习(四十四)-in关键字的使用和for in循环遍历对象的属性 一.in关键字的使用 作用:判断某个属性是否属于对象 格式:属性名称 in 对象名称 ; 返回值:如果返回的结果为 ...

  9. NeHe OpenGL教程 第四十四课:3D光晕

    转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...

  10. NeHe OpenGL第四十四课:3D光晕

    NeHe OpenGL第四十四课:3D光晕 3D 光晕 当镜头对准太阳的时候就会出现这种效果,模拟它非常的简单,一点数学和纹理贴图就够了.好好看看吧.   大家好,欢迎来到新的一课,在这一课中我们将扩 ...

最新文章

  1. 计算机学win7画图,Win7系统自带画图工具如何打开?win7打开画图工具教程
  2. 强大的矢量图形库:Raphael JS 中文帮助文档及教程
  3. 网络营销外包下字节跳动如此优秀私有市场估值远超拼多多与京东
  4. Python-Django-Ajax进阶
  5. Nginx添加ngx_http_headers_module模块
  6. 六、pink老师学习笔记——CSS三角形之美 margin负值之美文字围绕浮动元素行内块元素布局的巧妙运用
  7. Linux笔记-利用chkconfig创建脚本使得Rabbimq开机自启
  8. sonarqube代码检核工具安装
  9. 用账号连无线网怎么连接网络连接服务器,路由器怎么共用一个宽带账号
  10. galerkin有限元法matlab实现,应用Matlab实现有限元分析.pdf
  11. python共享单车案例分析_文科生学Python系列20:共享单车案例2(相关性分析)
  12. 世界上著名的三大检索工具
  13. numpy ndarry根据条件筛选数据
  14. Anti-aliasing and Continuity with Trapezoidal Shadow Maps
  15. 分段概率密度矩估计_2017年考研《数学一》大纲
  16. c++课程设计图书馆管理系统总结
  17. 蓝牙体脂秤模块方案简述
  18. mySql | Error: ER_DATA_TOO_LONG: Data too long for column 'base_info' at row 1
  19. [小程序]两数比较(5种写法)
  20. 阿里云的「香港」机房大陆访问速度怎么样?

热门文章

  1. 大聪明教你学Java | 深入浅出聊布隆过滤器(Bloom Filter)
  2. 互联网日报 | 4月26日 星期一 | 快手二次元日活跃用户突破1亿;小米全球范围内专利达1.9万件;艺龙酒店首家旗舰店在沪开业
  3. java如何把汉字转换成机内码_java语言如何将汉字转化成五笔
  4. [leetcode]Unique Paths II
  5. 2022 高教杯数学建模C题古代玻璃制品的成分分析与鉴别回顾及总结
  6. [ git ] git托管代码1
  7. Win8.1RTM Pro电话激活
  8. win10 CMD大全
  9. IE 浏览器下的兼容(onclick)
  10. HDOJ 1846 Brave Game(巴士博弈)