Android之指南针(电子罗盘)学习

点我下载源码

5月12日更新到V5版:http://download.csdn.net/detail/weidi1989/5364243

今天,在小米的开源项目中下载了一个指南针源码学习了一下,感觉不仅界面做得很漂亮,代码也是很精致,所以我在研究了之后,加了比较多的注释,果断跟大家分享一下,很精简的几段代码,仔细品味可以学到很多东西,我稍微总结一下:

①.handler的灵活运用,每20秒后执行一次自己,用来检测方向变化值,更新指南针旋转。

②.传感器和谷歌位置服务的使用。

③.自定义View,这里面是自定义一个ImageView,自己增加一个旋转图片的方法。

④.Android动画Interpolator插入器:AccelerateInterpolator加速插入器的运用。顺便说一下另外几个插入器:

——AccelerateInterpolator:动画从开始到结束,变化率是一个加速的过程。

——DecelerateInterpolator:动画从开始到结束,变化率是一个减速的过程。

——CycleInterpolator:动画从开始到结束,变化率是循环给定次数的正弦曲线。

——AccelerateDecelerateInterpolator:动画从开始到结束,变化率是先加速后减速的过程。

——LinearInterpolator:动画从开始到结束,变化率是线性变化。
                                    AccelerateInterpolator有一个方法:getInterpolation(float input);

⑤.巧妙的数字替换成对应的数字图片和根据本地语言使用对应的图片资源(图片资源国际化,哈哈)。还有一些其他的小知识,朋友们,自己下载去研究吧!

下面看一下效果图(我的是模拟器,木有传感器也木有定位的):

下面我们来看一下这个界面的布局文件(main.xml):

[html] view plaincopy

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:layout_width="fill_parent"
  4. android:layout_height="fill_parent" >
  5. <FrameLayout
  6. android:layout_width="fill_parent"
  7. android:layout_height="fill_parent"
  8. android:background="@drawable/background" >
  9. <LinearLayout
  10. android:id="@+id/view_compass"
  11. android:layout_width="fill_parent"
  12. android:layout_height="fill_parent"
  13. android:background="@drawable/background_light"
  14. android:orientation="vertical" >
  15. <LinearLayout
  16. android:layout_width="fill_parent"
  17. android:layout_height="0dip"
  18. android:layout_weight="1"
  19. android:orientation="vertical" >
  20. <FrameLayout
  21. android:layout_width="fill_parent"
  22. android:layout_height="wrap_content"
  23. android:background="@drawable/prompt" >
  24. <LinearLayout
  25. android:layout_width="fill_parent"
  26. android:layout_height="wrap_content"
  27. android:layout_gravity="center_horizontal"
  28. android:layout_marginTop="70dip"
  29. android:orientation="horizontal" >
  30. <LinearLayout
  31. android:id="@+id/layout_direction"
  32. android:layout_width="0dip"
  33. android:layout_height="wrap_content"
  34. android:layout_weight="1"
  35. android:gravity="right"
  36. android:orientation="horizontal" >
  37. </LinearLayout>
  38. <ImageView
  39. android:layout_width="20dip"
  40. android:layout_height="fill_parent" >
  41. </ImageView>
  42. <LinearLayout
  43. android:id="@+id/layout_angle"
  44. android:layout_width="0dip"
  45. android:layout_height="wrap_content"
  46. android:layout_weight="1"
  47. android:gravity="left"
  48. android:orientation="horizontal" >
  49. </LinearLayout>
  50. </LinearLayout>
  51. </FrameLayout>
  52. <LinearLayout
  53. android:layout_width="fill_parent"
  54. android:layout_height="0dip"
  55. android:layout_weight="1"
  56. android:orientation="vertical" >
  57. <FrameLayout
  58. android:layout_width="fill_parent"
  59. android:layout_height="wrap_content"
  60. android:layout_gravity="center" >
  61. <ImageView
  62. android:layout_width="wrap_content"
  63. android:layout_height="wrap_content"
  64. android:layout_gravity="center"
  65. android:src="@drawable/background_compass" />
  66. <net.micode.compass.CompassView
  67. android:id="@+id/compass_pointer"
  68. android:layout_width="wrap_content"
  69. android:layout_height="wrap_content"
  70. android:layout_gravity="center"
  71. android:src="@drawable/compass" />
  72. <ImageView
  73. android:layout_width="wrap_content"
  74. android:layout_height="wrap_content"
  75. android:layout_gravity="center"
  76. android:src="@drawable/miui_cover" />
  77. </FrameLayout>
  78. </LinearLayout>
  79. </LinearLayout>
  80. <FrameLayout
  81. android:id="@+id/location_layout"
  82. android:layout_width="fill_parent"
  83. android:layout_height="wrap_content" >
  84. <LinearLayout
  85. android:layout_width="fill_parent"
  86. android:layout_height="wrap_content"
  87. android:background="@drawable/background_bottom"
  88. android:orientation="vertical" >
  89. </LinearLayout>
  90. <TextView
  91. android:id="@+id/textview_location"
  92. android:layout_width="wrap_content"
  93. android:layout_height="wrap_content"
  94. android:layout_gravity="center"
  95. android:text="@string/getting_location"
  96. android:textAppearance="?android:attr/textAppearanceMedium"
  97. android:textColor="#7FFFFFFF" />
  98. </FrameLayout>
  99. </LinearLayout>
  100. </FrameLayout>
  101. </FrameLayout>

