您的位置:首页 > 移动开发 > Android开发

在Android 2.3状态栏中添加menu,home和back快捷键的方法

2011-04-01 16:46 561 查看
在Android 2.3状态栏中添加menu,home和back快捷键的方法

1、准备资源,修改XML文
准备几张图,这里我们准备添加home back和menu图标,就需要准备6张图,三张普通状态,三张按下的高亮状态图标:
stat_home.png
stat_home_pressed.png
stat_back.png
stat_back_pressed.png
stat_menu.png
stat_menu_pressed.png
把它们放在frameworks/base/packages/SystemUI/res/drawable/目录下
同时,在frameworks/base/packages/SystemUI/res/drawable 下创建三个imageButton的xml文件
xml_stat_home.xml

[align=left]1. <?xml version="1.0" encoding="utf-8"?> [/align]
[align=left]2. <selector [/align]
[align=left]3. xmlns:android="http://schemas.android.com/apk/res/android"> [/align]
[align=left]4. <item [/align]
[align=left]5. android:state_focused="true" [/align]
[align=left]6. android:state_pressed="false" [/align]
[align=left]7. android:drawable="@drawable/stat_home" /> [/align]
[align=left]8. <item [/align]
[align=left]9. android:state_focused="true" [/align]
[align=left]10. android:state_pressed="true" [/align]
[align=left]11. android:drawable="@drawable/stat_home_pressed" /> [/align]
[align=left]12. <item [/align]
[align=left]13. android:state_focused="false" [/align]
[align=left]14. android:state_pressed="true" [/align]
[align=left]15. android:drawable="@drawable/stat_home_pressed" /> [/align]
[align=left]16. <item [/align]
[align=left]17. android:drawable="@drawable/stat_home" /> [/align]
[align=left]18. </selector> [/align]

xml_stat_back.xml

[align=left]1. <?xml version="1.0" encoding="utf-8"?> [/align]
[align=left]2. <selector [/align]
[align=left]3. xmlns:android="http://schemas.android.com/apk/res/android"> [/align]
[align=left]4. <item [/align]
[align=left]5. android:state_focused="true" [/align]
[align=left]6. android:state_pressed="false" [/align]
[align=left]7. android:drawable="@drawable/stat_back" /> [/align]
[align=left]8. <item [/align]
[align=left]9. android:state_focused="true" [/align]
[align=left]10. android:state_pressed="true" [/align]
[align=left]11. android:drawable="@drawable/stat_back_pressed" /> [/align]
[align=left]12. <item [/align]
[align=left]13. android:state_focused="false" [/align]
[align=left]14. android:state_pressed="true" [/align]
[align=left]15. android:drawable="@drawable/stat_back_pressed" /> [/align]
[align=left]16. <item [/align]
[align=left]17. android:drawable="@drawable/stat_back" /> [/align]
[align=left]18. </selector> [/align]

xml_stat_menu.xml

[align=left]1. <?xml version="1.0" encoding="utf-8"?> [/align]
[align=left]2. <selector [/align]
[align=left]3. xmlns:android="http://schemas.android.com/apk/res/android"> [/align]
[align=left]4. <item [/align]
[align=left]5. android:state_focused="true" [/align]
[align=left]6. android:state_pressed="false" [/align]
[align=left]7. android:drawable="@drawable/stat_menu" /> [/align]
[align=left]8. <item [/align]
[align=left]9. android:state_focused="true" [/align]
[align=left]10. android:state_pressed="true" [/align]
[align=left]11. android:drawable="@drawable/stat_menu_pressed" /> [/align]
[align=left]12. <item [/align]
[align=left]13. android:state_focused="false" [/align]
[align=left]14. android:state_pressed="true" [/align]
[align=left]15. android:drawable="@drawable/stat_menu_pressed" /> [/align]
[align=left]16. <item [/align]
[align=left]17. android:drawable="@drawable/stat_menu" /> [/align]
[align=left]18. </selector> [/align]

修改status_bar.xml成如下
目录:frameworks/base/packages/SystemUI/res/layout/status_bar.xml

