首页 文章 精选 留言 我的

精选列表

搜索[职场成长],共7786篇文章
优秀的个人博客,低调大师

Android菜鸟的成长笔记(27)——ViewPager的使用

ViewPager是Android 3.0以上能够使用的API。 一、ViewPager能干什么? 1、微信5.0中连带滑动用ViewPager能够轻松实现。 2、实现相似于新浪微博的导航引导界面。 3、实现其它导航或菜单。 二、ViewPager的使用 1、加入布局 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <android.support.v4.view.ViewPager android:id="@+id/viewpager" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center"/> </LinearLayout> 2、载入要显示的布局文件(View) LayoutInflater lf = getLayoutInflater().from(this); view1 = lf.inflate(R.layout.layout_0, null); view2 = lf.inflate(R.layout.layout_1, null); view3 = lf.inflate(R.layout.layout_2, null); 3、创建View集合 mListViews = new ArrayList<View>(); mListViews.add(view1); mListViews.add(view2); mListViews.add(view3); 4、创建PagerAdapter ViewPager的适配器是PagerAdapter,要实现PagerAdapter至少要实现以下方法: (1)instantiateItem(ViewGroup, int) //加入 (2)destroyItem(ViewGroup, int, Object) //删除 (3)getCount() (4)isViewFromObject(View, Object) private class MyPageAdapter extends PagerAdapter { private List<View> mListViews; public MyPageAdapter(List<View> mListViews) { this.mListViews = mListViews; } /** * 删除页卡 */ @Override public void destroyItem(View container, int position, Object object) { ((ViewPager) container).removeView(mListViews.get(position)); } /** * 实例化页卡 */ @Override public Object instantiateItem(View container, int position) { ((ViewPager)container).addView(mListViews.get(position)); return mListViews.get(position); } /** * 返回页卡的数量 */ @Override public int getCount() { return mListViews.size(); } @Override public boolean isViewFromObject(View arg0, Object arg1) { return arg0 == arg1; //官方提示这样写 } } 5、配置适配器 mViewPager.setAdapter(new MyPageAdapter(mListViews)); 所有代码例如以下: package com.example.viewpagetest; import java.util.ArrayList; import java.util.List; import android.app.Activity; import android.os.Bundle; import android.support.v4.view.PagerAdapter; import android.support.v4.view.ViewPager; import android.view.LayoutInflater; import android.view.View; public class MainActivity extends Activity { private List<View> mListViews; private View view1; private View view2; private View view3; private ViewPager mViewPager; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mViewPager = (ViewPager) findViewById(R.id.viewpager); //载入要显示的选项卡 LayoutInflater lf = getLayoutInflater().from(this); view1 = lf.inflate(R.layout.layout_0, null); view2 = lf.inflate(R.layout.layout_1, null); view3 = lf.inflate(R.layout.layout_2, null); mListViews = new ArrayList<View>(); mListViews.add(view1); mListViews.add(view2); mListViews.add(view3); mViewPager.setAdapter(new MyPageAdapter(mListViews)); } private class MyPageAdapter extends PagerAdapter { private List<View> mListViews; public MyPageAdapter(List<View> mListViews) { this.mListViews = mListViews; } /** * 删除页卡 */ @Override public void destroyItem(View container, int position, Object object) { ((ViewPager) container).removeView(mListViews.get(position)); } /** * 实例化页卡 */ @Override public Object instantiateItem(View container, int position) { ((ViewPager)container).addView(mListViews.get(position)); return mListViews.get(position); } /** * 返回页卡的数量 */ @Override public int getCount() { return mListViews.size(); } @Override public boolean isViewFromObject(View arg0, Object arg1) { return arg0 == arg1; //官方提示这样写 } } } 各个页面代码: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <TextView android:layout_width="match_parent" android:layout_height="match_parent" android:text="1" android:gravity="center" android:textSize="120sp" android:textColor="#33b5e5" /> </LinearLayout> 执行效果: 三、实现微信的菜单联动 android.support.v4.view包中的接口和类例如以下: 从上面图片中我们能够看到PagerTabStrip和PagerTitleStrip 从字面意思上理解,PagerTabStrip是能够点击的导航选项卡,而PagerTitleStrip是不能互动的(点击)的导航选项卡。 以下我们改动布局文件例如以下: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <android.support.v4.view.ViewPager android:id="@+id/viewpager" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center"> <android.support.v4.view.PagerTabStrip android:id="@+id/pagertab" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="top"/> </android.support.v4.view.ViewPager> </LinearLayout> layout_gravity能够设置Tab的位置 改动MainActvity mTitleList = new ArrayList<String>(); mTitleList.add("聊天"); mTitleList.add("发现"); mTitleList.add("通讯录"); 在PagerAdapter中加入以下代码: @Override public CharSequence getPageTitle(int position) { return mTitleList.get(position); } 贴出所有代码,例如以下: package com.example.viewpagetest; import java.util.ArrayList; import java.util.List; import android.app.Activity; import android.os.Bundle; import android.support.v4.view.PagerAdapter; import android.support.v4.view.ViewPager; import android.view.LayoutInflater; import android.view.View; public class MainActivity extends Activity { private List<String> mTitleList; private List<View> mListViews; private ViewPager mViewPager; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mViewPager = (ViewPager) findViewById(R.id.viewpager); //载入要显示的选项卡 LayoutInflater lf = getLayoutInflater().from(this); View view1 = lf.inflate(R.layout.layout_0, null); View view2 = lf.inflate(R.layout.layout_1, null); View view3 = lf.inflate(R.layout.layout_2, null); mListViews = new ArrayList<View>(); mListViews.add(view1); mListViews.add(view2); mListViews.add(view3); mTitleList = new ArrayList<String>(); mTitleList.add("聊天"); mTitleList.add("发现"); mTitleList.add("通讯录"); mViewPager.setAdapter(new MyPageAdapter(mListViews)); } private class MyPageAdapter extends PagerAdapter { private List<View> mListViews; public MyPageAdapter(List<View> mListViews) { this.mListViews = mListViews; } /** * 删除页卡 */ @Override public void destroyItem(View container, int position, Object object) { ((ViewPager) container).removeView(mListViews.get(position)); } /** * 实例化页卡 */ @Override public Object instantiateItem(View container, int position) { ((ViewPager)container).addView(mListViews.get(position)); return mListViews.get(position); } /** * 返回页卡的数量 */ @Override public int getCount() { return mListViews.size(); } @Override public boolean isViewFromObject(View arg0, Object arg1) { return arg0 == arg1; //官方提示这样写 } /** * 设置Tab */ @Override public CharSequence getPageTitle(int position) { return mTitleList.get(position); } } } 执行效果: 上面尽管有了Tab,并能随着页面的切换改变,可是这个并非我们要达到的效果。以下我们自己做一个静态的Tab底部和一个动画来实现。 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:background="#eeeeee" android:orientation="vertical" > <LinearLayout android:id="@+id/linearLayout1" android:layout_width="fill_parent" android:layout_height="32.0dip" android:background="#eeeeee" > <TextView android:id="@+id/text1" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_weight="1.0" android:gravity="center" android:text="聊天" android:textColor="#000000" android:textSize="16.0dip" /> <TextView android:id="@+id/text2" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_weight="1.0" android:gravity="center" android:text="发现" android:textColor="#000000" android:textSize="16.0dip" /> <TextView android:id="@+id/text3" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_weight="1.0" android:gravity="center" android:text="通讯录" android:textColor="#000000" android:textSize="16.0dip" /> </LinearLayout> <ImageView android:id="@+id/cursor" android:layout_width="fill_parent" android:layout_height="wrap_content" android:scaleType="matrix" android:src="@drawable/a"/> <ImageView android:layout_width="match_parent" android:layout_height="1px" android:background="#cccccc"/> <android.support.v4.view.ViewPager android:id="@+id/vPager" android:layout_width="wrap_content" android:layout_height="0dp" android:layout_gravity="center" android:layout_weight="1.0" android:flipInterval="30" android:background="#ffffff" android:persistentDrawingCache="animation" /> </LinearLayout> package com.example.wuye001; import java.util.ArrayList; import java.util.List; import android.app.Activity; import android.graphics.BitmapFactory; import android.graphics.Matrix; import android.os.Bundle; import android.support.v4.view.PagerAdapter; import android.support.v4.view.ViewPager; import android.support.v4.view.ViewPager.OnPageChangeListener; import android.util.DisplayMetrics; import android.view.LayoutInflater; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; import android.view.animation.Animation; import android.view.animation.TranslateAnimation; import android.widget.ImageView; import android.widget.TextView; import android.widget.Toast; public class MainActivity extends Activity { private ViewPager viewPager;//页卡内容 private ImageView imageView;// 动绘图片 private TextView textView1,textView2,textView3; private List<View> views;// Tab页面列表 private int offset = 0;// 动绘图片偏移量 private int currIndex = 0;// 当前页卡编号 private int bmpW;// 动绘图片宽度 private View view1,view2,view3;//各个页卡 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); InitImageView(); InitTextView(); InitViewPager(); } private void InitViewPager() { viewPager=(ViewPager) findViewById(R.id.vPager); views=new ArrayList<View>(); LayoutInflater inflater=getLayoutInflater(); view1=inflater.inflate(R.layout.layout_0, null); view2=inflater.inflate(R.layout.layout_1, null); view3=inflater.inflate(R.layout.layout_2, null); views.add(view1); views.add(view2); views.add(view3); viewPager.setAdapter(new MyViewPagerAdapter(views)); viewPager.setCurrentItem(0); viewPager.setOnPageChangeListener(new MyOnPageChangeListener()); } /** * 初始化头标 */ private void InitTextView() { textView1 = (TextView) findViewById(R.id.text1); textView2 = (TextView) findViewById(R.id.text2); textView3 = (TextView) findViewById(R.id.text3); textView1.setOnClickListener(new MyOnClickListener(0)); textView2.setOnClickListener(new MyOnClickListener(1)); textView3.setOnClickListener(new MyOnClickListener(2)); } /** * 初始化动画,这个就是页卡滑动时。以下的横线也滑动的效果,在这里须要计算一些数据 */ private void InitImageView() { imageView= (ImageView) findViewById(R.id.cursor); bmpW = BitmapFactory.decodeResource(getResources(), R.drawable.a).getWidth();// 获取图片宽度 DisplayMetrics dm = new DisplayMetrics(); getWindowManager().getDefaultDisplay().getMetrics(dm); int screenW = dm.widthPixels;// 获取分辨率宽度 offset = (screenW / 3 - bmpW) / 2;// 计算偏移量 Matrix matrix = new Matrix(); matrix.postTranslate(offset, 0); imageView.setImageMatrix(matrix);// 设置动画初始位置 } /** * * 头标点击监听 3 */ private class MyOnClickListener implements OnClickListener{ private int index=0; public MyOnClickListener(int i){ index=i; } public void onClick(View v) { viewPager.setCurrentItem(index); } } public class MyViewPagerAdapter extends PagerAdapter{ private List<View> mListViews; public MyViewPagerAdapter(List<View> mListViews) { this.mListViews = mListViews; } @Override public void destroyItem(ViewGroup container, int position, Object object) { container.removeView(mListViews.get(position)); } @Override public Object instantiateItem(ViewGroup container, int position) { container.addView(mListViews.get(position), 0); return mListViews.get(position); } @Override public int getCount() { return mListViews.size(); } @Override public boolean isViewFromObject(View arg0, Object arg1) { return arg0==arg1; } } public class MyOnPageChangeListener implements OnPageChangeListener{ int one = offset * 2 + bmpW;// 页卡1 -> 页卡2 偏移量 int two = one * 2;// 页卡1 -> 页卡3 偏移量 public void onPageScrollStateChanged(int arg0) { } public void onPageScrolled(int arg0, float arg1, int arg2) { } public void onPageSelected(int arg0) { /*两种方法。这个是一种,以下另一种。显然这个比較麻烦 Animation animation = null; switch (arg0) { case 0: if (currIndex == 1) { animation = new TranslateAnimation(one, 0, 0, 0); } else if (currIndex == 2) { animation = new TranslateAnimation(two, 0, 0, 0); } break; case 1: if (currIndex == 0) { animation = new TranslateAnimation(offset, one, 0, 0); } else if (currIndex == 2) { animation = new TranslateAnimation(two, one, 0, 0); } break; case 2: if (currIndex == 0) { animation = new TranslateAnimation(offset, two, 0, 0); } else if (currIndex == 1) { animation = new TranslateAnimation(one, two, 0, 0); } break; } */ Animation animation = new TranslateAnimation(one*currIndex, one*arg0, 0, 0);//显然这个比較简洁,仅仅有一行代码。 currIndex = arg0; animation.setFillAfter(true);// True:图片停在动画结束位置 animation.setDuration(300); imageView.startAnimation(animation); } } } 执行效果: 本文转自mfrbuaa博客园博客,原文链接:http://www.cnblogs.com/mfrbuaa/p/5094697.html,如需转载请自行联系原作者

