前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >ClipDrawable让开发变得更简单

ClipDrawable让开发变得更简单

作者头像
Frank909
发布于 2019-01-14 10:02:52
发布于 2019-01-14 10:02:52
1.1K00
代码可运行
举报
文章被收录于专栏:Frank909Frank909
运行总次数:0
代码可运行

ClipDrawable让开发更简单

Android开发者对Drawable自然是无比熟悉,Drawable代表一类可以绘制的东西,它有许多继承类,常见的就是BitmapDrawable,此外ShapeDrawable,LayerListDrawable也用得比较多,这篇文章讲另外一个比较常见的类ClipDrawable。ClipDrawable非常简单,写博客是因为觉得它非常好用,有时候合理的运用能让代码编写过程中非常愉悦

ClipDrawable是Drawable中的一种,和我们常见的BitmapDrawable是同类。主要功能是能针对自身进行裁剪复制显示。

先看看效果图。

文章开头有说过Drawable,Drawable只是一个抽象类,它有许多子类,常见的有bitmapdrawable、LayerDrawable、LevelListDrawable和ClipDrawable等等。 大家可以看下它的源码。(代码有删简)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public abstract class Drawable {


    /**
     * Draw in its bounds (set via setBounds) respecting optional effects such
     * as alpha (set via setAlpha) and color filter (set via setColorFilter).
     *
     * @param canvas The canvas to draw into
     */
    public abstract void draw(Canvas canvas);


    /**
     * Create a drawable from inside an XML document using an optional
     * {@link Theme}. Called on a parser positioned at a tag in an XML
     * document, tries to create a Drawable from that tag. Returns {@code null}
     * if the tag is not a valid drawable.
     */
    public static Drawable createFromXmlInner(Resources r, XmlPullParser parser, AttributeSet attrs,
            Theme theme) throws XmlPullParserException, IOException {
        final Drawable drawable;

        final String name = parser.getName();
        if (name.equals("selector")) {
            drawable = new StateListDrawable();
        } else if (name.equals("animated-selector")) {
            drawable = new AnimatedStateListDrawable();
        } else if (name.equals("level-list")) {
            drawable = new LevelListDrawable();
        } else if (name.equals("layer-list")) {
            drawable = new LayerDrawable();
        } else if (name.equals("transition")) {
            drawable = new TransitionDrawable();
        } else if (name.equals("ripple")) {
            drawable = new RippleDrawable();
        } else if (name.equals("color")) {
            drawable = new ColorDrawable();
        } else if (name.equals("shape")) {
            drawable = new GradientDrawable();
        } else if (name.equals("vector")) {
            drawable = new VectorDrawable();
        } else if (name.equals("animated-vector")) {
            drawable = new AnimatedVectorDrawable();
        } else if (name.equals("scale")) {
            drawable = new ScaleDrawable();
        } else if (name.equals("clip")) {
            drawable = new ClipDrawable();
        } else if (name.equals("rotate")) {
            drawable = new RotateDrawable();
        } else if (name.equals("animated-rotate")) {
            drawable = new AnimatedRotateDrawable();
        } else if (name.equals("animation-list")) {
            drawable = new AnimationDrawable();
        } else if (name.equals("inset")) {
            drawable = new InsetDrawable();
        } else if (name.equals("bitmap")) {
            //noinspection deprecation
            drawable = new BitmapDrawable(r);
            if (r != null) {
               ((BitmapDrawable) drawable).setTargetDensity(r.getDisplayMetrics());
            }
        } else if (name.equals("nine-patch")) {
            drawable = new NinePatchDrawable();
            if (r != null) {
                ((NinePatchDrawable) drawable).setTargetDensity(r.getDisplayMetrics());
             }
        } else {
            throw new XmlPullParserException(parser.getPositionDescription() +
                    ": invalid drawable tag " + name);
        }

        drawable.inflate(r, parser, attrs, theme);
        return drawable;
    }


}

在上面的 createFromXmlInner() 方法中可以看到通过解析xml中的各种标签会创建相应的子类。今天我们的主题就是它的子类之一–ClipDrawable。