这其中用到了一个自定义view,其实就是中间那个可以旋转的指南针,我们也来看看它的代码(CompassView.java):

[java] view plaincopy

  1. /**
  2. * 自定义一个View继承ImageView,增加一个通用的旋转图片资源的方法
  3. *
  4. * @author way
  5. *
  6. */
  7. public class CompassView extends ImageView {
  8. private float mDirection;// 方向旋转浮点数
  9. private Drawable compass;// 图片资源
  10. //三个构造器
  11. public CompassView(Context context) {
  12. super(context);
  13. mDirection = 0.0f;// 默认不旋转
  14. compass = null;
  15. }
  16. public CompassView(Context context, AttributeSet attrs) {
  17. super(context, attrs);
  18. mDirection = 0.0f;
  19. compass = null;
  20. }
  21. public CompassView(Context context, AttributeSet attrs, int defStyle) {
  22. super(context, attrs, defStyle);
  23. mDirection = 0.0f;
  24. compass = null;
  25. }
  26. @Override
  27. protected void onDraw(Canvas canvas) {
  28. if (compass == null) {
  29. compass = getDrawable();// 获取当前view的图片资源
  30. compass.setBounds(0, 0, getWidth(), getHeight());// 图片资源在view的位置,此处相当于充满view
  31. }
  32. canvas.save();
  33. canvas.rotate(mDirection, getWidth() / 2, getHeight() / 2);// 绕图片中心点旋转,
  34. compass.draw(canvas);// 把旋转后的图片画在view上,即保持旋转后的样子
  35. canvas.restore();// 保存一下
  36. }
  37. /**
  38. * 自定义更新方向的方法
  39. *
  40. * @param direction
  41. *            传入的方向
  42. */
  43. public void updateDirection(float direction) {
  44. mDirection = direction;
  45. invalidate();// 重新刷新一下,更新方向
  46. }
  47. }

接下来就只剩下一个Activity了,其实总体结构还是很简单的,CompassActivity.java:

[java] view plaincopy

  1. /**
  2. * MainActivity
  3. *
  4. * @author way
  5. *
  6. */
  7. public class CompassActivity extends Activity {
  8. private static final int EXIT_TIME = 2000;// 两次按返回键的间隔判断
  9. private final float MAX_ROATE_DEGREE = 1.0f;// 最多旋转一周,即360°
  10. private SensorManager mSensorManager;// 传感器管理对象
  11. private Sensor mOrientationSensor;// 传感器对象
  12. private LocationManager mLocationManager;// 位置管理对象
  13. private String mLocationProvider;// 位置提供者名称,GPS设备还是网络
  14. private float mDirection;// 当前浮点方向
  15. private float mTargetDirection;// 目标浮点方向
  16. private AccelerateInterpolator mInterpolator;// 动画从开始到结束,变化率是一个加速的过程,就是一个动画速率
  17. protected final Handler mHandler = new Handler();
  18. private boolean mStopDrawing;// 是否停止指南针旋转的标志位
  19. private boolean mChinease;// 系统当前是否使用中文
  20. private long firstExitTime = 0L;// 用来保存第一次按返回键的时间
  21. View mCompassView;
  22. CompassView mPointer;// 指南针view
  23. TextView mLocationTextView;// 显示位置的view
  24. LinearLayout mDirectionLayout;// 显示方向(东南西北)的view
  25. LinearLayout mAngleLayout;// 显示方向度数的view
  26. // 这个是更新指南针旋转的线程,handler的灵活使用,每20毫秒检测方向变化值,对应更新指南针旋转
  27. protected Runnable mCompassViewUpdater = new Runnable() {
  28. @Override
  29. public void run() {
  30. if (mPointer != null && !mStopDrawing) {
  31. if (mDirection != mTargetDirection) {
  32. // calculate the short routine
  33. float to = mTargetDirection;
  34. if (to - mDirection > 180) {
  35. to -= 360;
  36. } else if (to - mDirection < -180) {
  37. to += 360;
  38. }
  39. // limit the max speed to MAX_ROTATE_DEGREE
  40. float distance = to - mDirection;
  41. if (Math.abs(distance) > MAX_ROATE_DEGREE) {
  42. distance = distance > 0 ? MAX_ROATE_DEGREE
  43. : (-1.0f * MAX_ROATE_DEGREE);
  44. }
  45. // need to slow down if the distance is short
  46. mDirection = normalizeDegree(mDirection
  47. + ((to - mDirection) * mInterpolator
  48. .getInterpolation(Math.abs(distance) > MAX_ROATE_DEGREE ? 0.4f
  49. : 0.3f)));// 用了一个加速动画去旋转图片,很细致
  50. mPointer.updateDirection(mDirection);// 更新指南针旋转
  51. }
  52. updateDirection();// 更新方向值
  53. mHandler.postDelayed(mCompassViewUpdater, 20);// 20毫米后重新执行自己,比定时器好
  54. }
  55. }
  56. };
  57. @Override
  58. protected void onCreate(Bundle savedInstanceState) {
  59. super.onCreate(savedInstanceState);
  60. setContentView(R.layout.main);
  61. initResources();// 初始化view
  62. initServices();// 初始化传感器和位置服务
  63. }
  64. @Override
  65. public void onBackPressed() {// 覆盖返回键
  66. long curTime = System.currentTimeMillis();
  67. if (curTime - firstExitTime < EXIT_TIME) {// 两次按返回键的时间小于2秒就退出应用
  68. finish();
  69. } else {
  70. Toast.makeText(this, R.string.exit_toast, Toast.LENGTH_SHORT)
  71. .show();
  72. firstExitTime = curTime;
  73. }
  74. }
  75. @Override
  76. protected void onResume() {// 在恢复的生命周期里判断、启动位置更新服务和传感器服务
  77. super.onResume();
  78. if (mLocationProvider != null) {
  79. updateLocation(mLocationManager
  80. .getLastKnownLocation(mLocationProvider));
  81. mLocationManager.requestLocationUpdates(mLocationProvider, 2000,
  82. 10, mLocationListener);// 2秒或者距离变化10米时更新一次地理位置
  83. } else {
  84. mLocationTextView.setText(R.string.cannot_get_location);
  85. }
  86. if (mOrientationSensor != null) {
  87. mSensorManager.registerListener(mOrientationSensorEventListener,
  88. mOrientationSensor, SensorManager.SENSOR_DELAY_GAME);
  89. } else {
  90. Toast.makeText(this, R.string.cannot_get_sensor, Toast.LENGTH_SHORT)
  91. .show();
  92. }
  93. mStopDrawing = false;
  94. mHandler.postDelayed(mCompassViewUpdater, 20);// 20毫秒执行一次更新指南针图片旋转
  95. }
  96. @Override
  97. protected void onPause() {// 在暂停的生命周期里注销传感器服务和位置更新服务
  98. super.onPause();
  99. mStopDrawing = true;
  100. if (mOrientationSensor != null) {
  101. mSensorManager.unregisterListener(mOrientationSensorEventListener);
  102. }
  103. if (mLocationProvider != null) {
  104. mLocationManager.removeUpdates(mLocationListener);
  105. }
  106. }
  107. // 初始化view
  108. private void initResources() {
  109. mDirection = 0.0f;// 初始化起始方向
  110. mTargetDirection = 0.0f;// 初始化目标方向
  111. mInterpolator = new AccelerateInterpolator();// 实例化加速动画对象
  112. mStopDrawing = true;
  113. mChinease = TextUtils.equals(Locale.getDefault().getLanguage(), "zh");// 判断系统当前使用的语言是否为中文
  114. mCompassView = findViewById(R.id.view_compass);// 实际上是一个LinearLayout,装指南针ImageView和位置TextView
  115. mPointer = (CompassView) findViewById(R.id.compass_pointer);// 自定义的指南针view
  116. mLocationTextView = (TextView) findViewById(R.id.textview_location);// 显示位置信息的TextView
  117. mDirectionLayout = (LinearLayout) findViewById(R.id.layout_direction);// 顶部显示方向名称(东南西北)的LinearLayout
  118. mAngleLayout = (LinearLayout) findViewById(R.id.layout_angle);// 顶部显示方向具体度数的LinearLayout
  119. mPointer.setImageResource(mChinease ? R.drawable.compass_cn
  120. : R.drawable.compass);// 如果系统使用中文,就用中文的指南针图片
  121. }
  122. // 初始化传感器和位置服务
  123. private void initServices() {
  124. // sensor manager
  125. mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
  126. mOrientationSensor = mSensorManager
  127. .getDefaultSensor(Sensor.TYPE_ORIENTATION);
  128. // location manager
  129. mLocationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
  130. Criteria criteria = new Criteria();// 条件对象,即指定条件过滤获得LocationProvider
  131. criteria.setAccuracy(Criteria.ACCURACY_FINE);// 较高精度
  132. criteria.setAltitudeRequired(false);// 是否需要高度信息
  133. criteria.setBearingRequired(false);// 是否需要方向信息
  134. criteria.setCostAllowed(true);// 是否产生费用
  135. criteria.setPowerRequirement(Criteria.POWER_LOW);// 设置低电耗
  136. mLocationProvider = mLocationManager.getBestProvider(criteria, true);// 获取条件最好的Provider
  137. }
  138. // 更新顶部方向显示的方法
  139. private void updateDirection() {
  140. LayoutParams lp = new LayoutParams(LayoutParams.WRAP_CONTENT,
  141. LayoutParams.WRAP_CONTENT);
  142. // 先移除layout中所有的view
  143. mDirectionLayout.removeAllViews();
  144. mAngleLayout.removeAllViews();
  145. // 下面是根据mTargetDirection,作方向名称图片的处理
  146. ImageView east = null;
  147. ImageView west = null;
  148. ImageView south = null;
  149. ImageView north = null;
  150. float direction = normalizeDegree(mTargetDirection * -1.0f);
  151. if (direction > 22.5f && direction < 157.5f) {
  152. // east
  153. east = new ImageView(this);
  154. east.setImageResource(mChinease ? R.drawable.e_cn : R.drawable.e);
  155. east.setLayoutParams(lp);
  156. } else if (direction > 202.5f && direction < 337.5f) {
  157. // west
  158. west = new ImageView(this);
  159. west.setImageResource(mChinease ? R.drawable.w_cn : R.drawable.w);
  160. west.setLayoutParams(lp);
  161. }
  162. if (direction > 112.5f && direction < 247.5f) {
  163. // south
  164. south = new ImageView(this);
  165. south.setImageResource(mChinease ? R.drawable.s_cn : R.drawable.s);
  166. south.setLayoutParams(lp);
  167. } else if (direction < 67.5 || direction > 292.5f) {
  168. // north
  169. north = new ImageView(this);
  170. north.setImageResource(mChinease ? R.drawable.n_cn : R.drawable.n);
  171. north.setLayoutParams(lp);
  172. }
  173. // 下面是根据系统使用语言,更换对应的语言图片资源
  174. if (mChinease) {
  175. // east/west should be before north/south
  176. if (east != null) {
  177. mDirectionLayout.addView(east);
  178. }
  179. if (west != null) {
  180. mDirectionLayout.addView(west);
  181. }
  182. if (south != null) {
  183. mDirectionLayout.addView(south);
  184. }
  185. if (north != null) {
  186. mDirectionLayout.addView(north);
  187. }
  188. } else {
  189. // north/south should be before east/west
  190. if (south != null) {
  191. mDirectionLayout.addView(south);
  192. }
  193. if (north != null) {
  194. mDirectionLayout.addView(north);
  195. }
  196. if (east != null) {
  197. mDirectionLayout.addView(east);
  198. }
  199. if (west != null) {
  200. mDirectionLayout.addView(west);
  201. }
  202. }
  203. // 下面是根据方向度数显示度数图片数字
  204. int direction2 = (int) direction;
  205. boolean show = false;
  206. if (direction2 >= 100) {
  207. mAngleLayout.addView(getNumberImage(direction2 / 100));
  208. direction2 %= 100;
  209. show = true;
  210. }
  211. if (direction2 >= 10 || show) {
  212. mAngleLayout.addView(getNumberImage(direction2 / 10));
  213. direction2 %= 10;
  214. }
  215. mAngleLayout.addView(getNumberImage(direction2));
  216. // 下面是增加一个°的图片
  217. ImageView degreeImageView = new ImageView(this);
  218. degreeImageView.setImageResource(R.drawable.degree);
  219. degreeImageView.setLayoutParams(lp);
  220. mAngleLayout.addView(degreeImageView);
  221. }
  222. // 获取方向度数对应的图片,返回ImageView
  223. private ImageView getNumberImage(int number) {
  224. ImageView image = new ImageView(this);
  225. LayoutParams lp = new LayoutParams(LayoutParams.WRAP_CONTENT,
  226. LayoutParams.WRAP_CONTENT);
  227. switch (number) {
  228. case 0:
  229. image.setImageResource(R.drawable.number_0);
  230. break;
  231. case 1:
  232. image.setImageResource(R.drawable.number_1);
  233. break;
  234. case 2:
  235. image.setImageResource(R.drawable.number_2);
  236. break;
  237. case 3:
  238. image.setImageResource(R.drawable.number_3);
  239. break;
  240. case 4:
  241. image.setImageResource(R.drawable.number_4);
  242. break;
  243. case 5:
  244. image.setImageResource(R.drawable.number_5);
  245. break;
  246. case 6:
  247. image.setImageResource(R.drawable.number_6);
  248. break;
  249. case 7:
  250. image.setImageResource(R.drawable.number_7);
  251. break;
  252. case 8:
  253. image.setImageResource(R.drawable.number_8);
  254. break;
  255. case 9:
  256. image.setImageResource(R.drawable.number_9);
  257. break;
  258. }
  259. image.setLayoutParams(lp);
  260. return image;
  261. }
  262. // 更新位置显示
  263. private void updateLocation(Location location) {
  264. if (location == null) {
  265. mLocationTextView.setText(R.string.getting_location);
  266. } else {
  267. StringBuilder sb = new StringBuilder();
  268. double latitude = location.getLatitude();
  269. double longitude = location.getLongitude();
  270. if (latitude >= 0.0f) {
  271. sb.append(getString(R.string.location_north,
  272. getLocationString(latitude)));
  273. } else {
  274. sb.append(getString(R.string.location_south,
  275. getLocationString(-1.0 * latitude)));
  276. }
  277. sb.append("    ");
  278. if (longitude >= 0.0f) {
  279. sb.append(getString(R.string.location_east,
  280. getLocationString(longitude)));
  281. } else {
  282. sb.append(getString(R.string.location_west,
  283. getLocationString(-1.0 * longitude)));
  284. }
  285. mLocationTextView.setText(sb.toString());// 显示经纬度,其实还可以作反向编译,显示具体地址
  286. }
  287. }
  288. // 把经纬度转换成度分秒显示
  289. private String getLocationString(double input) {
  290. int du = (int) input;
  291. int fen = (((int) ((input - du) * 3600))) / 60;
  292. int miao = (((int) ((input - du) * 3600))) % 60;
  293. return String.valueOf(du) + "°" + String.valueOf(fen) + "′"
  294. + String.valueOf(miao) + "″";
  295. }
  296. // 方向传感器变化监听
  297. private SensorEventListener mOrientationSensorEventListener = new SensorEventListener() {
  298. @Override
  299. public void onSensorChanged(SensorEvent event) {
  300. float direction = event.values[0] * -1.0f;
  301. mTargetDirection = normalizeDegree(direction);// 赋值给全局变量,让指南针旋转
  302. }
  303. @Override
  304. public void onAccuracyChanged(Sensor sensor, int accuracy) {
  305. }
  306. };
  307. // 调整方向传感器获取的值
  308. private float normalizeDegree(float degree) {
  309. return (degree + 720) % 360;
  310. }
  311. // 位置信息更新监听
  312. LocationListener mLocationListener = new LocationListener() {
  313. @Override
  314. public void onStatusChanged(String provider, int status, Bundle extras) {
  315. if (status != LocationProvider.OUT_OF_SERVICE) {
  316. updateLocation(mLocationManager
  317. .getLastKnownLocation(mLocationProvider));
  318. } else {
  319. mLocationTextView.setText(R.string.cannot_get_location);
  320. }
  321. }
  322. @Override
  323. public void onProviderEnabled(String provider) {
  324. }
  325. @Override
  326. public void onProviderDisabled(String provider) {
  327. }
  328. @Override
  329. public void onLocationChanged(Location location) {
  330. updateLocation(location);// 更新位置
  331. }
  332. };
  333. }