优秀的个人博客,低调大师

胡泳|AI的“最后一公里”,决定谁还能留在职场

编者按:AI会如何改变企业?这是继就业结构和技能重塑之后,另一个无法回避的问题。上一篇我们讨论了AI如何改变劳动者的能力结构;今天,我们继续追问更深层的问题——当企业拥有AI之后,为什么仍然需要人?对于员工而言,真正决定未来竞争力的,或许不是会不会使用AI,而是能否成为跨越AI“最后一公里”的关键环节。

优秀的个人博客,低调大师

云栖职场系列课 | 技术大咖零距离:我在阿里做前端

云栖君导读:不得不说,前端岗位始终是各大互联网公司招聘的热门,希望通过学习前端技能,升级加薪走上人生巅峰的“准”前端同学们,你们是否有以下的困惑? 怎样从实习、校招中如何脱颖而出?想来阿里做前端,又需要增加哪些技能点?未来的职业生涯中,还会面临哪些挑战和机遇? 云栖君邀请了两位阿里前端专家,从新人前端和进阶专家的角度帮助大家梳理: 一个专业的前端,在职业生涯规划上会经历哪些坑;需要从技能、心理上做哪些准备。 本场讲座完全免费哦! 7月19日晚7点准时在社群开讲,届时群内互动还将送出10件阿里云定制T恤,还可在社群和专家零距离交流! 来看看是哪两位专家分享,马上扫码进群! Q&A 1.我没有安装钉钉,还有其他办法参与直播吗? 建议您下载钉钉参与本场直播,专家会在群中一对一在线答疑哦!钉钉群名额为1000人~招满即止~ 2、阿里还在招聘前端吗?我