用法

ClipDrawable用法非常简单,ClipDrawable可以在xml文件配置,比如我在工程的res/drawable下创建一个文件 test_drawable.xml

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<?xml version="1.0" encoding="utf-8"?>
<clip xmlns:android="http://schemas.android.com/apk/res/android"
    android:drawable="@drawable/test"/>
</clip>

然后在activity_main.xml

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.frank.clipdrawabledemo.MainActivity">

    <TextView
        android:id="@+id/tv_info"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>
    <ImageView
        android:id="@+id/iv_show"
        android:layout_below="@id/tv_info"
        android:layout_width="match_parent"
        android:layout_height="500dp"
        android:background="@drawable/test_drawable"
        />
    <SeekBar
        android:id="@+id/seekbar"
        android:layout_below="@id/iv_show"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />
</RelativeLayout>

把ClipDrawable资源设置作为ImageView的background

然后在代码中

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
mSeekbar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
    @Override
    public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
        int max = seekBar.getMax();
        double scale = (double)progress/(double)max;
        ClipDrawable drawable = (ClipDrawable) mImageShow.getBackground();
        drawable.setLevel((int) (10000*scale));
        mTvShow.setText(progress+"");
    }

    @Override
    public void onStartTrackingTouch(SeekBar seekBar) {

    }

    @Override
    public void onStopTrackingTouch(SeekBar seekBar) {

    }
});

我们通过一个SeekBar来控制ClipDrawable的level,调用的是它的setLevel()方法。最终可以让它显示不同的比例。 效果就是前面的图像效果。

在ClipsDrawable中level取值从0~10000.其中0表示ClipDrawable完全不能显示,10000表示完全显示,而这之间的值对应着不同的比例。 ClipDrawable还可以在xml中布置它的方向,和它画面增长的位置。

方向

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
android:clipOrientation="vertical|horizontal"
android:gravity="left|right|top|bottom|center"

clipOrientation是指图像复制的方向是水平还是垂直。 ClipDrawable中默认的方向是horizontal,说明显示内容的增长是自横向的。当设置为vertical时,表明显示内容的增长是竖向的。 当然clipOrientation是和Gravity配合使用的。ClipDrawable中默认的clipOrientation是horizontal,而默认的gravity是left。 gravity可以看作是起点的位置,比如默认的left的话,表明水平方向,图像复制是从左边增长到右边。

接下来我们看具体的场景

右—->左

我们也可以让内容从右边向左边增长,只需要如下配置

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<clip xmlns:android="http://schemas.android.com/apk/res/android"
    android:drawable="@drawable/test"
    android:clipOrientation="horizontal"
    android:gravity="right">
</clip>

效果如下:

从中间向两边:

水平方向

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<clip xmlns:android="http://schemas.android.com/apk/res/android"
    android:drawable="@drawable/test"
    android:clipOrientation="horizontal"
    android:gravity="center">
</clip>

还有这样,垂直方向

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<clip xmlns:android="http://schemas.android.com/apk/res/android"
    android:drawable="@drawable/test"
    android:clipOrientation="vertical"
    android:gravity="center">
</clip>

从上到下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<clip xmlns:android="http://schemas.android.com/apk/res/android"
    android:drawable="@drawable/test"
    android:clipOrientation="vertical"
    android:gravity="top">
</clip>

从下到上:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<clip xmlns:android="http://schemas.android.com/apk/res/android"
    android:drawable="@drawable/test"
    android:clipOrientation="vertical"
    android:gravity="top">
</clip>

注意点

clipOrientation为horizontal时,gravity为top或者bottom时,会被处理为gravity为center. clipOritentation为vertical时,gravity为left或者right时,也会处理为gravity为center.

ClipDrawable的秘密和原理

掌握上面的方法,我们就可以愉快地玩耍了,可以应付很多场景了,比如系统的ProgressBar其实就运用了ClipDrawable作进度条的图像,进行水平方向的裁剪复制。但是,作为开发者而言,还可以稍微深入了解一下它的源码。