好了,核心代码就这些了,其实思路还是很简单,最后,感谢各位看到文章最后,祝愿各位程序猿们好好学习,天天向上!

时间: 2024-10-13 23:55:57

Android之指南针(电子罗盘)学习的相关文章

万树IT:Android软件开发必学习的0基础内容

如今安卓系统中国的前景市场是非常广阔的,它主要针对的是移动设备市场,而如今智能手机已经占据人们生活不能缺少的一部分.所以,很多行业投入到安卓软件开发,进入到安卓开发的人才也越来越多. 安卓应用软件开发必学习的5大基础内容: 1.编程语言 2.基础应用开发 3.核心组件开发Android论坛交流 4丶安卓论坛交流学习 5.深入开发 Android软件开发必学习的0基础内容 1.编程语言的学习 安卓应用软件开发中有很多的编程语言可以使用,所以应该重点学习以下几种编程语言. ①  C/C++语言.  

Android Window PhoneWindow Activity学习心得--第三弹

Android Window  PhoneWindow Activity学习心得--第三弹 前面 我们完成了从Activity到PhoneWindow的整体跨度 正如我们所知道的与Activity组件关联的一个应用程序窗口视图对象关联一个ViewRoot对象,而将 一个Activity组件的应用程序窗口视图对象与一个ViewRoot对象关联是通过该Activity组件所使用的 窗口管理器(WindowManager)来执行的. 在我们初始化DecorView完成之后,我们需要关联应用程序窗口视图