优秀的个人博客,低调大师

从Workbuddy成长计划看AI成长历程

AI这段时间的变化我们都看在眼里,相信接触AI的人都知道,AI这两年的变化其实是非常快的。从只有国外AI才是好的,到国内的国产AI逐渐的能够去在日常的生活场景甚至工作场景中熟练运用,这中间发生了太多的事情。而我们和AI的关系,以及我们和AI之间的互动也发生了根本性的变化。那么要把这个东西说清楚,我们需要先聊一下一些前置的话题。

优秀的个人博客,低调大师

BabyLog 宝贝成长记录工具发布全新的 2.0 版本

一晃孩子都要上初中了,当初孩子刚出生的时候,我只是想记录一下当爸爸的心路历程,没想到一下子就过去了10年. 此间,程序重构过多次,但是唯一不变的就是那些记录下来的数据和相片. 由于程序代码老旧,有些新用户搭建环境困难导致程序无法启动,因此重构了原有的代码. 全新的BabyLog2.0 发布了! 新版本功能: 1. 可以记录多个宝贝的日志和健康数据了,每个宝贝健康数据图表可以分别显示. 2. 更方便的图片上传功能,最多一次可以上传9张图片. 3. 后台的权限管理更完善了,依托于miniadmin,实现了rbac的权限管理. 4. 前后端可分离,也可以不分离的模式,根据需求自行选择.实现了一键启动系统,简化了程序的配置. 5. 系统首次启动会创建一些数据,方便用户第一次使用. 6.优化了数据库的数据表结构. 7. 修复了一些历史遗留的bug. 真诚的希望有孩子的和打算生孩子的程序员们来一起维护这个程序,有些东西真的需要记下来,不然回头看去都是模糊的回忆。 任凭时光匆匆,记录点点滴滴。以上记录与2022-12-29

