http://blog.csdn.net/android_jiangjun/article/details/39638129

现在基本上大多数的Android应用程序的首页都有轮播图,就是像下图这样的(此图为转载的一篇博文中的图,拿来直接用了):

像这样的组件我相信大多数的应用程序都会使用到,本文就是自定义一个这样的组件,可以动态设置图片的张数。下面就开始本次的自定义之旅吧,首先看一下自定义控件的的布局文件:

[html] view plaincopy
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent" >
  5. <android.support.v4.view.ViewPager
  6. android:id="@+id/viewPager"
  7. android:layout_width="match_parent"
  8. android:layout_height="match_parent" />
  9. <span style="white-space:pre">    </span><!--此LinearLayout用来小圆点-->
  10. <LinearLayout
  11. android:id="@+id/linearlayout"
  12. android:layout_width="match_parent"
  13. android:layout_height="wrap_content"
  14. android:layout_alignParentBottom="true"
  15. android:gravity="center"
  16. android:orientation="horizontal"
  17. android:padding="5dp" >
  18. </LinearLayout>
  19. </RelativeLayout>

布局文件看完之后,我们再来看一下自定义控件相对应的java类吧:
具体代码如下:

[java] view plaincopy
  1. <pre name="code" class="java">package com.gc.flashview;
  2. import java.lang.ref.WeakReference;
  3. import java.lang.reflect.Field;
  4. import java.util.ArrayList;
  5. import java.util.List;
  6. import java.util.concurrent.Executors;
  7. import java.util.concurrent.ScheduledExecutorService;
  8. import java.util.concurrent.TimeUnit;
  9. import com.gc.flashview.effect.AccordionTransformer;
  10. import com.gc.flashview.effect.CubeTransformer;
  11. import com.gc.flashview.effect.DefaultTransformer;
  12. import com.gc.flashview.effect.DepthPageTransformer;
  13. import com.gc.flashview.effect.InRightDownTransformer;
  14. import com.gc.flashview.effect.InRightUpTransformer;
  15. import com.gc.flashview.effect.RotateTransformer;
  16. import com.gc.flashview.effect.ZoomOutPageTransformer;
  17. import com.gc.flashview.listener.FlashViewListener;
  18. import android.annotation.SuppressLint;
  19. import android.content.Context;
  20. import android.content.res.TypedArray;
  21. import android.graphics.drawable.Drawable;
  22. import android.os.Handler;
  23. import android.os.Message;
  24. import android.os.Parcelable;
  25. import android.provider.ContactsContract.CommonDataKinds.Im;
  26. import android.support.v4.view.PagerAdapter;
  27. import android.support.v4.view.ViewPager;
  28. import android.support.v4.view.ViewPager.OnPageChangeListener;
  29. import android.support.v4.view.ViewPager.PageTransformer;
  30. import android.util.AttributeSet;
  31. import android.view.LayoutInflater;
  32. import android.view.View;
  33. import android.view.ViewParent;
  34. import android.view.animation.AccelerateInterpolator;
  35. import android.view.animation.Animation;
  36. import android.view.animation.AnimationUtils;
  37. import android.view.animation.Interpolator;
  38. import android.widget.FrameLayout;
  39. import android.widget.ImageView;
  40. import android.widget.ImageView.ScaleType;
  41. import android.widget.LinearLayout;
  42. import android.widget.RelativeLayout;
  43. import android.widget.Scroller;
  44. import android.widget.Toast;
  45. /**
  46. *
  47. * @author Android将军
  48. *
  49. *
  50. */
  51. @SuppressLint("HandlerLeak")
  52. public class FlashView extends FrameLayout{
  53. private ImageLoaderTools imageLoaderTools;
  54. private ImageHandler mhandler = new ImageHandler(new WeakReference<FlashView>(this));
  55. private List<String> imageUris;
  56. private List<ImageView> imageViewsList;
  57. private List<ImageView> dotViewsList;
  58. private LinearLayout mLinearLayout;
  59. private ViewPager mViewPager;
  60. private FlashViewListener mFlashViewListener;//向外提供接口
  61. private int effect;//图片切换的动画效果
  62. public FlashView(Context context)
  63. {
  64. this(context, null);
  65. }
  66. public FlashView(Context context, AttributeSet attrs)
  67. {
  68. this(context, attrs, 0);
  69. }
  70. public FlashView(Context context, AttributeSet attrs, int defStyle)
  71. {
  72. super(context, attrs, defStyle);
  73. // TODO Auto-generated constructor stub
  74. //读取该自定义控件自定义的属性
  75. TypedArray mTypedArray=context.obtainStyledAttributes(attrs, R.styleable.FlashView);
  76. effect=mTypedArray.getInt(R.styleable.FlashView_effect, 2);
  77. initUI(context);
  78. if (!(imageUris.size() <= 0))
  79. {
  80. setImageUris(imageUris);//
  81. }
  82. }
  83. private void initUI(Context context)
  84. {
  85. imageViewsList = new ArrayList<ImageView>();
  86. dotViewsList = new ArrayList<ImageView>();
  87. imageUris = new ArrayList<String>();
  88. imageLoaderTools = ImageLoaderTools.getInstance(context.getApplicationContext());
  89. LayoutInflater.from(context).inflate(R.layout.layout_slideshow, this,true);
  90. mLinearLayout = (LinearLayout) findViewById(R.id.linearlayout);
  91. mViewPager = (ViewPager) findViewById(R.id.viewPager);
  92. //mFlashViewListener必须实例化
  93. try
  94. {
  95. mFlashViewListener = (FlashViewListener) context;
  96. }
  97. catch (ClassCastException e)
  98. {
  99. throw new ClassCastException(context.toString()+ " must implement mPhotoListener");
  100. }
  101. }
  102. public void setImageUris(List<String> imageuris) {
  103. if (imageuris.size() <= 0)// 如果得到的图片张数为0,则增加一张默认的图片
  104. {
  105. imageUris.add("drawable://" + R.drawable.defaultflashview);
  106. }
  107. else
  108. {
  109. for (int i = 0; i < imageuris.size(); i++)
  110. {
  111. imageUris.add(imageuris.get(i));
  112. }
  113. }
  114. LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT,LinearLayout.LayoutParams.WRAP_CONTENT);
  115. lp.setMargins(5, 0, 0, 0);
  116. for (int i = 0; i < imageUris.size(); i++)
  117. {
  118. ImageView imageView = new ImageView(getContext());
  119. imageView.setScaleType(ScaleType.FIT_XY);// X和Y方向都填满
  120. imageLoaderTools.displayImage(imageUris.get(i), imageView);
  121. imageViewsList.add(imageView);
  122. ImageView viewDot = new ImageView(getContext());
  123. if (i == 0)
  124. {
  125. viewDot.setBackgroundResource(R.drawable.dot_white);
  126. } else
  127. {
  128. viewDot.setBackgroundResource(R.drawable.dot_light);
  129. }
  130. viewDot.setLayoutParams(lp);
  131. dotViewsList.add(viewDot);
  132. mLinearLayout.addView(viewDot);
  133. }
  134. mViewPager.setFocusable(true);
  135. mViewPager.setAdapter(new MyPagerAdapter());
  136. mViewPager.setOnPageChangeListener(new MyPageChangeListener());
  137. setEffect(effect);
  138. if (imageUris.size() <= 1)
  139. {
  140. } else
  141. {
  142. // 利用反射修改自动轮播的动画持续时间
  143. try
  144. {
  145. Field field = ViewPager.class.getDeclaredField("mScroller");
  146. field.setAccessible(true);
  147. FixedSpeedScroller scroller = new FixedSpeedScroller(
  148. mViewPager.getContext(), new AccelerateInterpolator());
  149. field.set(mViewPager, scroller);
  150. scroller.setmDuration(1000);
  151. mViewPager.setCurrentItem(100 * imageViewsList.size());
  152. mhandler.sendEmptyMessageDelayed(ImageHandler.MSG_UPDATE_IMAGE,
  153. ImageHandler.MSG_DELAY);
  154. } catch (Exception e)
  155. {
  156. }
  157. }
  158. }
  159. /**
  160. * 切换轮播小点的显示
  161. *
  162. * @param selectItems
  163. */
  164. private void setImageBackground(int selectItems)
  165. {
  166. for (int i = 0; i < dotViewsList.size(); i++)
  167. {
  168. if (i == selectItems % dotViewsList.size())
  169. {
  170. dotViewsList.get(i).setBackgroundResource(R.drawable.dot_white);
  171. } else
  172. {
  173. dotViewsList.get(i).setBackgroundResource(R.drawable.dot_light);
  174. }
  175. }
  176. }
  177. /**
  178. *
  179. * 数据适配器
  180. *
  181. */
  182. private class MyPagerAdapter extends PagerAdapter
  183. {
  184. @Override
  185. public void destroyItem(View container, int position, Object object)
  186. {
  187. }
  188. @Override
  189. public Object instantiateItem(View container,  int position)
  190. {
  191. position = position % imageViewsList.size();
  192. if (position < 0)
  193. {
  194. position = position + imageViewsList.size();
  195. }
  196. final int pos=position;
  197. View view = imageViewsList.get(position);
  198. view.setTag(position);
  199. view.setOnClickListener(new OnClickListener() {
  200. @Override
  201. public void onClick(View v)
  202. {
  203. // TODO Auto-generated method stub
  204. mFlashViewListener.onClick(pos);
  205. }
  206. });
  207. ViewParent vp = view.getParent();
  208. if (vp != null)
  209. {
  210. ViewPager pager = (ViewPager) vp;
  211. pager.removeView(view);
  212. }
  213. ((ViewPager) container).addView(view);
  214. return view;
  215. }
  216. @Override
  217. public int getCount() {
  218. if (imageUris.size() <= 1)
  219. {
  220. return 1;
  221. } else {
  222. return Integer.MAX_VALUE;
  223. }
  224. }
  225. @Override
  226. public boolean isViewFromObject(View arg0, Object arg1) {
  227. return arg0 == arg1;
  228. }
  229. }
  230. private class MyPageChangeListener implements OnPageChangeListener
  231. {
  232. @Override
  233. public void onPageScrollStateChanged(int arg0)
  234. {
  235. // TODO Auto-generated method stub
  236. switch (arg0)
  237. {
  238. case ViewPager.SCROLL_STATE_DRAGGING:
  239. mhandler.sendEmptyMessage(ImageHandler.MSG_KEEP_SILENT);
  240. break;
  241. case ViewPager.SCROLL_STATE_IDLE:
  242. mhandler.sendEmptyMessageDelayed(ImageHandler.MSG_UPDATE_IMAGE,ImageHandler.MSG_DELAY);
  243. break;
  244. default:
  245. break;
  246. }
  247. }
  248. @Override
  249. public void onPageScrolled(int arg0, float arg1, int arg2) {
  250. // TODO Auto-generated method stub
  251. }
  252. @Override
  253. public void onPageSelected(int pos) {
  254. // TODO Auto-generated method stub
  255. mhandler.sendMessage(Message.obtain(mhandler,ImageHandler.MSG_PAGE_CHANGED, pos, 0));
  256. setImageBackground(pos);
  257. }
  258. }
  259. @SuppressWarnings("unused")
  260. private void destoryBitmaps()
  261. {
  262. for (int i = 0; i < imageViewsList.size(); i++)
  263. {
  264. ImageView imageView = imageViewsList.get(i);
  265. Drawable drawable = imageView.getDrawable();
  266. if (drawable != null)
  267. {
  268. drawable.setCallback(null);
  269. }
  270. }
  271. }
  272. public void setEffect(int selectEffect)
  273. {
  274. switch (selectEffect) {
  275. case 0:
  276. setPageTransformer(true,new AccordionTransformer());
  277. break;
  278. case 1:
  279. setPageTransformer(true,new CubeTransformer());
  280. break;
  281. case 2:
  282. setPageTransformer(true,new DefaultTransformer());
  283. break;
  284. case 3:
  285. setPageTransformer(true,new DepthPageTransformer());
  286. break;
  287. case 4:
  288. setPageTransformer(true,new InRightDownTransformer());
  289. break;
  290. case 5:
  291. setPageTransformer(true,new InRightUpTransformer());
  292. break;
  293. case 6:
  294. setPageTransformer(true,new RotateTransformer());
  295. break;
  296. case 7:setPageTransformer(true,new ZoomOutPageTransformer());
  297. break;
  298. default:
  299. break;
  300. }
  301. }
  302. /**
  303. * 设置切换效果
  304. * @param b
  305. * @param rotateTransformer
  306. */
  307. public void setPageTransformer(boolean b, PageTransformer rotateTransformer)
  308. {
  309. // TODO Auto-generated method stub
  310. mViewPager.setPageTransformer(b, rotateTransformer);
  311. }
  312. /**
  313. *
  314. * FixedSpeedScroller类的源码来源于网络,在此谢过贡献此代码的道友
  315. *
  316. */
  317. public class FixedSpeedScroller extends Scroller
  318. {
  319. private int mDuration = 1500;
  320. public FixedSpeedScroller(Context context)
  321. {
  322. super(context);
  323. }
  324. public FixedSpeedScroller(Context context, Interpolator interpolator)
  325. {
  326. super(context, interpolator);
  327. }
  328. @Override
  329. public void startScroll(int startX, int startY, int dx, int dy,int duration)
  330. {
  331. super.startScroll(startX, startY, dx, dy, mDuration);
  332. }
  333. @Override
  334. public void startScroll(int startX, int startY, int dx, int dy)
  335. {
  336. super.startScroll(startX, startY, dx, dy, mDuration);
  337. }
  338. public void setmDuration(int time)
  339. {
  340. mDuration = time;
  341. }
  342. public int getmDuration()
  343. {
  344. return mDuration;
  345. }
  346. }
  347. private static class ImageHandler extends Handler
  348. {
  349. protected static final int MSG_UPDATE_IMAGE = 1;
  350. protected static final int MSG_KEEP_SILENT = 2;
  351. protected static final int MSG_BREAK_SILENT = 3;
  352. protected static final int MSG_PAGE_CHANGED = 4;
  353. protected static final long MSG_DELAY = 2000;
  354. private WeakReference<FlashView> weakReference;
  355. private int currentItem = 0;
  356. protected ImageHandler(WeakReference<FlashView> wk)
  357. {
  358. weakReference = wk;
  359. System.out.println("dsfdsfdsf:::" + currentItem);
  360. }
  361. @Override
  362. public void handleMessage(Message msg)
  363. {
  364. super.handleMessage(msg);
  365. FlashView activity = weakReference.get();
  366. if (activity == null)
  367. {
  368. return;
  369. }
  370. if (activity.mhandler.hasMessages(MSG_UPDATE_IMAGE))
  371. {
  372. if (currentItem > 0)// 这里必须加入currentItem>0的判断,否则不能完美的自动轮播
  373. {
  374. activity.mhandler.removeMessages(MSG_UPDATE_IMAGE);
  375. }
  376. }
  377. switch (msg.what)
  378. {
  379. case MSG_UPDATE_IMAGE:
  380. System.out.println("cccccc:::" + currentItem);
  381. currentItem++;
  382. activity.mViewPager.setCurrentItem(currentItem);
  383. activity.mhandler.sendEmptyMessageDelayed(MSG_UPDATE_IMAGE,MSG_DELAY);
  384. break;
  385. case MSG_KEEP_SILENT:
  386. break;
  387. case MSG_BREAK_SILENT:
  388. activity.mhandler.sendEmptyMessageDelayed(MSG_UPDATE_IMAGE,MSG_DELAY);
  389. break;
  390. case MSG_PAGE_CHANGED:
  391. currentItem = msg.arg1;
  392. break;
  393. default:
  394. break;
  395. }
  396. }
  397. }
  398. }