[align=left]1. <?xml version="1.0" encoding="utf-8"?>[/align]
[align=left]2. <!--[/align]
[align=left]3. /* apps/common/assets/default/default/skins/StatusBar.xml[/align]
[align=left]4. **[/align]
[align=left]5. ** Copyright 2006, The Android Open Source Project[/align]
[align=left]6. **[/align]
[align=left]7. ** Licensed under the Apache License, Version 2.0 (the "License"); [/align]
[align=left]8. ** you may not use this file except in compliance with the License. [/align]
[align=left]9. ** You may obtain a copy of the License at [/align]
[align=left]10. **[/align]
[align=left]11. ** http://www.apache.org/licenses/LICENSE-2.0 [/align]
[align=left]12. **[/align]
[align=left]13. ** Unless required by applicable law or agreed to in writing, software [/align]
[align=left]14. ** distributed under the License is distributed on an "AS IS" BASIS, [/align]
[align=left]15. ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. [/align]
[align=left]16. ** See the License for the specific language governing permissions and [/align]
[align=left]17. ** limitations under the License.[/align]
[align=left]18. */[/align]
[align=left]19. -->[/align]
[align=left]20. [/align]
[align=left]21. <!-- android:background="@drawable/status_bar_closed_default_background" -->[/align]
[align=left]22. <com.android.systemui.statusbar.StatusBarView[/align]
[align=left]23. xmlns:android="http://schemas.android.com/apk/res/android"[/align]
[align=left]24. android:background="@drawable/statusbar_background"[/align]
[align=left]25. android:orientation="vertical"[/align]
[align=left]26. android:focusable="true"[/align]
[align=left]27. android:descendantFocusability="afterDescendants"[/align]
[align=left]28. >[/align]
[align=left]29. [/align]
[align=left]30. <LinearLayout android:id="@+id/icons"[/align]
[align=left]31. android:layout_width="match_parent"[/align]
[align=left]32. android:layout_height="match_parent"[/align]
[align=left]33. android:orientation="horizontal"> [/align]
[align=left]34. <com.android.systemui.statusbar.IconMerger android:id="@+id/notificationIcons"[/align]
[align=left]35. android:layout_width="0dip"[/align]
[align=left]36. android:layout_weight="1"[/align]
[align=left]37. android:layout_height="match_parent"[/align]
[align=left]38. android:layout_alignParentLeft="true"[/align]
[align=left]39. android:paddingLeft="6dip"[/align]
[align=left]40. android:gravity="center_vertical"[/align]
[align=left]41. android:orientation="horizontal"/> [/align]
[align=left]42. [/align]
[align=left]43. <LinearLayout android:id="@+id/statusIcons"[/align]
[align=left]44. android:layout_width="wrap_content"[/align]
[align=left]45. android:layout_height="match_parent"[/align]
[align=left]46. android:layout_alignParentRight="true"[/align]
[align=left]47. android:paddingRight="6dip"[/align]
[align=left]48. android:gravity="center_vertical"[/align]
[align=left]49. android:orientation="horizontal"/> [/align]
[align=left]50. <ImageButton android:id="@+id/go_home" [/align]
[align=left]51. android:layout_width="32px" [/align]
[align=left]52. android:layout_height="32px" [/align]
[align=left]53. android:layout_alignParentLeft="true"[/align]
[align=left]54. android:paddingLeft="10dip"[/align]
[align=left]55. android:paddingTop="10dip"[/align]
[align=left]56. android:gravity="center_vertical"[/align]
[align=left]57. android:clickable="true" [/align]
[align=left]58. android:background="@drawable/xml_stat_home" [/align]
[align=left]59. /> [/align]
[align=left]60. <ImageButton android:id="@+id/pop_menu" [/align]
[align=left]61. android:layout_width="32px" [/align]
[align=left]62. android:layout_height="32px" [/align]
[align=left]63. android:layout_alignParentRight="true"[/align]
[align=left]64. android:paddingLeft="10dip"[/align]
[align=left]65. android:paddingTop="10dip"[/align]
[align=left]66. android:gravity="center_vertical"[/align]
[align=left]67. android:orientation="horizontal" [/align]
[align=left]68. android:clickable="true" [/align]
[align=left]69. android:background="@drawable/xml_stat_menu" [/align]
[align=left]70. /> [/align]
[align=left]71. <ImageButton android:id="@+id/go_back" [/align]
[align=left]72. android:layout_width="32px" [/align]
[align=left]73. android:layout_height="32px" [/align]
[align=left]74. android:layout_alignParentRight="true"[/align]
[align=left]75. android:paddingLeft="10dip"[/align]
[align=left]76. android:paddingTop="10dip"[/align]
[align=left]77. android:gravity="center_vertical"[/align]
[align=left]78. android:orientation="horizontal" [/align]
[align=left]79. android:clickable="true" [/align]
[align=left]80. android:background="@drawable/xml_stat_back" [/align]
[align=left]81. /> [/align]
[align=left]82. <com.android.systemui.statusbar.Clock[/align]
[align=left]83. android:textAppearance="@*android:style/TextAppearance.StatusBar.Icon"[/align]
[align=left]84. android:layout_width="wrap_content"[/align]
[align=left]85. android:layout_height="match_parent"[/align]
[align=left]86. android:singleLine="true"[/align]
[align=left]87. android:paddingRight="6dip"[/align]
[align=left]88. android:gravity="center_vertical|left"[/align]
[align=left]89. />[/align]
[align=left]90. </LinearLayout>[/align]
[align=left]91. [/align]
[align=left]92. <LinearLayout android:id="@+id/ticker"[/align]
[align=left]93. android:layout_width="match_parent"[/align]
[align=left]94. android:layout_height="match_parent"[/align]
[align=left]95. android:paddingLeft="6dip"[/align]
[align=left]96. android:animationCache="false"[/align]
[align=left]97. android:orientation="horizontal" >[/align]
[align=left]98. <ImageSwitcher android:id="@+id/tickerIcon"[/align]
[align=left]99. android:layout_width="wrap_content"[/align]
[align=left]100. android:layout_height="match_parent"[/align]
[align=left]101. android:layout_marginRight="8dip"[/align]
[align=left]102. >[/align]
[align=left]103. <com.android.systemui.statusbar.AnimatedImageView[/align]
[align=left]104. android:layout_width="25dip"[/align]
[align=left]105. android:layout_height="25dip"[/align]
[align=left]106. />[/align]
[align=left]107. <com.android.systemui.statusbar.AnimatedImageView[/align]
[align=left]108. android:layout_width="25dip"[/align]
[align=left]109. android:layout_height="25dip"[/align]
[align=left]110. />[/align]
[align=left]111. </ImageSwitcher>[/align]
[align=left]112. <com.android.systemui.statusbar.TickerView android:id="@+id/tickerText"[/align]
[align=left]113. android:layout_width="0dip"[/align]
[align=left]114. android:layout_weight="1"[/align]
[align=left]115. android:layout_height="wrap_content"[/align]
[align=left]116. android:paddingTop="2dip"[/align]
[align=left]117. android:paddingRight="10dip">[/align]
[align=left]118. <TextView[/align]
[align=left]119. android:textAppearance="@*android:style/TextAppearance.StatusBar.Ticker"[/align]
[align=left]120. android:layout_width="match_parent"[/align]
[align=left]121. android:layout_height="wrap_content"[/align]
[align=left]122. android:singleLine="true"[/align]
[align=left]123. />[/align]
[align=left]124. <TextView[/align]
[align=left]125. android:textAppearance="@*android:style/TextAppearance.StatusBar.Ticker"[/align]
[align=left]126. android:layout_width="match_parent"[/align]
[align=left]127. android:layout_height="wrap_content"[/align]
[align=left]128. android:singleLine="true"[/align]
[align=left]129. />[/align]
[align=left]130. </com.android.systemui.statusbar.TickerView>[/align]
[align=left]131. </LinearLayout>[/align]
[align=left]132. [/align]
[align=left]133. <com.android.systemui.statusbar.DateView android:id="@+id/date"[/align]
[align=left]134. android:textAppearance="@*android:style/TextAppearance.StatusBar.Icon"[/align]
[align=left]135. android:layout_width="wrap_content"[/align]
[align=left]136. android:layout_height="match_parent"[/align]
[align=left]137. android:singleLine="true"[/align]
[align=left]138. android:gravity="center_vertical|left"[/align]
[align=left]139. android:paddingLeft="6px"[/align]
[align=left]140. android:paddingRight="6px"[/align]
[align=left]141. android:background="@drawable/statusbar_background"[/align]
[align=left]142. />[/align]
[align=left]143. </com.android.systemui.statusbar.StatusBarView> [/align]

