当前位置: 首页 > 编程日记 > 正文

android自定义调节器控件 —— RegulatorView

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

RegulatorView效果图:

RegulatorView实现步骤:

1.新建java类RegulatorView.java,继承View类

2.定义必要基础属性,及为其附初始值

private final static int BTN_RADIUS=20;//拖动按钮的半径
private final static int BTN_CIRCLE_RADIUS=6;//拖动按钮的圆心半径
private final static int BAR_HEIGHT=6;//进度条的高度
private String barColor="#a82894ff";
private String circleColor="#902894ff";
private String txtColor="#ff2894ff";

private float currentValue=50;//当前值
private float maxValue=100;//最大值
private float minValue=0;//最小值
private boolean isShowText=false;//是否显示文字提示
private boolean isCanAdjust=false;//是否可以调节

3.实现init()方法,实例化画笔等属性

private void init(){mPaint = new Paint();
        mPaint.setAntiAlias(true);
//        mPaint.setTextSize(16);
        mBound = new Rect();//用于测量文字的宽度,以便准确无误地显示文字内容
        mPaint.getTextBounds(maxValue+"",0,(maxValue+"").length(),mBound);
    }

4.实现onMeasure(int arg0,int arg1)方法,测量控件的高度和宽度(由于是横向调节器,所以只需重新测量高度值就可以了,高度值和拖动按钮的半径有关)

@Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec){
        int widthSize = MeasureSpec.getSize(widthMeasureSpec);
        int heightMode = MeasureSpec.getMode(heightMeasureSpec);
        int heightSize = MeasureSpec.getSize(heightMeasureSpec);
        int height ;

        if (heightMode == MeasureSpec.EXACTLY){height = heightSize;
        } else {height = getPaddingTop() + BTN_RADIUS*2 + getPaddingBottom();
        }setMeasuredDimension(widthSize, height);
    }

5.实现onDraw()方法,根据相应的属性值绘制界面

绘制分为4步进行,具体实现请看文章后面的完整代码;这一步的实现已经可以看到控件的显示效果

@Override
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
protected void onDraw(Canvas canvas) {drawBg(canvas);//绘制整体背景
    drawBar(canvas);//绘制当前值的占比条
    drawBtn(canvas);//绘制当前值得调节按钮
    drawTxt(canvas);//绘制文本值(显示最大最小值及当前值)
}

6.实现onTouchEvent()方法以响应事件,实现调节功能,需要注意一点,界面的刷新操作是在设置当前值时才能调用(即:界面是否刷新取决于当前值是否改变,调节最大最小值时,当前值也需要调节,以确保整个控件逻辑的正确)

public void setCurrentValue(float currentValue) {this.currentValue = currentValue>maxValue?maxValue:currentValue;
    this.currentValue = this.currentValue<minValue?minValue:this.currentValue;
    if(onValueChangeListener!=null) onValueChangeListener.onValueChange(this.currentValue);
    invalidate();
}public void setMaxValue(float maxValue) {this.maxValue = maxValue<minValue?minValue:maxValue;
    setCurrentValue(currentValue);
    mPaint.getTextBounds(this.maxValue+"",0,(this.maxValue+"").length(),mBound);
}public void setMinValue(float minValue) {this.minValue = minValue>maxValue?maxValue:minValue;
    setCurrentValue(currentValue);
}
private float preX;
private boolean isMoveEvent=false;//用于判断当前事件是否为滑动事件
private boolean isDownInBtn=false;//用于判断是不是点击在滑动按钮上
@Override
public boolean onTouchEvent(MotionEvent event) {if(!isCanAdjust) return true;
    switch (event.getAction()) {case MotionEvent.ACTION_DOWN:preX=event.getX();
            isMoveEvent=false;
            isDownInBtn=isDownInBtn(preX);
            break;
        case MotionEvent.ACTION_MOVE:int disX=(int) (event.getX() - preX);
            if(Math.abs(disX)>3) isMoveEvent=true;
            preX=event.getX();
            if(isDownInBtn){//响应移动事件
                //计算当前值时,先计算出占比值再加上最小值,这样可以兼容负值计算
                setCurrentValue((preX-getPaddingLeft()-BTN_RADIUS)/getBarWidth()*(maxValue-minValue)+minValue);
            }break;
        case MotionEvent.ACTION_UP:preX=event.getX();
            if(!isMoveEvent){//响应点击事件
                if(!isDownInBtn){//计算当前值时,先计算出占比值再加上最小值,这样可以兼容负值计算
                    setCurrentValue((preX-getPaddingLeft()-BTN_RADIUS)/getBarWidth()*(maxValue-minValue)+minValue);
                }}break;
        default:break;
    }return true;
}