说过自定义控件的布局和相应类之后,我们就要来使用它了,那么我们怎么去使用这个呢,请看下面的内容。在你的工程中如果想要使用该自定义控件,你需要把自定义控件的布局文件拷贝到你的layout文件夹下,然后将上面的类拷贝到你的工程里去,在你自己的布局文件中这样引用该控件,代码,如下:

[html] view plaincopy
  1. <com.gc.flashview.FlashView
  2. android:id="@+id/flash_view"
  3. android:layout_width="match_parent"
  4. android:layout_height="300dp"
  5. android:layout_margin="10dp"
  6. app:effect="cube"
  7. />

然后在相应的Activity或Fragment中这样动态设置图片:
(1)先通过findviewbyid获得该控件】

(2)调用该控件的setImageUris的方法

具体代码如下所示:

[java] view plaincopy
  1. flashView=(FlashView)findViewById(R.id.flash_view);
  2. imageUrls=new ArrayList<String>();
  3. imageUrls.add("http://www.qipaox.com/tupian/200810/20081051924582.jpg");
  4. imageUrls.add("http://www.bz55.com/uploads1/allimg/120312/1_120312100435_8.jpg");
  5. imageUrls.add("http://img3.iqilu.com/data/attachment/forum/201308/21/192654ai88zf6zaa60zddo.jpg");
  6. imageUrls.add("http://img2.pconline.com.cn/pconline/0706/19/1038447_34.jpg");
  7. //        imageUrls.add("http://www.kole8.com/desktop/desk_file-11/2/2/2012/11/2012113013552959.jpg");
  8. //        imageUrls.add("http://www.237.cc/uploads/pcline/712_0_1680x1050.jpg");
  9. //        imageUrls.add("http://pic3.bbzhi.com/fengjingbizhi/gaoqingkuanpingfengguangsheyingps/show_fengjingta_281299_11.jpg");
  10. flashView.setImageUris(imageUrls);
  11. flashView.setEffect(EffectConstants.CUBE_EFFECT);//更改图片切换的动画效果