Android系统源码学习步骤

Android系统是基于Linux内核来开发的,在分析它在运行时库层的源代码时,我们会经常碰到诸如管道(pipe).套接字(socket)和虚拟文件系统(VFS)等知识. 此外,Android系统还在Linux内核中增加了一些专用的驱动程序,例如用于日志系统的Logger驱动程序.用于进程间通信的Binder驱动程序和用于辅助内存管理的匿名共享内存Ashmem驱动程序.在分析这些Android专用驱动程序的时候,也会碰到Linux内核中与进程.内存管理相关的数据结构. 因此,我们有必要掌握一些L

针对Android平台我们需要学习如何在Unity中调用Android的JAVA代码。

Unity for Android 比较特殊,Unity for IOS 打包是将XCODE工程直接交给开发者,开发者可以在工程的基础上继续添加新的视图,最后由开发者自行打包生成IPA包,发布程序.而Unity for Android打包直接生成APK包,等于说源代码开发者是看不到的,但是Unity的自身确实有些局限,针对Android平台我们需要学习如何在Unity中调用Android的JAVA代码.本章我们的目标是使用Unity的脚本打开Activity.首先我们创建一个普通的Android

C#程序员学习Android开发系列之学习路线图

通过前面的3篇博客已经简单的介绍了Android开发的过程并写了一个简单的demo,了解了Android开发的环境以及一些背景知识. 接下来这篇博客不打算继续学习Android开发的细节,先停一下,明确一下接下来的学习目标以及学习路线. 一.对Android开发的基本认识 1.Android原生开发是基于Java语言的,由于我比较擅长C#,所以对Java语言本身不太熟练,需要加强Java语言基础的练习,这一块我会穿插到具体的知识点练习当中,并且在必要的地方给出与C#语言的对比(其实基本上在语法层