7.实现当前值变更回掉及各个功能的开关接口

以下是完整代码:

package com.hss.regulator;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import android.os.Build;
import android.support.annotation.RequiresApi;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;

/**
 * Created by Administrator on 2017/8/14.
 */

public class RegulatorView extends View {private final static int BTN_RADIUS=20;//拖动按钮的半径
    private final static int BTN_CIRCLE_RADIUS=6;//拖动按钮的圆心半径
    private final static int BAR_HEIGHT=6;//进度条的高度
    private String barColor="#a82894ff";
    private String circleColor="#902894ff";
    private String txtColor="#ff2894ff";

    private float currentValue=50;//当前值
    private float maxValue=100;//最大值
    private float minValue=0;//最小值
    private boolean isShowText=false;//是否显示文字提示
    private boolean isCanAdjust=false;//是否可以调节

    private Paint mPaint;
    private Rect mBound;

    public RegulatorView(Context context) {super(context);
        init();
    }public RegulatorView(Context context, AttributeSet attrs) {super(context, attrs);
        init();
    }public RegulatorView(Context context, AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);
        init();
    }@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)public RegulatorView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {super(context, attrs, defStyleAttr, defStyleRes);
        init();
    }private void init(){mPaint = new Paint();
        mPaint.setAntiAlias(true);
//        mPaint.setTextSize(16);
        mBound = new Rect();//用于测量文字的宽度,以便准确无误地显示文字内容
        mPaint.getTextBounds(maxValue+"",0,(maxValue+"").length(),mBound);
    }private float preX;
    private boolean isMoveEvent=false;//用于判断当前事件是否为滑动事件
    private boolean isDownInBtn=false;//用于判断是不是点击在滑动按钮上
    @Override
    public boolean onTouchEvent(MotionEvent event) {if(!isCanAdjust) return true;
        switch (event.getAction()) {case MotionEvent.ACTION_DOWN:preX=event.getX();
                isMoveEvent=false;
                isDownInBtn=isDownInBtn(preX);
                break;
            case MotionEvent.ACTION_MOVE:int disX=(int) (event.getX() - preX);
                if(Math.abs(disX)>3) isMoveEvent=true;
                preX=event.getX();
                if(isDownInBtn){//响应移动事件
                    //计算当前值时,先计算出占比值再加上最小值,这样可以兼容负值计算
                    setCurrentValue((preX-getPaddingLeft()-BTN_RADIUS)/getBarWidth()*(maxValue-minValue)+minValue);
                }break;
            case MotionEvent.ACTION_UP:preX=event.getX();
                if(!isMoveEvent){//响应点击事件
                    if(!isDownInBtn){//计算当前值时,先计算出占比值再加上最小值,这样可以兼容负值计算
                        setCurrentValue((preX-getPaddingLeft()-BTN_RADIUS)/getBarWidth()*(maxValue-minValue)+minValue);
                    }}break;
            default:break;
        }return true;
    }private boolean isDownInBtn(float x){float left=getBarWidth()*(currentValue-minValue)/(maxValue-minValue)+getPaddingLeft();
        float right=getBarWidth()*(currentValue-minValue)/(maxValue-minValue)+getPaddingLeft()+BTN_RADIUS*2;
        if(x>=left&&x<=right) return true;
        return false;
    }@Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec){
//        int widthMode = MeasureSpec.getMode(widthMeasureSpec);
        int widthSize = MeasureSpec.getSize(widthMeasureSpec);
        int heightMode = MeasureSpec.getMode(heightMeasureSpec);
        int heightSize = MeasureSpec.getSize(heightMeasureSpec);
//        int width;
        int height ;

        if (heightMode == MeasureSpec.EXACTLY){height = heightSize;
        } else {height = getPaddingTop() + BTN_RADIUS*2 + getPaddingBottom();
        }setMeasuredDimension(widthSize, height);
    }@Override
    @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)protected void onDraw(Canvas canvas) {drawBg(canvas);//绘制整体背景
        drawBar(canvas);//绘制当前值的占比条
        drawBtn(canvas);//绘制当前值得调节按钮
        drawTxt(canvas);//绘制文本值(显示最大最小值及当前值)
    }@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)private void drawBg(Canvas canvas){mPaint.setColor(Color.WHITE);
        float left=getPaddingLeft()+BTN_RADIUS;
        float top=(getMeasuredHeight()-BAR_HEIGHT)/2.0f;
        float right= getBarWidth()+left;
        float bottom=top+BAR_HEIGHT;
        canvas.drawRoundRect(left,top,right,bottom,2,2,mPaint);
//        canvas.drawRect(left,top,right,bottom,mPaint);
    }@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)private void drawBar(Canvas canvas){mPaint.setColor(Color.parseColor(barColor));
        float left=getPaddingLeft()+BTN_RADIUS;
        float top=(getMeasuredHeight()-BAR_HEIGHT)/2;
        float right;
        if(maxValue!=minValue)//处理最大和最小值相等的情况
            right=getBarWidth()*(currentValue-minValue)/(maxValue-minValue)+left;
        else right= getBarWidth()+left;
        float bottom=top+BAR_HEIGHT;
        canvas.drawRoundRect(left,top,right,bottom,2,2,mPaint);
//        canvas.drawRect(left,top,right,bottom,mPaint);
    }private void drawBtn(Canvas canvas){mPaint.setColor(Color.parseColor(circleColor));
        float cx;
        if(maxValue!=minValue)//处理最大和最小值相等的情况
            cx=getBarWidth()*(currentValue-minValue)/(maxValue-minValue)+getPaddingLeft()+BTN_RADIUS;
        else cx=getBarWidth()+getPaddingLeft()+BTN_RADIUS;
        float cy=getMeasuredHeight()/2;
        canvas.drawCircle(cx,cy,BTN_RADIUS,mPaint);
        mPaint.setColor(Color.parseColor(barColor));
        canvas.drawCircle(cx,cy,BTN_CIRCLE_RADIUS,mPaint);
    }private void drawTxt(Canvas canvas){if(!isShowText) return;
        mPaint.setColor(Color.parseColor(txtColor));
        float x=getPaddingLeft()+BTN_RADIUS;
        float y=mPaint.getTextSize();
        canvas.drawText(minValue+"",x,y,mPaint);

        float textWidth = mBound.width();
        x=getWidth()-getPaddingRight()-BTN_RADIUS-textWidth;
        canvas.drawText(maxValue+"",x,y,mPaint);

        if(maxValue!=minValue)//处理最大和最小值相等的情况
            x=getBarWidth()*(currentValue-minValue)/(maxValue-minValue)+getPaddingLeft()+BTN_RADIUS*2;
        else x=getBarWidth()+getPaddingLeft()+BTN_RADIUS*2;
        canvas.drawText(currentValue+"",x,y,mPaint);
    }private int getBarWidth(){return getMeasuredWidth()-getPaddingLeft()-getPaddingRight()-BTN_RADIUS*2;
    }public float getCurrentValue() {return currentValue;
    }public void setCurrentValue(float currentValue) {this.currentValue = currentValue>maxValue?maxValue:currentValue;
        this.currentValue = this.currentValue<minValue?minValue:this.currentValue;
        if(onValueChangeListener!=null) onValueChangeListener.onValueChange(this.currentValue);
        invalidate();
    }public float getMaxValue() {return maxValue;
    }public void setMaxValue(float maxValue) {this.maxValue = maxValue<minValue?minValue:maxValue;
        setCurrentValue(currentValue);
        mPaint.getTextBounds(this.maxValue+"",0,(this.maxValue+"").length(),mBound);
    }public float getMinValue() {return minValue;
    }public void setMinValue(float minValue) {this.minValue = minValue>maxValue?maxValue:minValue;
        setCurrentValue(currentValue);
    }public boolean isShowText() {return isShowText;
    }public void setShowText(boolean showText) {isShowText = showText;
    }public boolean isCanAdjust() {return isCanAdjust;
    }public void setCanAdjust(boolean canAdjust) {isCanAdjust = canAdjust;
    }private OnValueChangeListener onValueChangeListener=null;

    public OnValueChangeListener getOnValueChangeListener() {return onValueChangeListener;
    }public void setOnValueChangeListener(OnValueChangeListener onValueChangeListener) {this.onValueChangeListener = onValueChangeListener;
    }public interface OnValueChangeListener{void onValueChange(float value);
    }
}