然后在应用程序中的效果如下:

好了,该自定义控件的使用就是这样的。相信大家也应该明白了,如果有不对的地方欢迎指出,或者有不明白可以回复留言。至此代码已经讲完了,本次更新主要是附上Demo下载地址。声明:由于本demo是侧重于该自定义控件的使用,故在Demo中去除了UIL的使用。还有不知道怎么搞的,上传的动态效果图老是自动打上水印了,只能是静态效果图了,这个应该是博客系统的原因吧,昨天的博文也是这样。

Demo下载地址:http://download.csdn.net/detail/gc_gongchao/8081433

下载需下载积分1分,勿喷我,呵呵!

转载请注明出处:http://blog.csdn.net/android_jiangjun/article/details/39638129
///

2014/12/28更新,更新以下部分:

(1)修改轮播时,轮播到最后一张,回退到首张,现在已经解决此部分bug

(2)利用反射修改自动轮播时动画的持续时间。

(3)将此功能打包成一个library,地址:https://github.com/gcgongchao/flashview ,至于用法,已经在readme阐述清楚,故不在此处多加叙述。

2015/01/15 22:20更新:

程序的修复:
(1)修改当图片为0张时,程序会报错并强制退出。

(2)修改当图片为1张时,图片还会轮播的不好效果。