二 为按钮添加动态效果
修改frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarView.java
在类中新增加四个成员(须导入android.widget.ImageButton和android.content.Context):

[align=left]1. ImageButton mHomeBtn; [/align]
[align=left]2. ImageButton mBackBtn; [/align]
[align=left]3. ImageButton mMenuBtn; [/align]
[align=left]4. final Context mContext;[/align]

增加三个常量:(须导入android.view.KeyEvent;)
public static final int RESV_KEY_HOME = KeyEvent.KEYCODE_HOME;
public static final int RESV_KEY_BACK = KeyEvent.KEYCODE_BACK;
public static final int RESV_KEY_MENU = KeyEvent.KEYCODE_MENU;;
在构造函数StatusBarView中初始化mContext

[align=left]1. public StatusBarView(Context context, AttributeSet attrs) { [/align]
[align=left]2. super(context, attrs);[/align]
[align=left]3. mContext=context;[/align]
[align=left]4. } [/align]

注意”mContext=context;”须在”super(context, attrs);”后面,不然编译会报错
在onFinishInflate中,获取几个button 的handler,并设置touch事件,添加如下代码:

[align=left]1. mHomeBtn = (ImageButton)findViewById(R.id.go_home); [/align]
[align=left]2. mBackBtn = (ImageButton)findViewById(R.id.go_back); [/align]
[align=left]3. mMenuBtn = (ImageButton)findViewById(R.id.pop_menu); [/align]
[align=left]4. [/align]
[align=left]5. mHomeBtn.setOnTouchListener(homeOnTouch); [/align]
[align=left]6. mBackBtn.setOnTouchListener(backOnTouch); [/align]
[align=left]7. mMenuBtn.setOnTouchListener(menuOnTouch); [/align]