转载于:https://my.oschina.net/u/3614895/blog/1510013

相关文章:

如何利用 C# 实现 K-D Tree 结构?

我的朋友海伦一直使用在线约会网站寻找适合自己的约会对象。尽管约会网站会推荐不同的人选&#xff0c;但她没有从中找到喜欢的人。经过一番总结&#xff0c;她发现曾交往过三种类型的人&#xff1a; 不喜欢的人魅力一般的人极具魅力的人 尽管发现了上述规律&#xff0c;但海…

[恩难到了]陨石的秘密

【描述】 公元19881231年&#xff0c;一颗巨大的陨石坠落在世界的政治文化中心cs。于是&#xff0c;灾难降临了&#xff0c;地球上出现了一系列反常的现象。当人们焦急万分的时候&#xff0c;一支由cs科学家组成的考察队赶到了出事地点。经过一番侦察&#xff0c;科学家们发现陨…

java培训学习阶段步骤讲解

目前的培训机构行业比较热门的IT技术就是java技术&#xff0c;java技术在近几年广受关注&#xff0c;java所涉及的技术知识也比较广泛&#xff0c;下面小编就为大家详细的介绍一下java培训学习多有哪几个阶段? java培训学习多有哪几个阶段&#xff1a; 第一阶段、Java设计和编…