下次更新:
(1)对外提供点击事件的接口
(2)加入可以在XML文件中设置其动画效果的功能。

程序的地址还是在上面的github地址,如果你有github账号,如果本文对你有帮助的话,请star一下,谢谢。你们的支持,将是我持续的动力。

2015/01/18 20:14

本次更新:

(1)对外提供点击事件的接口

下次更新:

(1)增加图片切换的动画效果

由于csdn的博客限制图片大小不超过2M,所以最新的动态图,还是到这里去看吧:https://github.com/gcgongchao/flashview。

2015/01/28 22:09

本次更新:
(1)增加了图片切换的动画效果,这些动画效果的代码来源于网络,感谢贡献此动画效果的作者。
下次更新:
(1)加入自己写的动画效果。
更新之后的最新项目还是在本人的github上,地址上面都已给出,如果在使用过程中有bug或者有任何意见,请及时告知。

2015/01/29 22:00

本次更新:修改对外监听的bug,即轮播控件的监听的bug。

2015/04/08 20:37
改着改着网友反馈的bug,就过了8点了,就没抢上小米了。。。。。。

本次更新:修改当图片为2张时,ViewPager会出现空白页的bug。
下载地址就是上面所说的github上的地址,如果在使用过程中,出现bug,请及时反馈,以便于我更好的完善它,谢谢!