其实我看见ClipDrawable就在想它是怎么实现图像的裁剪的。那好,看源代码吧。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class ClipDrawable extends Drawable implements Drawable.Callback {
    private ClipState mClipState;
    private final Rect mTmpRect = new Rect();

    public static final int HORIZONTAL = 1;
    public static final int VERTICAL = 2;

    ClipDrawable() {
        this(null, null);
    }

    /**
     * @param orientation Bitwise-or of {@link #HORIZONTAL} and/or {@link #VERTICAL}
     */
    public ClipDrawable(Drawable drawable, int gravity, int orientation) {
        this(null, null);
        //ClipDrawable包裹其它的Drawable
        mClipState.mDrawable = drawable;
        mClipState.mGravity = gravity;
        mClipState.mOrientation = orientation;

        if (drawable != null) {
            drawable.setCallback(this);
        }
    }

    @Override
    public void inflate(Resources r, XmlPullParser parser, AttributeSet attrs, Theme theme)
            throws XmlPullParserException, IOException {
        super.inflate(r, parser, attrs, theme);

        int type;

        TypedArray a = obtainAttributes(
                r, theme, attrs, com.android.internal.R.styleable.ClipDrawable);

        int orientation = a.getInt(
                com.android.internal.R.styleable.ClipDrawable_clipOrientation,
                HORIZONTAL);
        int g = a.getInt(com.android.internal.R.styleable.ClipDrawable_gravity, Gravity.LEFT);
        Drawable dr = a.getDrawable(com.android.internal.R.styleable.ClipDrawable_drawable);

        a.recycle();

        final int outerDepth = parser.getDepth();
        while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
                && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) {
            if (type != XmlPullParser.START_TAG) {
                continue;
            }
            dr = Drawable.createFromXmlInner(r, parser, attrs, theme);
        }

        if (dr == null) {
            throw new IllegalArgumentException("No drawable specified for <clip>");
        }

        mClipState.mDrawable = dr;
        mClipState.mOrientation = orientation;
        mClipState.mGravity = g;

        dr.setCallback(this);
    }

    ......



    @Override
    protected boolean onLevelChange(int level) {
        mClipState.mDrawable.setLevel(level);
        invalidateSelf();
        return true;
    }

    @Override
    protected void onBoundsChange(Rect bounds) {
        mClipState.mDrawable.setBounds(bounds);
    }

    @Override
    public void draw(Canvas canvas) {

        if (mClipState.mDrawable.getLevel() == 0) {
            return;
        }

        final Rect r = mTmpRect;
        final Rect bounds = getBounds();
        int level = getLevel();
        int w = bounds.width();
        final int iw = 0; //mClipState.mDrawable.getIntrinsicWidth();
        if ((mClipState.mOrientation & HORIZONTAL) != 0) {
            w -= (w - iw) * (10000 - level) / 10000;
        }
        int h = bounds.height();
        final int ih = 0; //mClipState.mDrawable.getIntrinsicHeight();
        if ((mClipState.mOrientation & VERTICAL) != 0) {
            h -= (h - ih) * (10000 - level) / 10000;
        }
        final int layoutDirection = getLayoutDirection();
        Gravity.apply(mClipState.mGravity, w, h, bounds, r, layoutDirection);

        if (w > 0 && h > 0) {
            canvas.save();
            canvas.clipRect(r);
            mClipState.mDrawable.draw(canvas);
            canvas.restore();
        }
    }



    final static class ClipState extends ConstantState {
        Drawable mDrawable;
        int mChangingConfigurations;
        int mOrientation;
        int mGravity;


        ClipState(ClipState orig, ClipDrawable owner, Resources res) {
            if (orig != null) {
                if (res != null) {
                    mDrawable = orig.mDrawable.getConstantState().newDrawable(res);
                } else {
                    mDrawable = orig.mDrawable.getConstantState().newDrawable();
                }
                mDrawable.setCallback(owner);
                mDrawable.setLayoutDirection(orig.mDrawable.getLayoutDirection());
                mDrawable.setBounds(orig.mDrawable.getBounds());
                mDrawable.setLevel(orig.mDrawable.getLevel());
                mOrientation = orig.mOrientation;
                mGravity = orig.mGravity;
                mCheckedConstantState = mCanConstantState = true;
            }
        }

        @Override
        public Drawable newDrawable() {
            return new ClipDrawable(this, null);
        }

        @Override
        public Drawable newDrawable(Resources res) {
            return new ClipDrawable(this, res);
        }

        .....
    }

    ......
}