各button的touch事件添加如下:

[align=left]1. voidsendIntent(Intentintent) [/align]
[align=left]2. { [/align]
[align=left]3. mContext.sendBroadcast(intent); [/align]
[align=left]4. }[/align]
[align=left]5. private void sendKeyIntent(int keycode){ [/align]
[align=left]6. Intent intent = new Intent(Intent.ACTION_ICONKEY_CHANGED); [/align]
[align=left]7. intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY); [/align]
[align=left]8. intent.putExtra("keycode", keycode); [/align]
[align=left]9. sendIntent(intent); [/align]
[align=left]10. } [/align]
[align=left]11. [/align]
[align=left]12. private OnTouchListener homeOnTouch = new OnTouchListener(){ [/align]
[align=left]13. //@Override [/align]
[align=left]14. public boolean onTouch(View v, MotionEvent event) [/align]
[align=left]15. { [/align]
[align=left]16. // TODO Auto-generated method stub [/align]
[align=left]17. switch (event.getAction()) { [/align]
[align=left]18. case MotionEvent.ACTION_UP: [/align]
[align=left]19. { [/align]
[align=left]20. sendKeyIntent(RESV_KEY_HOME); [/align]
[align=left]21. } [/align]
[align=left]22. break; [/align]
[align=left]23. } [/align]
[align=left]24. return false; [/align]
[align=left]25. } [/align]
[align=left]26. }; [/align]
[align=left]27. [/align]
[align=left]28. private OnTouchListener backOnTouch = new OnTouchListener(){ [/align]
[align=left]29. //@Override [/align]
[align=left]30. public boolean onTouch(View v, MotionEvent event) [/align]
[align=left]31. { [/align]
[align=left]32. // TODO Auto-generated method stub [/align]
[align=left]33. switch (event.getAction()) { [/align]
[align=left]34. case MotionEvent.ACTION_UP: [/align]
[align=left]35. { [/align]
[align=left]36. sendKeyIntent(RESV_KEY_BACK); [/align]
[align=left]37. } [/align]
[align=left]38. break; [/align]
[align=left]39. } [/align]
[align=left]40. return false; [/align]
[align=left]41. } [/align]
[align=left]42. }; [/align]
[align=left]43. [/align]
[align=left]44. private OnTouchListener menuOnTouch = new OnTouchListener(){ [/align]
[align=left]45. //@Override [/align]
[align=left]46. public boolean onTouch(View v, MotionEvent event) [/align]
[align=left]47. { [/align]
[align=left]48. // TODO Auto-generated method stub [/align]
[align=left]49. switch (event.getAction()) { [/align]
[align=left]50. case MotionEvent.ACTION_UP: [/align]
[align=left]51. { [/align]
[align=left]52. sendKeyIntent(RESV_KEY_MENU); [/align]
[align=left]53. } [/align]
[align=left]54. break; [/align]
[align=left]55. } [/align]
[align=left]56. return false; [/align]
[align=left]57. } [/align]
[align=left]58. }; [/align]