https://github.com/gcgongchao/flashview

Android自定义控件之应用程序首页轮播图相关推荐

  1. Android自己定义控件之应用程序首页轮播图

    如今基本上大多数的Android应用程序的首页都有轮播图.就是像下图这种(此图为转载的一篇博文中的图.拿来直接用了): 像这种组件我相信大多数的应用程序都会使用到,本文就是自己定义一个这种组件,能够动 ...

  2. 微信小程序 首页轮播图 x轴 横向滚动视图

    页面 <!--index.wxml--> <view class="page"><view class="title">首页 ...

  3. 实战SSM_O2O商铺_40【前端展示】首页轮播图和一级商铺View层的实现

    文章目录 概述 index.html index.js index.css Controller 调测 修复问题 头条图片展示修复 一级类别商铺图片展示修复 Github地址 概述 在完成了后端 实战 ...

  4. 六十六、实现Vue项目首页轮播图(vue-awesome-swiper)

    2020/10/23. 周五.今天又是奋斗的一天. @Author:Runsen @Date:2020/10/22 写在前面:我是「Runsen」,热爱技术.热爱开源.热爱编程.技术是开源的.知识是共 ...

  5. 基于Redis优化首页轮播图查询

    @ApiOperation(value = "获取首页轮播图列表", notes = "获取首页轮播图列表", httpMethod = "GET&q ...

  6. (转)淘淘商城系列——首页轮播图展示

    http://blog.csdn.net/yerenyuan_pku/article/details/72848306 上文我们一起学习了内容管理,由于时间太紧了,好多功能都没实现,在此对读者说声抱歉 ...

  7. UI-网站首页轮播图、易拉宝、发布在微信公众号的宣传海报的图片设计信息

    UI交互设计 一."新建" 常见的颜色模式: 颜色模式,是将某种颜色表现为数字形式的模型,或者说是一种记录图像颜色的方式.分为:RGB模式.CMYK模式.HSB模式.Lab颜色模式 ...

  8. 微服务项目实战技术点汇总:“尚硅谷的谷粒在线教育”七、redis数据库缓存页面数据、使用NUXT框架搭建前台系统环境、前台系统页面、首页轮播图(banner数据显示)、首页热门课程,名师推荐

    文章目录 一.NUXT前台环境搭建 1.如何学习NUXT 2.下载安装使用NUXT入门模板starter-template 3.机制 二.编写静态页面 1.设置布局(首尾固定,中间用nuxt引用组件) ...

  9. 【VIP视频网站项目二】搭建爱奇艺优酷腾讯视频官网首页轮播图效果及实现原理分析

    这个是实现的效果,基本上轮播效果和主流网站的一致,但是我也在上面优化了一些效果, 可以在线预览效果:https://vip.52tech.tech/ 目前项目代码已经全部开源:项目地址:https:/ ...

最新文章

  1. 专访闪送联合创始人于红建:要继续深耕国内市场
  2. Android 测试教程
  3. java自定义异常返回_Java自定义异常
  4. Asp.net MVC中防止HttpPost重复提交
  5. html删除的标签属性,如何从html标签中删除属性?
  6. mysql5.7密码过期ERROR 1862 (HY000): Your password has expired. To log in you must change
  7. Struts2自定义的转换器
  8. 【音频处理】如何“认识”一个滤波器?
  9. nodejs安装服务器系统,window下,nodejs安装http-server,并开启HTTP服务器
  10. 8年测试工程师,从“点点点”成长到华为测试主管——我必须告诉你这些......(共勉)
  11. c++之std::distance()函数
  12. 2.10 数值分析: 条件数的定义及计算
  13. 二阶滤波器原理及算法程序
  14. 移动App测试中的最佳做法
  15. 怎么给word文档注音_Word文档中,怎样全篇加注拼音?
  16. 科研写作——常见句式(三)
  17. 详解redis5.x版本
  18. 赵栋201771010137《面向对象程序设计(java)》第七周学习总结
  19. ORACLE 数据库常遇问题
  20. 软件实训-用例图2.0 + 简单用例描述

热门文章

  1. [CF1537D]Deleting Divisors
  2. 按键精灵通过句柄获取窗口坐标_大漠插件后台找图、自动获取坐标窗口句柄鼠标多点左单击脚本...
  3. spring boot 集成Zuul
  4. XWPFTableRow、XWPFTableCell设置字体格式
  5. 固态分区 basic_无需重装系统,Win10电脑简单分区操作。
  6. python 显著性检验_显著性检测 LC代码python
  7. Github报错fatal unable to access No such file or directory
  8. arcgis如何做lisa集聚图_GeoDa 制作北京LISA集聚图,显示错误,如图,怎样处理?...
  9. 带以太网和 CAN 的低压模块-德国KLARIC 新款KLARI-FUSE3|新能源静态电压电流数据采集模块
  10. wlan autoconfig 启动错误:1068依赖服务或组无法启动