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. }

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

Android之指南针学习相关推荐

  1. 基于 Android NDK 的学习之旅-----资源释放

    基于 Android NDK 的学习之旅-----资源释放 做上一个项目的时候因为与C引擎交互频繁,有时候会突然莫名其妙的的整个应用程序直接挂掉.因为我是学Java 开始的,所以对主动释放内存没多大概 ...

  2. 基于 Android NDK 的学习之旅----- C调用Java

    2019独角兽企业重金招聘Python工程师标准>>> 基于 Android NDK 的学习之旅----- C调用Java 许多成熟的C引擎要移植到Android 平台上使用 , 一 ...

  3. 基于 Android NDK 的学习之旅-----数据传输二(引用数据类型)(附源码)

    基于 Android NDK 的学习之旅-----数据传输(引用数据类型) 接着上篇文章继续讲.主要关于引用类型的数据传输,本文将介绍字符串传输和自定义对象的传输. 1.主要流程 1.  String ...

  4. 【转】基于 Android NDK 的学习之旅-----数据传输(引用数据类型)

    原文网址:http://www.cnblogs.com/luxiaofeng54/archive/2011/08/20/2147086.html 基于 Android NDK 的学习之旅-----数据 ...

  5. 基于android的交流平台,基于Android的移动学习交流平台的设计与实现

    摘要: 随着移动互联网技术的不断发展,智能手机的不断普及,现在越来越多的人通过手机等智能设备来进行学习和交流.为了满足教师和学生实时的沟通交流,提高学生的学习兴趣和效率,本文设计了基于Android的 ...

  6. Android基础知识学习

    一.Android编译过程 初始化参数设置 检查环境变量与目标环境 选择lunch并读取目标配置和平台信息 清空输出目录 编译 生成升级包 二. ./build/envsetup.sh分析 加载编译命 ...

  7. 基于 Android NDK 的学习之旅-----Java 调用C(附源码)

    基于 Android NDK 的学习之旅-----Java 调用C 随便谈谈为什么要Java调用C 吧: 我认为: 1.  有些公司开发Android项目的时候, 许多组件功能可能是C中已经实现了,所 ...

  8. Android 渗透测试学习手册 翻译完成!

    Android 渗透测试学习手册 中文版 原书:Learning Pentesting for Android Devices 译者:飞龙 在线阅读 PDF格式 EPUB格式 MOBI格式 代码仓库 ...

  9. android自定义View学习(一)----创建一个视图类

    创建一个视图类 精心设计的自定义视图与其他精心设计的类非常相似.它使用易于使用的界面封装了一组特定的功能,它可以高效地使用CPU和内存,等等.不过,作为一个设计良好的班级,自定义视图应该: 符合And ...

最新文章

  1. 继承WebMvcConfigurer 和 WebMvcConfigurerAdapter类依然CORS报错? springboot 两种方式稳定解决跨域问题
  2. DFT泄露问题和DFT的频率轴表示方法(第三章离散傅里叶变换(3.8,3.13.4)学习笔记)
  3. 如何将Git上的项目克隆到idea中
  4. Erlang程序设计
  5. leetcode刷题可以用python吗_LeetCode刷题——第四天(python)
  6. 循环队列(java)
  7. 【转】snmpwalk命令常用方法
  8. 关于更新内容次序问题
  9. ArcGIS 城市生活区用地适宜性评价(一)
  10. php 命令显示扩展信息
  11. linux web部署命令简单记录
  12. Froala Editor 2.8.1破解过程
  13. open3d 0.13的c++版本使用demo
  14. VR产品为什么没有火起来
  15. 基于FPGA的电子计算器设计(下)
  16. 2022.11.27 第10次周报
  17. HGOI 20190821 慈溪一中互测
  18. 【LeetCode】971. Flip Binary Tree To Match Preorder Traversal
  19. python语言是 创造的_慢步python,如何用python语言创造出一个真正的独立exe程序?...
  20. matlab如何去除图像白边_MATLAB去除白边

热门文章

  1. 如何用postman访问必须登录的接口
  2. 非主流Linux窗口管理器集锦
  3. 胜为蓝牙适配器驱动_胜为udc 324b蓝牙驱动程序
  4. JavaScript对url编码解码
  5. SAP 理解物料分类账
  6. pig基本语法——cross
  7. 智能机井控制器的优点以及应用领域
  8. Linux的scp命令远程传输文件
  9. django框架(1)
  10. vue+element+qrcode 生成二维码