优秀的个人博客,低调大师

学会战斗中成长 运用网络中的利器

网络硝烟连天不休,网管救急一马当先。冲锋于各大网络“战事”最前线的网管员,他们对于这一职业的思考如何呢?让我们来关注这一群体的生活麻辣烫。 当前,随着越来越多的企业对it为业务提供持续高效支撑的要求越来越迫切,业务服务管理(Business Service Management,BSM)已逐渐成为it管理领域的一个新的热点。业务服务管理弥补了传统it管理理念缺乏对业务和it关联关系问题的思考,明确提出了保持业务目标和it目标相统一,构建业务和it的沟通平台。通过业务视角传递it价值的观点。 无法统一协调,导致问题不能及时解决随着国家大部委制的整合进程逐渐加快,问题暴露得更加明显。原本独立的两套IT系统,现在要完成协同办公,多部门统一协调管理则面临不小的挑战。当两个部委在业务流程上有重合时,就难免发生推卸责任、纠缠不清的扯皮事件。诸如不能上网这样的简单问题,很可能会牵涉到几个部门之间配合。而问题出现时,A部门找B部门反馈,B部门又找C部门处理,C可能说是D部门的问题;信息中心主任找科长,科长找科员,科员找支持,这样导致很简单的问题无法得到及时有效的处理,影响的不仅仅是业务本身,部门之间也会怨声载道。 问题不仅在政府行业中出现,很多企业也会面临。根本原因是各部门之间无法形成统一协调的IT系统管理,问题得不到有效的跟踪,也就谈不上及时解决。现在,如何实现各部门之间的统一协调,以及如何对问题进行有效的跟踪和量化的管理已经成为政府和企业不得不着手解决的难题。 对人的依赖,导致人员变更后的运维问题 在网络运维管理中,人的因素成为企业急需解决的第三个问题。有人会问,为什么是人呢?我们都清楚地知道人可以解决问题,这是人在网络运维管理中起到的重要作用,也是毋庸置疑的。但问题也随之而来,如果一个熟练运维人员的岗位发生变更,当问题再出现时,就很难得到迅速处理。即使会有新人继续前人的工作,但他却无法继承前人的运维经验,这成为企业运维成本增加、重复投资的重要原因。 对人的依赖越大,网络管理中的不稳定因素就越多。在企业的IT系统中,如何减少对人的依赖,避免出现因人员变更而导致运维无法有效进行,是企业IT部门面临的重大考验。 准确地反应网络故障 平时,当我们感觉网络速度实在太慢时,才会去和网管联系,而且处理十分被动。因此,网管软件必须能迅速反映问题,还要有一定推理故障根源的能力。此外,还将专家系统、人工智能系统、神经元技术和网络故障和性能管理相结合,使网管系统逐步具备分析决策能力。 IT与业务需要关联吗 随着企业的业务不断扩展,企业的IT基础架构和应用也随之在不断的发展,一旦不能很好的将IT基础架构和应用进行有效的管理和量化,就很容易混乱的局面。 我们投入了大量的人力物力在基础设施和IT应用上,却无法将IT投入和业务的支持建立量化的关系,如何才能更好的管理基础设施和应用,最终减少投诉,变被动为主动呢?是时候改变这一切了!那是否有软件能够监控基础设施和应用,也能够将复杂的IT设施转化为简单的业务视图,让我们从业务的角度,保障IT部门提供稳定可靠的服务。 随着IT基础架构的不断扩充,网络、系统和应用也在向超出管理员的控制范围方向发展,运维中的问题也越来越多。 如何从众多的问题中,找到最优先要处理的事件?网管软件中的服务展现可以帮您做到这些。 同时业务服务管理功能更是从整个业务系统的大局着眼,引入服务水平协议 (SLA)机制,使用在线时间比率、平均故障恢复时间、平均无故障时间等衡量整个服务的运行水平。改被动局部维护为主动宏观管理,致力于提高企业整体运营品质。克服了重监测轻管理,重硬件轻软件,重 IT 元素数据轻业务品质的弊病。 由于可见,IT与业务的关联是十分重要的,如果将IT与业务区别对待,那么对于企业来说,业务就很容易出现混乱的局面。 网管软件关联IT与业务的服务管理 我们投入了大量的人力物力在基础设施和IT应用上,却无法将IT投入和业务的支持建立量化的关系,如何才能更好的管理基础设施和应用?一款好的网管软件能够监控基础设施和应用,也能够将复杂的IT设施转化为简单的业务视图,使我们从IT服务的角度,保障IT部门提供稳定可靠的服务。 IT服务由主机、网络、应用组成,一旦某个组件出现问题,问题就会反应在业务服务上面。用户(包括业务部门)只关心提供给他们所使用的IT服务,服务是不是宕了,还是服务为什么这么慢,而不关心具体的技术细节。 以服务视角来管理IT 很多企业IT部门划分为几个组,各自管理网络、主机以及应用,但是一旦发生问题,对于业务部门来说是一个业务服务的中断,不管是硬件故障,网络问题或者应用宕了,业务部门是完全不清楚什么地方出了问题。现在,IT部门可以把网络、主机、应用组成一个服务,然后以服务为中心,展示出服务和网络、主机、应用的关联关系,以及体现出IT部门对于业务部门的价值。 新一代的网络管理系统,已开始从面向网络设备的管理向面向网络业务的管理过度。这种网管思想把网络服务、业务作为网管对象,通过实时监测与网络业务相关的设备、应用,通过模拟客户实时测量网络业务的服务质量,通过收集网络业务的业务资料,实现全方位、多视角监测网络业务运行情况的目的,从而实现网络业务的故障管理、性能管理和配置管理。 本文转自赖永锋51CTO博客,原文链接:http://blog.51cto.com/mochasoft/252542 ,如需转载请自行联系原作者