为防止点击statusBar上的按钮, 触发标题栏的expend事件, 修改一下函数onInterceptTouchEvent,点击到不属于button区域时才允许解析Motion的event:

[align=left]1. public boolean onInterceptTouchEvent(MotionEvent event) { [/align]
[align=left]2. if( (event.getX() > mHomeBtn.getRight()) [/align]
[align=left]3. && (event.getX() < mMenuBtn.getLeft())){ [/align]
[align=left]4. return mService.interceptTouchEvent(event) [/align]
[align=left]5. ? true : super.onInterceptTouchEvent(event); [/align]
[align=left]6. } [/align]
[align=left]7. return false; [/align]
[align=left]8. //return mService.interceptTouchEvent(event) [/align]
[align=left]9. // ? true : super.onInterceptTouchEvent(event); [/align]
[align=left]10. } [/align]
[align=left]11. } [/align]

需要自己添加Intent
打开frameworks/base/core/java/android/content/Intent.java,增加下面的内容,由于我们的使用的API不公开,须加上/**@hide*/,不然编译会报错

1. /**
[align=left]2. * @hide[/align]
[align=left]3. */ [/align]
[align=left]4. public static final String ACTION_ICONKEY_CHANGED ="android.intent.action.ICONKEY_CHANGED";[/align]
[align=left]5. [/align]

接收并处理intent
修改StatusBarPolicy.java
目录:frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarPolicy.java
首先在构造函数中加入Intent的filter,注册号这个intent的receiver。
filter.addAction(Intent.ACTION_ICONKEY_CHANGED);
接着在private BroadcastReceiver mIntentReceiver = new BroadcastReceiver() 加入Intent的receiver动作;

[align=left]1. else if (action.equals(Intent.ACTION_ICONKEY_CHANGED)) { [/align]
[align=left]2. Log.d(TAG, "Received ACTION_ICONKEY_CHANGED"); [/align]
[align=left]3. updateIconKeyAction(intent); [/align]
[align=left]4. } [/align]

及处理函数:
须导入以下包
import android.view.IWindowManager;
import android.os.SystemClock;
import android.view.KeyEvent;

[align=left]1. private final void updateIconKeyAction(Intent intent){ [/align]
[align=left]2. int keycode = intent.getIntExtra("keycode", -1); [/align]
[align=left]3. IWindowManager wm = IWindowManager.Stub.asInterface(ServiceManager.getService("window")); [/align]
[align=left]4. [/align]
[align=left]5. if(keycode != -1){ [/align]
[align=left]6. long now = SystemClock.uptimeMillis(); [/align]
[align=left]7. [/align]
[align=left]8. KeyEvent down = new KeyEvent(now, now, KeyEvent.ACTION_DOWN, keycode, 0); [/align]
[align=left]9. KeyEvent up = new KeyEvent(now, now, KeyEvent.ACTION_UP, keycode, 0); [/align]
[align=left]10. [/align]
[align=left]11. try { [/align]
[align=left]12. wm.injectKeyEvent(down, false); [/align]
[align=left]13. }catch (RemoteException e) { [/align]
[align=left]14. Log.i("Input", "DeadOjbectException"); [/align]
[align=left]15. } [/align]
[align=left]16. [/align]
[align=left]17. try{ [/align]
[align=left]18. wm.injectKeyEvent(up, false); [/align]
[align=left]19. }catch(RemoteException e) { [/align]
[align=left]20. Log.i("Input", "DeadOjbectException"); [/align]
[align=left]21. } [/align]
[align=left]22. } [/align]
[align=left]23. } [/align]