quick cocos 或者 Cocos2dx 项目下的Android.mk文件的学习

android.mk文件的作用:编译需要的cpp文件,生成.so动态库,供android端调用. 先上一个android.mk文件: 第一次创建项目,在Android平台编译时,都需要通过android.mk文件编译整个cocos2dx的库(第一次编译我们需要等待很长的时间.....). 首先知道$(call import-module,dir_name)的作用,然后顺着lib/proj.android目录继续找对应目录下的android.mk文件 类似于递归一样,把所有目录下的android.

Android 上能提高学习工作效率的应用

在知乎上有朋友问 Android 上能提高学习.工作效率的应用有哪些?我给他们的推荐获得了最多赞同.以后会不断完善更新此贴. Any.do :规划日程,各平台都有. Evernote:记笔记,各平台都有. OneNote:这个也不错,特别是文档功能很强大,微软有Office基因啊,但同步有点慢... Quora:问答SNS网站客户端 ,看问题学英语感觉不错 Pocket:稍候阅读软件,各平台都有,chrome有插件,自定义快捷键chrome上快速保存文章,Android上各App都可以分享到Pl

android金阳光自动化测试——学习历程:电池续航上&amp;&amp;下

章节:自动化基础篇——电池续航自动化测试上&&下 网易云课堂: http://study.163.com/course/courseLearn.htm?courseId=712011#/learn/video?lessonId=878098&courseId=712011 http://study.163.com/course/courseLearn.htm?courseId=712011#/learn/video?lessonId=878099&courseId=7120

Android开发手册 安卓学习教程手册(MtAndroid开发手册)

发布本资料须遵守开放出版许可协议 1.0 或者更新版本. 未经版权所有者明确授权,禁止发行本文档及其被实质上修改的版本. 未经版权所有者事先授权,禁止将此作品及其衍生作品以标准(纸质)书籍形式发行. 如果有兴趣再发行或再版本手册的全部或部分内容,不论修改过与否,或者有任何问题,请联系版权所有者 [email protected]. Android开发者必备学习手册,基础和进阶手册. (MtAndroid开发手册) Android开发手册 安卓学习教程手册(MtAndroid开发手册),布布扣,b

android的简单入门学习

话说光配环境就整死我了, 不是说多么难, 是最近google被屏了, 很多sdk里面需要下载的东西都下不下来, 坑爹啊.  最后跟扫拉稀要了一个他配置好的,才运行了. android目录分析: assets 资产目录,存放文件,这些文件会被打包到应用程序的apk(安装包) bin 编译后的文件目录 gen 目录自动生成的目录 project.properties 代表编译的版本 target = "" 来修改编译版本 libs 支持jar包 会被添加到android depend 目录