资料分享:送你一本《机器学习实战》电子书!

这两天&#xff0c;各985高校发布了考研初试分数线。从中发现这两年大数据相关专业的分数线暴涨啊。没有400分估计心里都没底啊。可见大数据这个领域有多火爆&#xff01;而机器学习是我们团队的一个主要方向&#xff0c;新加入的同学通常都是从《机器学习实战》这本书开始入门…

HDU 6091 - Rikka with Match | 2017 Multi-University Training Contest 5

思路来自 某FXXL 不过复杂度咋算的.. /* HDU 6091 - Rikka with Match [ 树形DP ] | 2017 Multi-University Training Contest 5 题意&#xff1a;给出N个点的树&#xff0c;求去边的方案数使得 去边后最大匹配数是M的倍数限制&#xff1a; N<5e4, M<200 分析&#xff…

在别的电脑上运行cg程序出现错误的解决办法

错误&#xff1a;没有找到cg.dll&#xff0c;因为这个应用程序未能启动。重新安装应用程序可能会修复此问题 解决方法&#xff1a;复制cg.dll到system32 、debug中 错误&#xff1a;没有找到cgGL.dll&#xff0c;因为这个应用程序未能启动。重新安装应用程序可能会修复此问题 解…

HTML在网页设计中是什么作用?

HTML是一种超文本传输协议&#xff0c;规定了浏览器与服务端之间数据传输的格式&#xff0c;是一种标识性的代码语言&#xff0c;它的中文翻译是“超文本标记语言”&#xff0c;主要是通过HTML标签对网页中的文本、图片、声音等内容进行描述。HTML提供了许多标签&#xff0c;如…

如何实现链接只能被点击一次

有时候&#xff0c;只希望网站某个链接只能被点击一次&#xff0c;怎么做呢&#xff1f;下面给出3中方法&#xff01;第一种&#xff1a;利用JS在点击后把href变成#把taget变成空。 <p><a onclick"var that this;setTimeout(function(){that.removeAttribute(hr…

匿名类型和Object转换

.net中的匿名类型非常好用&#xff0c; 但是开发中遇到一个问题&#xff0c;当把匿名类型作为返回值的时候&#xff0c;会变成object类型&#xff0c;如果才能再转换能对应的匿名类型呢? 1 //返回匿名类型的函数, 会转换成object类型2 object ReturnAnonymous() {3 retur…

资料分享:送你一本《数据结构(C#语言版)》电子书!

对于信息类专业的学生而言&#xff0c;数据结构与算法是一门必修的课程。只有学好这门课程&#xff0c;熟练掌握线性表、栈、队列、树、图等基本结构&#xff0c;以及在这些结构上的各种算法&#xff0c;才能利用计算机去解决实际问题。 如何学好这门课程呢&#xff0c;给大家…

新手入门API测试必要了解的知识

什么是API?API是Application Programming Interface的简写。实现了两个或多个独立系统或模块间的通信和数据交换能力。 什么是API测试?API测试是不同于UI级自动化测试&#xff0c;其主要关注在系统架构的业务逻辑层&#xff0c;所以其主要关注不在于UI操作或用户感观上&#…

java监控多个线程的实现

场景&#xff1a;需要启动多线程处理事情&#xff0c;而在所有事情做完之后&#xff0c;需要修改系统状态&#xff1b;那么如何判断所有线程&#xff08;事情&#xff09;都做完了呢&#xff1f;这就需要判断所有当前运行的线程状态了。 代码 importjava.util.concurrent.Count…

如何利用 C# 实现神经网络的感知器模型?

前几天我们介绍了 如何利用 C# 对神经网络模型进行抽象&#xff0c;在这篇图文中&#xff0c;我们抽象了单个神经元 Neuro&#xff0c;网络层 Layer&#xff0c;网络结构 Network&#xff0c;激活函数 IActivationFunction&#xff0c;以及监督学习 ISupervisedLearning 和非监…

JPA增删改查,

2019独角兽企业重金招聘Python工程师标准>>> 1. //And --- 等价于 SQL 中的 and 关键字 public List<User> findByHeightAndSex(int height,char sex); 2. // Or --- 等价于 SQL 中的 or 关键字 public List<User> findByHeightOrSex(int height,cha…

Java新手会遇到的三大误区,一定要避免!

很多学习java技术的学员都是零基础学员&#xff0c;之前对java技术一点都不了解&#xff0c;所以java新手在学习java技术的时候很容易进入误区&#xff0c;下面小编分享的Java新手会遇到的三大误区&#xff0c;一定要避免! 作为目前最为广泛的网络编程语&#xff0c;Java凭借其…

[ACM] hdu 1253 胜利大逃亡 (三维BFS)

胜利大逃亡 Problem DescriptionIgnatius被魔王抓走了,有一天魔王出差去了,这但是Ignatius逃亡的好机会.魔王住在一个城堡里,城堡是一个A*B*C的立方体,能够被表示成A个B*C的矩阵,刚開始Ignatius被关在(0,0,0)的位置,离开城堡的门在(A-1,B-1,C-1)的位置,如今知道魔王将在T分钟后…

如何利用 C# 爬取带 Token 验证的网站数据?

在对文本数据的情感分析中&#xff0c;基于情感词典的方法是最简单也是最常用的一种了。 它的大体思路如下&#xff1a; 对文档分词&#xff0c;找出文档中的情感词、否定词以及程度副词&#xff0c;然后判断每个情感词之前是否有否定词及程度副词&#xff0c;将它之前的否定…

多线程显示运行状态

最近碰见一个例子&#xff0c;Copy大文件或者网络访问的时候处理假死。 那就用多线程加个进度条(只显示运行&#xff0c;没有进度)来表示状态运行吧。好了&#xff0c;废话少说&#xff0c;上个例子。先看结果图&#xff1a; 程序说明&#xff1a; 点击Button&#xff0c;运行…

【Python培训基础知识】单例模式

单例模式是保证一个类仅有一个实例的设计模式。Windows中的任务管理器就是一个典型的单例模式软件。Windows任务管理器如图所示。 Windows任务管理器只能打开一个&#xff0c;即使用户重复打开&#xff0c;也只能获得一个实例&#xff0c;这不同于Word等软件可以打开多个实例。…

Android读写XML(上)

XML 经常用作 Internet 上的一种数据格式&#xff0c;其文件格式想必大家都比较清楚&#xff0c;在这里我结合Android平台&#xff0c;来说明Android SDK提供的读写XML的package。 首先介绍下Android SDK与Java SDK在读写XML文件方面&#xff0c;数据包之间的关系。Android 平台…

Lighttpd1.4.20源代码分析 笔记 状态机之错误处理和连接关闭

这里所说的错误有两种&#xff1a; 1.http协议规定的错误&#xff0c;如404错误。 2.server执行过程中的错误。如write错误。 对于http协议规定的错误&#xff0c;这里的“错误”是针对client的。lighttpd返回相应的错误提示文件之后&#xff0c;相当于顺利的完毕了一次请求&…

资料分享:送你一本《数据结构(C语言版)》电子书!

要想写出可复用、可扩展、易维护、灵活性好的代码&#xff0c;「数据结构」这一关必须要过啊&#xff01; 在数据结构与算法的众多教材中&#xff0c;奉为经典的当属清华大学严蔚敏老师的著作。很多学校也选择这本书作为考研指定教材。 正在学习数据结构与算法这门课程的同学…

零基础学python培训需要学习多久?

Python是一种入门比较简单的编程语言&#xff0c;但是如果是零基础学员&#xff0c;学习起来还是需要时间的&#xff0c;那么零基础学python培训需要学习多久呢?我们来看看小编的详细介绍吧。 零基础学python培训需要学习多久? 现在的培训机构&#xff0c;一般Python的培训时…

拖动无标题窗体

方法一&#xff1a; 当用户点击窗体的时候欺骗系统&#xff0c;用户是点在标题栏上&#xff0c;这样就完成了无标题栏窗体的拖动&#xff0c;实现如下&#xff1a; 在 MESSAGE_HANDLER(WM_NCHITTEST, OnNcHitTest) 这个函数的方法里 &#xff1a; LRESULT CNyWnd::OnNcHitTest(…

如何利用 C# 爬取Gate.io交易所的公告!

对于大部分程序员来说&#xff0c;都希望自己或多或少拥有一些比特币&#xff08;BTC&#xff09;。获取 BTC 的途径除了挖矿计算 Hash 值之外&#xff0c;就是去交易所购买了。 由于 BTC 的价格波动非常剧烈&#xff0c;入手 BTC 的时机就显得尤为关键。在交易所搞活动时入手…

人的原罪、本我和超我

摘自&#xff1a;https://www.zhihu.com/question/31362451/answer/51606300人的原罪的存在&#xff0c;因为人人皆有&#xff0c;所以在潜意识中&#xff0c;形成了对本我的接纳&#xff0c;而神爱世人与宽恕的存在&#xff0c;形成了本我与超我的良性互动。 在这样的关系中&a…

软件测试的准入准出是什么?标准是什么?

测试的准入准出是指什么情况下可以开始当前版本的测试工作&#xff0c;什么情况下可以结束当前版本的测试工作。不同项目、不同公司的测试准入准出标准都会有所不同。下面介绍一些通用的测试准入准出标准。 测试准入标准如下&#xff1a; (1)开发编码结束&#xff0c;开发人员在…

如何利用 C# 爬取 One 持有者返利数据!

去年&#xff0c;10月份写过一篇图文 「One」的投资价值分析&#xff0c;多半年过去了&#xff0c;回头看看当时的判断还是合理的。 投资这种事情需要有自己的策略&#xff0c;更需要理性。任何决策都需要以数据作为判断的基础&#xff0c;哪么是否还继续持有 ONE呢&#xff1f…

04.微博消息的语言检测

04.微博消息的语言检测 郑昀 201010 隶属于《02.数据解析》小节 大意是&#xff0c;封装Google语言检测ajax web service的接口&#xff0c;输入一段话&#xff0c;输出语言种类。这个方法是从RssMeme.com看来的&#xff0c;经测试效果还不错&#xff0c;可用于检测微博客消息的…

CIO时代学院院长姚乐:传统行业遇上大数据 拥抱智能化未来

近几年&#xff0c;互联网行业发展突飞猛进&#xff0c;“大数据”技术瞬间变得炙手可热&#xff0c;当然&#xff0c;对于发展中的大数据技术而言&#xff0c;很多行业都不会错失良机。近日&#xff0c;CIO时代学院院长、中国新一代IT产业推进联盟秘书长姚乐在“2016CIO时代中…