优秀的个人博客,低调大师

MaxCompute2.0助力众安保险快速成长

摘要:2017云栖大会阿里云大数据计算服务(MaxCompute)专场,众安保险数据总监王超群带来MaxCompute助力众安保险方面的演讲。本文主要从MaxCompute优势开始谈起,进而谈及大数据能够为公司运营带来的好处,最后重点分析了众安保险的数据平台建设,包括任务调度、元数据和数据质量监控等。 以下是精彩内容整理: 众安保险作为国内第一家互联网公司,我们从创立之初计算平台就使用MaxCompute。 为什么会选择MaxCompute? 成立之初我们也在自建平台和MaxCompute上作出了选择,我们主要从五方面考虑:健壮性、与应用系统交互、扩展性、强数据安全和低成本。 健壮性:7*24的服务能力、异常恢复时长; 与应用系统交互:数据源的获取与数据输出效率和成本; 扩展性:当数据成倍增长时,计算能力弹性; 数据安全:数据异常攻击防护,提

优秀的个人博客,低调大师

物联网产业7年 变局中不断成长

物联网产业的媒体联动原素创办者李晓妍自2011年开始从事物联网媒体以来,目睹了中国物联网产业在最初这几年的跌宕起伏。此文就是她对物联网产业7年变局的见证。 翻阅物联网的相关资料,基本都显示“物联网”这一概念,是1995年比尔·盖茨在其《未来之路》一书中提出的。但是,物联网的“产业化概念”却起源于中国,这一点,想必全世界都会认同。 2009年8月,中国前总理温家宝在一次无锡视察中,听取了无锡物联网产业研究院负责人对“物联网产业化”的一些建议后,表示了认同,并提出了三条具体实施建议。此后,让“物联网”从学术概念走向了产业概念。无锡,也成为当之无愧的物联网产业发祥地。 截至2016年8月,物联网产业化概念整整走过了7年的历程。婚姻中有“7年之痒”一说,可以理解为7年是一个磨合期,跨过了这道坎,可能就离圆满结局更近一步;跨不过,或许就要一拍两散了。有时候感觉,这竟是对中国物联网产业发展历程的绝佳映射。因为中国物联网产业过去7年的发展,用“迂回曲折”已不足以形容。 物联网给无锡带来的喜与悲 首先,来说说物联网产业的发祥地——无锡。可以说,很多早期的物联网从业者,对无锡是很有感情的,也包括我。因为无锡是大部分从业者认知物联网的开始。但是应该说,无锡成就了物联网,物联网也成就了无锡;同时,无锡毁了物联网,物联网也毁了无锡。这个怎么解释呢?在中国,只要知道物联网的人,都知道它的发祥地是无锡,但接着就会说:“无锡代表的是传统物联网”,尤其是2014年以后参与到物联网产业的创业者们,更是表示“一提物联网,大家首先想到的就是智能抄表、RFID、追踪溯源等,所以我们更愿意提万物互联”。这可能就是作为开山鼻祖必须背的“黑锅”吧! 为什么说是黑锅呢?因为作为中国物联网产业的发祥地,无锡承担了很大一部分的“产业化试验”工作和责任。但是,当时很多产业化的条件都不成熟。 第一,物联网的技术路线还不清晰。是三层架构,还是四层架构;是类似于美国的M2M,仅包含传感层,还是包含了公网及更大范围的信息化系统集成等依然在争论中。 第二,没有清晰切入点,所以干脆“囫囵吞枣”。也就是说,大部分从业者都知道物联网带来的终极体验是:所有人和物都能够通过网络无障碍互联互通,却不知道该从哪儿下手。于是,就把想象中的这张终极大网,切分成无数个小系统,进行试验,名为物联网产业示范试点工程。中国最初的三个物联网示范工程——感知市民中心、智能机场安检等,便是由无锡于2010年1月推行实施的。此后,这一举措还被中央采纳,在全国推广,并且一直延续至今年。 第三,物联网的很多支撑技术和产品尚不成熟。比如传感器技术,当时智能传感器的概念在中国刚刚开始,掌握MEMS工艺的中国本土传感器企业寥寥无几。再比如短距离无线传输技术,RFID、NFC、ZigBee、Bluetooth、Wifi、PLC等都有参与其中,并且都曾在不同时段“艳压”过其它技术,但各自都有很大局限。像RFID的成本与应用场景、ZigBee的标准不统一、Wifi的高功耗,并且当时Wifi刚刚在中国解禁、PLC的干扰性大等问题,无一不对物联网产业的发展造成阻碍。再比如IT技术的云计算化升级也处于初期。自身都还处于混乱中,更别说支持物联网的发展了。还有当时大数据的概念还处于学术阶段,因为其技术基础Hadoop的发展才刚刚开始。 第四,大部分从业者的急于求成。2008金融海啸过后,中国企业太想快速找到下一个经济增长点。因而,当时房地产行业疯狂发展,中国的房价开涨都始于2008年。在那样的环境影响下,很多物联网从业者都希望物联网产业也能够像房地产一样,可以让其“一夜暴富”。这从一定程度上让物联网产业走上了一条不健康的发展路线。 而这些条件不成熟造成的后果就是:1)物联网产业没有像大家期待的那样,瞬间爆发;2)无锡没有像大家期许的那样,瞬间爆发;3)物联网企业,没有像自己想象的那样,瞬间爆发。而无锡这座——曾经因物联网而风光无限的城市,承担了这个后果的部分原罪。并且,它当时的付出,比如通过“530计划”为物联网创业者和企业提供的各种扶持,似乎都成了笑话。 不过,无锡并没有因此就放弃物联网产业。2013年以后,无锡看似不再大造声势了,但是却依然在暗暗发力,更或者是在向着更加扎实的方向探索。尤其是2016年,在中国被称为真正的“物联网产业发展之年”,无锡不仅提出了打造“物联网小镇”的行动方案,而且将第七届物联网博览会升级为“世界物联网博览会”,再次成为物联网产业各界集聚的核心。 2009-2013年:政府主导下的实验室阶段 其次,再看看这7年间,中国物联网产业的进阶历程。我一直比较倾向于将其分为3个阶段。第一个阶段(2009-2013年),可以称为“政府主导下的实验室”阶段,也就是无锡占据绝对主导地位的阶段。这个阶段又可以分为两个小节。 第一节是2009-2011年,在国务院指导下,中央各部委,及各省市纷纷出台如物联网专项基金扶持、物联网示范试点工程、税收优惠等“推动物联网产业发展”的政策。其中的“物联网应用试点示范工程(项目)”,应该说为物联网的产业化从设想到落地提供了试验田。据不完全统计,在2010年至2016年间,中央各部委及地方省市规划及打造的物联网示范试点工程逾千个,涉及项目过万个。当然,这着实养活了一批物联网企业,尤其在早期。记得2012年走访一家物联网企业的时候,该公司有一个叫做“企业发展部”的部门,该部门的主要工作是研究国家政策,申报各种扶持基金和项目,当时这是该公司的主要收入来源。 第二节是2012-2013年,中国政府出台了800亿物联网产业“造市”计划——打造智慧城市。中国住建部分别于2012年底和2013年下半年公布了两批智慧城市试点城市,共193个。每个试点城市都分批规划建设试点项目。瞬间又有过万个“智慧”项目启动。当时的物联网企业就是靠着这样的支撑一步步走下去的。 2014-2016年:局部市场主导阶段 第二个阶段(2014-2016年),局部进入市场主导阶段。但是,这个阶段开始的方式却颇为耐人寻味,始于2014年1月的Google收购Nest。这个事件成为了中国物联网产业发展最明显的分水岭。同时,也是中国物联网力量与国际物联网力量的首次会合。 当然,至今还有一部分人认为,物联网概念在其它国家并不盛行。但是就我看到的状况是,全球在信息科技领域占据主导地位的国家,在物联网产业均有布局,其中走在前列的应该是中国和美国,只是各自的提法不同,开始的切入点也不同。比如美国企业的切入方式更偏向于自上而下,即从支撑技术、产品开始;而中国企业一开始就选择自下而上,从应用开始。 这背后的原因之一可能要归结于,大部分中国人对物联网的理解是:它并非一向新技术,而是将既有技术的整合应用。但是总体来说,大家都从不同角度进行着对物联网的探索。Google收购Nest之后,或许让更多人看清了实现物联网的第一步——硬件智能化。 在此之前,中国参与物联网产业的都是大型企业,如电信运营商、从事B2B业务的大型信息化集成商等,即便是创业企业也是挂靠在政府下面的三产或者四产等等。就如前面所说,当时对物联网应用的理解,就是一个完整系统,大家都争着要做“物联网服务运营商”,并且当时所有能赚钱的物联网项目都是政府扶持的,所以资本不够雄厚、没有资源背景的中小企业,或者创业者根本没机会,而从事B2C业务的互联网公司们又看不上。 但是,Google收购Nest之后,中国的互联网巨头们好像瞬间觉醒了,开始频繁出现于物联网的各种活动和论坛上。同时,原来互联网圈子的投资机构也开始活跃于物联网圈子了。这给草根创业者们带来了前所未有的机遇。 因此,2014年,在物联网产业中一直探讨的“颠覆”出现了第一个迹象:资源移位。原本没有机会的,仅掌握着20%资本和资源,却占据80%人群份额的“草根”们,成为了物联网产业的主力军;在资本的煽动下,各种千奇百怪、异想天开的智能终端创意充斥于市场上;传统制造业,甚至传统IT产业都看不懂市场上在发生着什么,瞬间充满了危机感。这个时候,物联网看上去,终于配的起发起者对它最初的设想了。毕竟,资源分配都不改变,怎么能谈的上颠覆?! 也是在这一年,深圳成为了物联网产业的焦点,因为80%的智能硬件创业者都集聚在深圳。深圳竟然瞬间成为了中国科技城市的代表。记得2015年一本名为《迪拜视野》的杂志,列举了全球最具代表性的8个科技城市,其中,中国上榜的便是深圳。并且据说2016年拉斯维加斯的CES展上,四分之一的企业都来自中国深圳。 但是这个阶段,中国物联网产业取得的突破,都集中在人们生活相关的领域,比如今年中国新上市的白色家电100%实现了智能化;黑色家电40%实现了智能化;小型家电正在逐步走向智能化;小型化、便携式医疗设备大规模出现;智能家居产业火热,虽然仅停留在产业界。而在市政、民生、工业、农业等,原本买方就是政府,或企业的领域,突破依然有限。数月前在走访一家农业物联网企业时,了解到2016年开始,中国政府取缔了对农业物联网项目的资金扶持,农业物联网的推广便进入了举步维艰的地步。 2016年后:物联网迎来第二个春天 第三个阶段(2016年7月以后),整个物联网产业进入良性发展阶段。当然,说起发展,每个阶段其实都在发展。但是以前的发展应该说太过跌宕,太过迂回,太过不健康,所以不能算真正的发展。而2016年,应该说是各种条件都相对成熟后的发展,所以谓“良性发展”。 2016年7月,发生了一件震惊科技圈的大事件:软银322亿美元收购了全球领先的手机芯片设计厂商Arm。软银选择在这个时候收购Arm的原因,并非因为其是手机芯片领域的龙头,而是因为其打造了一款物联网操作系统——ArmEmbeddedOS。也就是说,软银意图的是整个物联网时代。 这个事件与其说是引发物联网产业第三次进阶的导火索,不如说是物联网产业过去7年探索的结果。因为,2016年实现物联网的很多条件和变量几乎都完备了。 第一,物联网的基石——云计算,技术基本达到成熟,并已经形成鲜明产业格局; 第二,物联网的应用支撑——大数据,底层技术架构已经相对稳定,Hadoop的地位已经确立,在某些领域如金融、环保、电力等,已经有成熟应用案例; 第三,物联网传输层的核心技术——NB-IOT和5G可以商用,对整个物联网产业的发展来讲,是一个极大地跨越; 第四,制造业的觉醒。这应该说对物联网产业的发展极其重要。因为物联网的核心是“物”,如果“物”的生产者和制造者不接受新技术,不接受变革,那么将拖慢整个产业的发展速度。 更重要地是,这一年,中国的物联网产业在工业与民用领域开始齐头并进,而不是像2013年前只重工业应用,也不是像2014、2015年间,民用独领风骚。这背后,应该说是政府力量和市场力量的共同推动。比如最近两年,中国政府针对工业4.0、智能制作推出了一系列扶持政策,以及示范试点项目。因为,工业不改革,物联网的应用便不会深入。就像互联网时代,无论说它怎么颠覆了传统产业,最终也只是改变了信息传播通道,以及消费领域的交易渠道。而工业占据着中国80%的经济份额,所以工业领域的变革,将带来的价值远远大于消费领域。总之,这个阶段,在中国,政府与市场开始合力推动物联网产业的发展。 不过,由于中国的经济特色,核心工业一直由政府主导,所以工业领域的变革开始后,或许将再次刷新中国科技城市的排名。当然,这一次,不仅无锡和深圳,很多其它城市如上海、杭州、南京、北京、成都等都已对物联网“虎视眈眈”,所以最终谁能胜出,很难评判。不过,从目前的状况来看,无锡的决心与力度似乎更大一些。 本文转自d1net(转载)

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册