源码没有多少,我删简了一些。保留了主体信息。从源码中我们可以得到下面的信息:

  1. ClipDrawable中内部有一个状态类ClipState,它主要功能是保存原始的Drawable及orientation和gravity信息。
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
TypedArray a = obtainAttributes(
                r, theme, attrs, com.android.internal.R.styleable.ClipDrawable);

        int orientation = a.getInt(
                com.android.internal.R.styleable.ClipDrawable_clipOrientation,
                HORIZONTAL);
        int g = a.getInt(com.android.internal.R.styleable.ClipDrawable_gravity, Gravity.LEFT);

2. 在infalate()方法上面这段代码显示,如果在xml中没有指定clipOrientation默认为HORIZONTAL。如果在xml中没有指定gravity,默认是Gravity.LEFT。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Override
    protected boolean onLevelChange(int level) {
        mClipState.mDrawable.setLevel(level);
        invalidateSelf();
        return true;
    }


    @Override
    public void draw(Canvas canvas) {

        if (mClipState.mDrawable.getLevel() == 0) {
            return;
        }

        final Rect r = mTmpRect;
        final Rect bounds = getBounds();
        int level = getLevel();
        int w = bounds.width();
        final int iw = 0; //mClipState.mDrawable.getIntrinsicWidth();
        if ((mClipState.mOrientation & HORIZONTAL) != 0) {
            w -= (w - iw) * (10000 - level) / 10000;
        }
        int h = bounds.height();
        final int ih = 0; //mClipState.mDrawable.getIntrinsicHeight();
        if ((mClipState.mOrientation & VERTICAL) != 0) {
            h -= (h - ih) * (10000 - level) / 10000;
        }
        final int layoutDirection = getLayoutDirection();
        Gravity.apply(mClipState.mGravity, w, h, bounds, r, layoutDirection);

        if (w > 0 && h > 0) {
            canvas.save();
            canvas.clipRect(r);
            mClipState.mDrawable.draw(canvas);
            canvas.restore();
        }
    }

3. 我们在使用过程是通过ClipDrawable的setLevel()方法,这个方法会触发它的onLevelChange()方法。 在onLevleChange()中,会设置ClipState中的drawable的level。然后刷新自己,这样触发它的onDraw()方法,对自身进行绘制。 在onDraw()中通过获取level,然后计算结合它的方向,计算它显示的矩形范围,然后通过canvas.clipRect()方法。最终完成图片的裁剪显示.

所以归根到底,ClipDrawable的核心就是 setLevel()Canvas.clipRect()方法。 setLevel()设置显示比例, 然后在onDraw()方法中调用计算出来的矩形进行画面的裁剪,正是通过 canvas.clipRect().

总结