StatusBar通知栏屏蔽按钮
当拉出expand的通知栏时,按钮的响应非常慢,这时最好将按钮给屏蔽掉,我们在 statusBarView.java中增加两个方法:

[align=left]1. public void hiddenHotIcons(){ [/align]
[align=left]2. mHomeBtn.setVisibility(View.INVISIBLE); [/align]
[align=left]3. mBackBtn.setVisibility(View.INVISIBLE); [/align]
[align=left]4. mMenuBtn.setVisibility(View.INVISIBLE); [/align]
[align=left]5. } [/align]
[align=left]6. [/align]
[align=left]7. public void showHotIcons(){ [/align]
[align=left]8. mHomeBtn.setVisibility(View.VISIBLE); [/align]
[align=left]9. mBackBtn.setVisibility(View.VISIBLE); [/align]
[align=left]10. mMenuBtn.setVisibility(View.VISIBLE); [/align]
[align=left]11. }[/align]

拉出或收回通知栏中,就可以调用这个函数来显示或隐藏这几个按钮。
修改文件: statusBarService.java
目录:frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarService.java

[align=left]1. void performExpand() { [/align]
[align=left]2. if (SPEW) Slog.d(TAG, "performExpand: mExpanded=" + mExpanded); [/align]
[align=left]3. if ((mDisabled & StatusBarManager.DISABLE_EXPAND) != 0) { [/align]
[align=left]4. return ;[/align]
[align=left]5. }[/align]
[align=left]6. if (mExpanded) {[/align]
[align=left]7. return;[/align]
[align=left]8. } [/align]
[align=left]9. mExpanded = true;[/align]
[align=left]10. makeExpandedVisible();[/align]
[align=left]11. mStatusBarView.hiddenHotIcons();[/align]
[align=left]12. updateExpandedViewPos(EXPANDED_FULL_OPEN);[/align]
[align=left]13. if (false) postStartTracing();[/align]
[align=left]14. }[/align]
[align=left]15. void performCollapse() {[/align]
[align=left]16. if (SPEW) Slog.d(TAG, "performCollapse: mExpanded=" + mExpanded[/align]
[align=left]17. + " mExpandedVisible=" + mExpandedVisible[/align]
[align=left]18. + " mTicking=" + mTicking);[/align]
[align=left]19. [/align]
[align=left]20. if (!mExpandedVisible) {[/align]
[align=left]21. return;[/align]
[align=left]22. }[/align]
[align=left]23. mExpandedVisible = false;[/align]
[align=left]24. visibilityChanged(false);[/align]
[align=left]25. mExpandedParams.flags |= WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;[/align]
[align=left]26. mExpandedParams.flags &= ~WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM;[/align]
[align=left]27. mExpandedDialog.getWindow().setAttributes(mExpandedParams);[/align]
[align=left]28. mTrackingView.setVisibility(View.GONE);[/align]
[align=left]29. mExpandedView.setVisibility(View.GONE);[/align]
[align=left]30. [/align]
[align=left]31. mStatusBarView.showHotIcons();[/align]
[align=left]32. [/align]
[align=left]33. if ((mDisabled & StatusBarManager.DISABLE_NOTIFICATION_ICONS) == 0) {[/align]
[align=left]34. setNotificationIconVisibility(true, com.android.internal.R.anim.fade_in);[/align]
[align=left]35. }[/align]
[align=left]36. if (mDateView.getVisibility() == View.VISIBLE) {[/align]
[align=left]37. setDateViewVisibility(false, com.android.internal.R.anim.fade_out);[/align]
[align=left]38. }[/align]
[align=left]39. [/align]
[align=left]40. if (!mExpanded) {[/align]
[align=left]41. return;[/align]
[align=left]42. }[/align]
[align=left]43. mExpanded = false;[/align]
[align=left]44. }[/align]

编译工程
#source /opt/android_froyo_smdk/build/envsetup.sh
#export TARGET_PRODUCT=full_smdkv210
#mmm frameworks/base/
把编译生成的相关文件放进SD卡对应的目录即可, 在伟研科技 WY-S5PV210开发板上的效果如下图



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