ClipDrawable是一个非常实用的类,合理的运用能让我们节省不少的图片资源,让代码显得整洁与优雅。试想一下,如果没有ClipDrawable去实现一个ProgressBar,我们可能要用多张不同宽度的图片去动态同步进度条的值,而有了CllipDrawable后,我们只要一张图片就可以搞定各种宽度的进度值。当然,我们可以根据实际的开发情况去定制自己的View。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2016年12月09日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
新CEO敲定!英特尔临时CEO担纲,50岁芯片航母驶向AI
1月的最后一天,英特尔官方宣布新CEO人选确定:现在的临时CEO罗伯特·斯旺(Robert Swan)转正,成为第七位正式CEO,掌舵这家50岁的芯片航母。
新智元
2019/05/08
5720
新CEO敲定!英特尔临时CEO担纲,50岁芯片航母驶向AI
"被逼"收购Mellanox,或许正是NVIDIA的最佳选择!
作为以色列第二大的IT科技企业,Mellanox被收购的消息已经成为一种习惯之后,大家也不知道它到底要不要被收购,以及被最终会被谁收购。
大数据在线
2019/07/08
9940
"被逼"收购Mellanox,或许正是NVIDIA的最佳选择!
继英特尔收购之后:Barefoot是否会成为下一个Fulcrum?
本月初,英特尔宣布将通过收购Barefoot,一举填补其交换机产品线的不足。Barefoot是P4网络设备编程语言的发明者,也是使用该语言的Tofino系列以太网交换机ASIC的创造者。这或许会给博通带来压力,因为Barefoot,Mellanox和Innovium等后起之秀正在试图赶超它。
SDNLAB
2019/06/21
1.5K0
继英特尔收购之后:Barefoot是否会成为下一个Fulcrum?
NVIDIA万亿AI数据中心革命
人工智能正以前所未有的速度重塑技术格局,而数据中心作为算力的核心载体,正经历一场价值万亿美元的颠覆性变革。NVIDIA凭借其GPU加速计算的先发优势,构建了从芯片到软件的端到端生态系统,成为这场“并行计算(EPP)”革命的领航者。
数据存储前沿技术
2025/03/28
1520
NVIDIA万亿AI数据中心革命
XPU时代创新者英特尔
英特尔此次同时推出了全新服务器GPU和oneAPI软件,意味着英特尔开始释放XPU的强大实力。
FPGA技术江湖
2021/04/14
4550
XPU时代创新者英特尔
NVIDIA GPU大幅领先AI时代 英特尔、AMD尾随追赶
NVIDIA已经远非昔日刻板印象中一家小型的GPU处理器供应商,在执行长黄仁勋的带领转型下,如今已经跃居独立型GPU(discrete GPU)市场的领跑者,更重要的是,NVIDIA把GPU的应用导入数据中心(data center)和车用电子(automotive)等领域,不再仅限于PC、笔记型计算机、平板计算机等的应用、大幅领跑人工智能(AI)时代,尤其正当NVIDIA积极跨足将GPU引入、增加企业对于AI的采用之际,更引来夙敌英特尔(Intel)、AMD等对手的尾随追赶。 NVIDIA结盟微软与IB
GPUS Lady
2018/04/02
9610
英伟达颠覆CPU!长发黄仁勋杀入英特尔地盘,Arm架构CPU性能高10倍
今年,「GPU大哥」英伟达居然「不讲武德」,发布一个基于Arm架构的新数据中心CPU Nvidia Grace,它将直接挑战英特尔在服务器和数据中心计算领域的主导地位。
新智元
2021/04/15
4790
英特尔,危矣?!
AMD将以350亿美元全股票收购赛灵思。至此,FPGA赛道中,赛灵思、Altera这两大领头羊均被大厂纳入麾下。
镁客网
2020/11/06
3270
英特尔,危矣?!
成立三年被英特尔20亿美元收购,这家以色列AI芯片公司做对了什么?
12 月初,外媒报道芯片制造商英特尔正洽谈收购以色列 AI 芯片制造商 Habana Labs 事宜,传闻很快得到印证,北京时间 12 月 16 日,英特尔表示以约 20 亿美元收购 Habana Labs。
机器之心
2019/12/24
5100
人工智能和云计算让芯片业洗牌,英特尔成了最大输家
陈桦 编译自 ZDNet 量子位 报道 | 公众号 QbitAI 人工智能、云计算、大数据、物联网,以及移动性的发展正在改变半导体行业的现状,而这次行业洗牌将会很有趣。 在新的行业秩序中,创新的工作任
量子位
2018/03/28
7690
人工智能和云计算让芯片业洗牌,英特尔成了最大输家
在网络中计算,Mellanox开创新一代智能网络丨科技云 · 云专访
机器学习、人工智能等应用的兴起,令业界对数据的传输速度、带宽与安全产生了越来越多的需求,Mellanox这个名字也开始广为人知。作为一家以InfiniBand网络起家的公司,Mellanox如今的业务已经不局限于IB网络本身,以太网业务则成长为了公司的主要业务
科技云报道
2022/04/14
1K0
在网络中计算,Mellanox开创新一代智能网络丨科技云 · 云专访
300亿美元,AMD为什么要买Xilinx?
自2015年5月,Intel(英特尔)以167亿美元收购FPGA生产商Altera后,半导体行业接连传出大整合。
AI科技大本营
2020/10/27
5690
300亿美元,AMD为什么要买Xilinx?
Mellanox真牛X,引无数英雄竞折腰!
据媒体报道,英特尔已出价55亿美元竞购Mellanox Technologies。
SDNLAB
2019/05/07
7870
Mellanox真牛X,引无数英雄竞折腰!
对标英特尔!英伟达首个CPU面世
今日凌晨,英伟达举办了一年一度影响人工智能及高性能计算技术盛会 NVIDIA GTC ,这是 GTC 大会继去年后第二次在线上举行。
SDNLAB
2021/04/16
4580
英伟达首款 CPU 面世,性能提升十倍,全面拥抱 ARM 生态
4 月 13 日凌晨,NVIDIA 创始人兼首席执行官黄仁勋又一次在自家厨房「举办」了一年一度的 GTC 2021 大会,会上黄教主围绕芯片、软件、服务、边缘计算、数据中心以及云,为粉丝们描述了NVIDIA对计算产业的未来愿景。
用户7454708
2023/05/08
3650
英伟达首款 CPU 面世,性能提升十倍,全面拥抱 ARM 生态
英伟达史上最大手笔!70亿美元拟收购Mellanox,全球芯片整合大潮拍岸
据外媒周日报道,芯片巨头英伟达公司已经接近达成收购以色列芯片制造商Mellanox的交易,交易金额可能超过70亿美元,双方可能在当地时间周一宣布这个消息。
新智元
2019/05/08
5220
英伟达史上最大手笔!70亿美元拟收购Mellanox,全球芯片整合大潮拍岸
英特尔为决战英伟达这次真的拼了!20亿美元收购AI芯片公司Habana Labs
12月16日,英特尔正式宣布以20亿美元收购Habana Labs。这是继153亿美元收购Mobileye、3.5亿美元收购Nervana之后,英特尔第三次收购大型人工智能初创公司。
新智元
2019/12/19
6070
英特尔为决战英伟达这次真的拼了!20亿美元收购AI芯片公司Habana Labs
“三新”组合拳问世,英特尔为数据创新扫除后顾之忧
如今,数据创新已然成为千行百业的共识,从人工智能某个训练算法,到行业用户的数字化转型战略,数据的力量可谓贯穿始终。就如石油必须经过提炼之后才能被各行各业所采用一样,数据也必须经过加工、整合、处理之后,才能被各种数据创新应用所采用。在2020英特尔数据创新峰会上,英特尔打出新平台、新方案、新伙伴的三张王牌,与合作伙伴打造面向未来数据和智能化的全栈解决方案,真正为千行百业的数据创新扫除后顾之忧。
大数据在线
2020/06/23
3210
智能变革:英特尔HPC高性能计算与AI人工智能解决方案和实例
在竞争日益激烈的环境中,数据中心作为传统信息化的基础,伴随着全面AI时代与5G、物联网的不断临近,企业希望获得出色的模拟和建模、人工智能(AI)和大数据分析功能,以便取得突破性的发现与创新,而高性能计算(HPC)基础设施能够为这些工作负载带来优势。
云上计算
2020/06/24
8130
智能变革:英特尔HPC高性能计算与AI人工智能解决方案和实例
芯片巨头们2019年的AI芯片之争会如何?
导语:本文分析了目前AI芯片市场的情况,以及NVIDIA在这一市场的领先地位。不过,随着芯片巨头在AI芯片领域有了新的进展,NVIDIA将会面临更多的挑战,2019年AI芯片市场会如何?
张哥编程
2024/12/19
1100
推荐阅读
相关推荐
新CEO敲定!英特尔临时CEO担纲,50岁芯片航母驶向AI
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档