bar 订阅
bar是一个常用的压强单位。早先气象学中常用毫巴,后改用等值的国际单位百帕。 展开全文
bar是一个常用的压强单位。早先气象学中常用毫巴,后改用等值的国际单位百帕。
信息
工    程
公斤力
定    义
压强单位
中文名
外文名
bar
变速器常用术语
1巴(bar)=100千帕(kPa)=10牛顿/平方厘米(N/cm2)=0.1MPa应用:The output of active support system controller is current between 4~20 ma; 4ma is proportional to 0.2 bar and 20 ma is proportional to 1 bar pressure at the output of the I/P converter. [1]  1毫巴(mbar)=0.001巴(bar)=100帕(Pa)巴(bar)是压强的单位,早先气象学中常用毫巴,后改用等值的国际单位百帕。1帕=1N/m2.在工程上仍在沿用公斤力这个单位,1公斤力等于9.80665牛顿,由此得出:1公斤力/平方厘米=0.967841大气压=98066.5帕斯卡=1个工程大气压毫米汞柱也是一种常用的压强单位,由1毫米汞柱产生的压力定义的压强单位为托(Torr)。1托=1毫米汞柱=133.32帕斯卡1大气压=760托
收起全文
精华内容
下载资源
问答
  • S-Bar2.0 驱动

    2014-10-10 14:04:31
    微星摄像头使用的驱动 微星驱动 S-Bar2.0 S-Bar 摄像头驱动
  • 【PCIe】如何获取PCIe的BAR空间大小?

    千次阅读 2020-03-15 17:57:28
    参考文章: 本文的重点就是“如何获取BAR空间长度...其中Type0 Header最多有6个BAR,而Type1 Header最多有两个BAR。这就意味着,对于Endpoint来说,最多可以拥有6个不同的地址空间。但是实际应用中基本上不会用到...

    本文的重点就是“如何获取BAR空间长度”,在此之前,先铺垫一些基础。


    基本原理:

    基地址寄存器(BAR)在配置空间(Configuration Space)中的位置如下图所示:

    其中Type0 Header最多有6个BAR,而Type1 Header最多有两个BAR。这就意味着,对于Endpoint来说,最多可以拥有6个不同的地址空间。但是实际应用中基本上不会用到6个,通常1~3个BAR比较常见。

    主要注意的是,如果某个设备的BAR没有被全部使用,则对应的BAR应被硬件全被设置为0,并且告知软件这些BAR是不可以操作的。对于被使用的BAR来说,其部分低比特位是不可以被软件操作的,只有其高比特位才可以被软件操作。而这些不可操作的低比特决定了当前BAR支持的操作类型和可申请的地址空间的大小。


    《PCIe 体系结构导读》2.3.2 (10)中提到,当PCI设备复位后,BAR寄存器将用于存放初始化信息,包括 IO/存储器空间、32bit/64bit地址解码、支持可预读/不可预读、BAR空间的长度等等信息,那如何获取这些信息呢?

    其实,在BAR寄存器[3:0]属性字段用于记录这些信息,软件读取BAR的值,其中操作的类型一般由最低四位所决定,具体如下图所示。


    如何获取PCIe设备的BAR空间长度?

    通过BAR寄存器[3:0]属性字段可以获取BAR的操作类型等信息,那么BAR空间长度又要如何获取呢?

    如图中(1)所示,未初始化的BAR的低比特(11~4)都是0,高比特(31~12)都是不确定的值。所谓初始化,就是系统(软件)向整个BAR都写1,来确定BAR的可操作的最低位是哪一位。当前可操作的最低位为12,因此当前BAR可申请的(最小)地址空间大小为4KB(2^12)。如果可操作的最低位为20,则该BAR可申请的(最小)地址空间大小为1MB(2^20)。

    下面是一个申请64MB P-MMIO地址空间的例子,由于采用的是64-bit的地址,因此需要两个BAR。具体如下图所示:

    注:需要特别注意的是,软件对BAR的检测与操作(Evaluating)必须是顺序执行的,即先BAR0,然后BAR1,……,直到BAR5。当软件检测到那些被硬件设置为全0的BAR,则认为这个BAR没有被使用。

    注:无论是PCI还是PCIe,都没有明确规定,第一个使用的BAR必须是BAR0。事实上,只要设计者原意,完全可以将BAR4作为第一个BAR,并将BAR0~BAR3都设置为不使用。


    代码分析:

    本文的重点就是“如何获取BAR空间长度”,代码的重点是“__pci_read_base”函数,在此之前,先介绍一下PCI总线枚举时,如何调用到该函数。

    在PCI Agent设备进行数据传送之前,系统软件需要初始化PCI Agent设备的BAR0~5寄存器。系统软件使用DFS算法对PCI总线进行遍历时,完成这些寄存器的初始化,即分配这些设备在PCI总线域的地址空间。当这些寄存器初始化完毕后,PCI设备可以使用PCI总线地址进行数据传递。

    pci_scan_child_bus  //PCI总线树枚举,分配PCI总线树的PCI总线号
        |——pci_scan_slot  //扫描当前PCI总线所有设备,加入设备队列
            |——pci_scan_device  //对PCI设备的配置寄存器进行读写操作
                |——pci_setup_device  //判断PCI设备类型
                    |——pci_read_irq  //获取Interrupt pin和Line,赋值到irq参数
                    |——pci_read_bases  //访问PCI设备的BAR空间和ROM空间
                        |——__pci_read_base  //初始化resource参数
    

    接下来单独讲解 __pci_read_base函数,仅介绍该函数获取BAR空间长度的办法。

    int __pci_read_base(struct pci_dev *dev, enum pci_bar_type type,
    		    struct resource *res, unsigned int pos)
    {
        mask = type ? PCI_ROM_ADDRESS_MASK : ~0;
        ...
        pci_read_config_dword(dev, pos, &l);
    	pci_write_config_dword(dev, pos, l | mask);
    	pci_read_config_dword(dev, pos, &sz);
    	pci_write_config_dword(dev, pos, l);
     
     	if (sz == 0xffffffff)  //如果BAR上每一位都能设置意味其不能正常工作
          sz = 0;
        ...
        if (res->flags & IORESOURCE_MEM_64) {
            	pci_read_config_dword(dev, pos + 4, &l);
    		pci_write_config_dword(dev, pos + 4, ~0);
    		pci_read_config_dword(dev, pos + 4, &sz);
    		pci_write_config_dword(dev, pos + 4, l);
      
      		l64 |= ((u64)l << 32);
    		sz64 |= ((u64)sz << 32);
    		mask64 |= ((u64)~0 << 32);
        }
        sz64 = pci_size(l64, sz64, mask64);  //计算并获取BAR空间长度
        ...
        region.start = l64;
    	 region.end = l64 + sz64;
        ...
    }
    

    其中,pci_size函数中,相应操作如下:

    static u64 pci_size(u64 base, u64 maxbase, u64 mask)
    {
    	u64 size = mask & maxbase;	/* Find the significant bits */
    	if (!size)
    		return 0;
    
    	/* Get the lowest of them to find the decode size, and
    	   from that the extent.  */
    	size = (size & ~(size-1)) - 1;
    
    	/* base == maxbase can be valid only if the BAR has
    	   already been programmed with all 1s.  */
    	if (base == maxbase && ((base | size) & mask) != mask)
    		return 0;
    
    	return size;
    }
    

    pci_size函数中最重要的便是这个公式:size = (size & ~(size-1)) - 1;

    其中,size就是之前读到的 sz64&mask64。

    最后通过pci_size函数返回值,就能得到BAR空间长度。


    这个BAR空间长度有什么作用?

    得到size值后,可以用处初始化 pci_dev->resource的start和end参数。

    pci_resource_len函数就是用于记录BAR的空间长度。

    通过pci_resource_start函数获取BAR起始地址,再加上pci_resource_len得到BAR空间长度,就能计算出当前BAR的有效范围。


    实例分析:

    以Hi3536为例,看下BAR空间大小可以如何配置。

    一般而言,BAR地址空间申请大小,是有EP设备默认设置,RC侧无法修改(除非EP支持bar resize capabilty,需要软件支持)。

    当前PCIE 各个BAR提供灵活的BAR_MASK寄存器(地址是PCIE CFG Base address+0x1000+0x10+N*4),和BAR寄存器[3:0]属性字段(是否可预取,是否是32位还是64位地址,是否是IO属性还是MEM属性)一起配合使用,可以达到扩展64位bar,调整bar mask大小的目的。

            bar mask[0]是使能当前bar;

    bar mask[31:1]是MASK大小。

    注:如果当前bar是1/3/5,需要bar0/2/4配合一起使用64位bar地址,则不能使能。


    例如,将当前bar0扩展为64 位可预取存储器地址,地址空间扩大为64M byte;则需要使用到bar1,其修改办法如下:

    步骤 1:EP本地软件设置bar0 mask为0x3FF_FFFF;bar0[0]表示使能当前bar0,其bar mask[25:1]为全1,则当前bar0的[25:4]都不可操作,bar0的[31:26]可以由HOST修改。(即:当前可操作的最低位为26,因此当前BAR可申请的(最小)地址空间大小为64MB(2^26)

    步骤 2:EP本地软件设置bar1 mask为0x0;表示不使能当前bar1,其bar mask[31:1]为全0,则当前bar1 所有地址都可以由HOST修改。

    步骤 3:EP本地软件设置bar0为0xC;表示申请的是64 位可预取存储器地址

    步骤 4:HOST 扫描EP。

    ----结束


    Hi3536 uboot下PCIe config代码如下:

    int pcie_conf(void)
    {
        ...
        /*memory space enable*/
    	__raw_writel(0x2, HISI3536_PCIE_CONFIG_BASE + CFG_COMMAND_REG);
    
    	__raw_writel(0xc, HISI3536_PCIE_CONFIG_BASE + CFG_BAR0_REG);
    	__raw_writel(0x0, HISI3536_PCIE_CONFIG_BASE + CFG_BAR1_REG);
    	__raw_writel(0xc, HISI3536_PCIE_CONFIG_BASE + CFG_BAR2_REG);
    	__raw_writel(0x0, HISI3536_PCIE_CONFIG_BASE + CFG_BAR3_REG);
    	__raw_writel(0x0, HISI3536_PCIE_CONFIG_BASE + CFG_BAR4_REG);
    	__raw_writel(0x0, HISI3536_PCIE_CONFIG_BASE + CFG_BAR5_REG);
    
    	__raw_writel(0x03ffffff, HISI3536_PCIE_CONFIG_BASE + 0x1000 + 0x10 + 4 * 0);
    	__raw_writel(0x0       , HISI3536_PCIE_CONFIG_BASE + 0x1000 + 0x10 + 4 * 1);
    	__raw_writel(0x03ffffff, HISI3536_PCIE_CONFIG_BASE + 0x1000 + 0x10 + 4 * 2);
    	__raw_writel(0x0       , HISI3536_PCIE_CONFIG_BASE + 0x1000 + 0x10 + 4 * 3);
    	__raw_writel(0x0       , HISI3536_PCIE_CONFIG_BASE + 0x1000 + 0x10 + 4 * 4);
    	__raw_writel(0x0       , HISI3536_PCIE_CONFIG_BASE + 0x1000 + 0x10 + 4 * 5);
    
    }
    

    代码分析:

    Hi3536中使用了两个64bit的BAR地址,因此需要将BAR0和BAR1、BAR2和BAR3组合。

    配置方法如上述例子。

    BAR4和BAR5没有使用,因此将BAR寄存器和BAR_MASK寄存器置零。

    Ps:当软件检测到那些被硬件设置为全0的BAR,则认为这个BAR没有被使用。


    能否将例子带入到“__pci_read_base”函数中进行分析呢?

    我们以Hi3536的BAR0和BAR1为例,带入到函数中。

    BAR0寄存器值:0x0000000c,BAR0_MASK:0x03ffffff

    BAR1寄存器值:0x00000000,BAR1_MAK:0x00000000

    int __pci_read_base(struct pci_dev *dev, enum pci_bar_type type,
    		    struct resource *res, unsigned int pos)
    {
        /* 
         * enum pci_bar_type {
    	 * pci_bar_unknown,	/* Standard PCI BAR probe */
    	 * pci_bar_io,		/* An io port BAR */
    	 * pci_bar_mem32,		/* A 32-bit memory BAR */
    	 * pci_bar_mem64,		/* A 64-bit memory BAR */
         * };
         */
        mask = type ? PCI_ROM_ADDRESS_MASK : ~0;  //type当前的BAR类型为mem64
        ...
        pci_read_config_dword(dev, pos, &l);  //读取 l = 0xc
    	pci_write_config_dword(dev, pos, l | mask);  //写入 mask = 0xffffffff
    	pci_read_config_dword(dev, pos, &sz);  //读取 sz = 0xfc00000f
    	pci_write_config_dword(dev, pos, l);  //写入0xc,寄存器恢复初值
     
     	if (sz == 0xffffffff)  //如果BAR上每一位都能设置意味其不能正常工作
          sz = 0;
          
        if (type == pci_bar_unknown) {
            ...
        } else{
            l64 = l & PCI_BASE_ADDRESS_MEM_MASK;  //PCI_BASE_ADDRESS_MEM_MASK = (~0x0fUL)
            sz64 = sz & PCI_BASE_ADDRESS_MEM_MASK;  
            mask64 = (u32)PCI_BASE_ADDRESS_MEM_MASK;  
        }}
        
        ...
        if (res->flags & IORESOURCE_MEM_64) {
            	pci_read_config_dword(dev, pos + 4, &l);  //读取 l = 0x0
    		pci_write_config_dword(dev, pos + 4, ~0);  //写入 0xffffffff
    		pci_read_config_dword(dev, pos + 4, &sz);  //读取 sz = 0xffffffff
    		pci_write_config_dword(dev, pos + 4, l);  //写入0x0
      
      		l64 |= ((u64)l << 32);      //l64 = 0x0
    		sz64 |= ((u64)sz << 32);    //sz64 = 0xffffffff_fc000000
    		mask64 |= ((u64)~0 << 32);  //mask64 = 0xffffffff_ffffffff
        }
        //l64 = 0x0
        //sz64 = 0xffffffff_fc000000
        //mask64 = 0xffffffff_ffffffff
        sz64 = pci_size(l64, sz64, mask64);  //计算并获取BAR空间长度
        ...
    }
    

    带入到pci_size函数中:

    static u64 pci_size(u64 base, u64 maxbase, u64 mask)
    {
    	u64 size = mask & maxbase;  //size = 0xffffffff_fc000000
    	if (!size)
    		return 0;
    
    	/* Get the lowest of them to find the decode size, and
    	   from that the extent.  */
    	size = (size & ~(size-1)) - 1;
         //(size-1) = 0xffffffff_fbffffff
         //~(size-1) = 0x00000000_04000000
         //(size & ~(size-1)) = 0xffffffff_fc000000 & 0x00000000_04000000 = 0x00000000_04000000
         //size = (size & ~(size-1)) - 1 = 0x00000000_03ffffff
         //计算得出size = 0x00000000_03ffffff
         //BAR空间长度64MB
        
    	/* base == maxbase can be valid only if the BAR has
    	   already been programmed with all 1s.  */
    	if (base == maxbase && ((base | size) & mask) != mask)
    		return 0;
    
    	return size;
    }
    

    最终得到size值为64MB。


    设备实操:

    代码分析完,直接实操设备来试试看:

    Hi3536对应PCIe配置空间基址:0x1f000000

    hisilicon # md 0x1f000000
    1f000000: 353619e5 00100146 04800001 00000000    ..65F...........
    1f000010: 0000000c 00000000 0000000c 00000000    ................
    1f000020: 00000000 00000000 00000000 00020000    ................
    1f000030: 00000000 00000040 00000000 000001ff    ....@...........
    1f000040: 5fc35001 00000008 00000000 00000000    .P._............
    

    配置BAR0和BAR1,先寄存器全写1:

    hisilicon # mw 0x1f000010 0xffffffff
    hisilicon # mw 0x1f000014 0xffffffff
    hisilicon # md 0x1f000000
    1f000000: 353619e5 00100146 04800001 00000000    ..65F...........
    1f000010: fc00000f ffffff0f 0000000c 00000000    ................
    1f000020: 00000000 00000000 00000000 00020000    ................
    1f000030: 00000000 00000040 00000000 000001ff    ....@...........
    1f000040: 5fc35001 00000008 00000000 00000000    .P._............
    

    即,size64=0xffffff0f_fc00000f,mask64=0xffffffff_ffffffff

    带入pci_size函数,如下:

    	size = (size & ~(size-1)) - 1;
         //(size-1) = 0xffffff0f_fbffffff
         //~(size-1) = 0x000000f0_04000000
         //(size & ~(size-1)) = 0xffffff0f_fc000000 & 0x000000f0_04000000 = 0x00000000_04000000
         //size = (size & ~(size-1)) - 1 = 0x00000000_03ffffff
         //计算得出size = 0x00000000_03ffffff
         //BAR空间长度64MB
    

    返回size64值:0x00000000_03ffffff,BAR空间大小为64M。

    Ps:虽然不清楚为什么BAR1全写1的时候,读出来的值是0xffffff0f,有点偏离,但结果符合预期。

    具体原因可能需要询问海思FAE。

     

    展开全文
  • matlab bar3函数应用

    2012-05-16 10:45:09
    matlab中的bar3函数直接使用,其颜色与高度不能反映数据本身的特性。因此使用bar3函数时需要加以改变。
  • Bar.add() 方法签名 add(name, x_axis, y_axis, is_stack=False, bar_category_gap='20%', **kwargs) name -> str 图例名称 x_axis -> list x 坐标轴数据 y_axis -> list y 坐标...

    柱状/条形图,通过柱形的高度/条形的宽度来表现数据的大小。
    Bar.add() 方法签名

    add(name, x_axis, y_axis,
        is_stack=False,
        bar_category_gap='20%', **kwargs)
    name -> str
    	图例名称
    x_axis -> list
    	x 坐标轴数据
    y_axis -> list
    	y 坐标轴数据
    is_stack -> bool
    	数据堆叠,同个类目轴上系列配置相同的 stack 值可以堆叠放置
    bar_category_gap -> int/str
    	类目轴的柱状距离,当设置为 0 时柱状是紧挨着(直方图类型),默认为 '20%'
    

    is_stack实现数据堆叠

    from pyecharts import Bar
    
    attr = ["衬衫", "羊毛衫", "雪纺衫", "裤子", "高跟鞋", "袜子"]
    v1 = [5, 20, 36, 10, 75, 90]
    v2 = [10, 25, 8, 60, 20, 80]
    bar = Bar("柱状图数据堆叠示例")
    bar.add("商家A", attr, v1, is_stack=True)
    bar.add("商家B", attr, v2, is_stack=True) 
    bar.render()
    

    在这里插入图片描述
    Note: 全局配置项要在最后一个 add() 上设置,否侧设置会被冲刷掉。

    使用标记点和标记线

    from pyecharts import Bar
    
    bar = Bar("标记线和标记点示例")
    bar.add("商家A", attr, v1, mark_point=["average"])
    bar.add("商家B", attr, v2, mark_line=["min", "max"])
    bar.render()
    

    在这里插入图片描述
    is_convert交换 XY 轴

    from pyecharts import Bar
    
    bar = Bar("x 轴和 y 轴交换")
    bar.add("商家A", attr, v1)
    bar.add("商家B", attr, v2, is_convert=True)
    bar.render()
    

    在这里插入图片描述
    dataZoom 效果,‘slider’ 类型

    import random
    
    attr = ["{}天".format(i) for i in range(30)]
    v1 = [random.randint(1, 30) for _ in range(30)]
    bar = Bar("Bar - datazoom - slider 示例")
    bar.add("", attr, v1, is_label_show=True, is_datazoom_show=True)
    bar.render()
    

    在这里插入图片描述
    dataZoom 效果,‘inside’ 类型

    attr = ["{}天".format(i) for i in range(30)]
    v1 = [random.randint(1, 30) for _ in range(30)]
    bar = Bar("Bar - datazoom - inside 示例")
    bar.add(
        "",
        attr,
        v1,
        is_datazoom_show=True,
        datazoom_type="inside",
        datazoom_range=[10, 25],
    )
    bar.render()
    

    在这里插入图片描述
    dataZoom 效果,‘both’ 类型

    attr = ["{}天".format(i) for i in range(30)]
    v1 = [random.randint(1, 30) for _ in range(30)]
    bar = Bar("Bar - datazoom - inside 示例")
    bar.add(
        "",
        attr,
        v1,
        is_datazoom_show=True,
        datazoom_type="both",
        datazoom_range=[10, 25],
    )
    bar.render()
    

    在这里插入图片描述
    多 dataZoom 效果,效果同时支持 X、Y 轴

    days = ["{}天".format(i) for i in range(30)]
    days_v1 = [random.randint(1, 30) for _ in range(30)]
    bar = Bar("Bar - datazoom - xaxis/yaxis 示例")
    bar.add(
        "",
        days,
        days_v1,
        # 默认为 X 轴,横向
        is_datazoom_show=True,
        datazoom_type="slider",
        datazoom_range=[10, 25],
        # 新增额外的 dataZoom 控制条,纵向
        is_datazoom_extra_show=True,
        datazoom_extra_type="slider",
        datazoom_extra_range=[10, 25],
        is_toolbox_show=False,
    )
    bar.render()
    

    在这里插入图片描述
    Note: datazoom 适合所有平面直角坐标系图形,也就是(Line、Bar、Scatter、EffectScatter、Kline)

    当 x 轴或者 y 轴的标签因为过于密集而导致全部显示出来会重叠的话,可采用使标签旋转的方法

    attr = ["{}天".format(i) for i in range(20)]
    v1 = [random.randint(1, 20) for _ in range(20)]
    bar = Bar("坐标轴标签旋转示例")
    bar.add("", attr, v1, xaxis_interval=0, xaxis_rotate=30, yaxis_rotate=30)
    bar.render()
    

    在这里插入图片描述
    Note: 可通过设置 xaxis_min/xaxis_max/yaxis_min/yaxis_max 来调整 x 轴和 y 轴上的最大最小值。针对数值轴有效!
    Note: 可以通过 label_color 来设置柱状的颜色,如 [’#eee’, ‘#000’],所有的图表类型的图例颜色都可通过 label_color 来修改。

    瀑布图示例
    attr = ["{}月".format(i) for i in range(1, 8)]
    v1 = [0, 100, 200, 300, 400, 220, 250]
    v2 = [1000, 800, 600, 500, 450, 400, 300]
    bar = Bar("瀑布图示例")
    # 利用第一个 add() 图例的颜色为透明,即 'rgba(0,0,0,0)',并且设置 is_stack 标志为 True
    bar.add("", attr, v1, label_color=['rgba(0,0,0,0)'], is_stack=True)
    bar.add("月份", attr, v2, is_label_show=True, is_stack=True, label_pos='inside')
    bar.render()
    

    在这里插入图片描述

    直方图示例

    from pyecharts import Bar
    
    attr = ["衬衫", "羊毛衫", "雪纺衫", "裤子", "高跟鞋", "袜子"]
    v1 = [5, 20, 36, 10, 75, 90]
    v2 = [10, 25, 8, 60, 20, 80]
    bar = Bar("直方图示例")
    bar.add("", attr * 2, v1 + v2, bar_category_gap=0)
    bar.render()
    

    在这里插入图片描述
    某地的降水量和蒸发量柱状图

    attr = ["{}月".format(i) for i in range(1, 13)]
    v1 = [2.0, 4.9, 7.0, 23.2, 25.6, 76.7, 135.6, 162.2, 32.6, 20.0, 6.4, 3.3]
    v2 = [2.6, 5.9, 9.0, 26.4, 28.7, 70.7, 175.6, 182.2, 48.7, 18.8, 6.0, 2.3]
    bar = Bar("柱状图示例")
    bar.add("蒸发量", attr, v1, mark_line=["average"], mark_point=["max", "min"])
    bar.add("降水量", attr, v2, mark_line=["average"], mark_point=["max", "min"])
    bar.render()
    

    在这里插入图片描述
    额外的文本标签

    from pyecharts import Bar
    
    bar = Bar("柱状图", extra_html_text_label=["bar_extra_html_text_label", "color:red"])
    bar.add("商家A", CLOTHES, clothes_v1, is_stack=True)
    bar.add("商家B", CLOTHES, clothes_v2, is_stack=True)
    bar.render()
    

    在这里插入图片描述
    控制 X/Y 轴坐标轴线颜色以及宽度

    bar = Bar("柱状图")
    bar.add(
        "商家A",
        CLOTHES,
        clothes_v1,
        xaxis_line_color="green",
        xaxis_line_width=5,
        xaxis_label_textcolor="black",
    )
    bar.render()
    

    在这里插入图片描述
    进行两次或多次 add 的时候,有一次的某项数据缺失,可用 0 填充

    bar = Bar("折线图示例")
    bar.add("商家A", CLOTHES, clothes_v1)
    bar.add("商家B", CLOTHES, [55, 60, 16, 20, 0, 0])
    bar.render()
    

    在这里插入图片描述

    Bar3D(3D 柱状图)

    Bar3D.add() 方法签名

    add(name, x_axis, y_axis, data,
        grid3d_opacity=1,
        grid3d_shading='color', **kwargs)
    
    name -> str
    	图例名称
    x_axis -> str
    	x 坐标轴数据。需为类目轴,也就是不能是数值。
    y_axis -> str
    	y 坐标轴数据。需为类目轴,也就是不能是数值。
    data -> [list], 包含列表的列表
    	数据项,数据中,每一行是一个『数据项』,每一列属于一个『维度』
    grid3d_opacity -> int
    	3D 笛卡尔坐标系组的透明度(柱状的透明度),默认为 1,完全不透明。
    grid3d_shading -> str
    	三维柱状图中三维图形的着色效果。
    		color:只显示颜色,不受光照等其它因素的影响。
    		lambert:通过经典的 lambert 着色表现光照带来的明暗。
    		realistic:真实感渲染,配合 light.ambientCubemap 和 postEffect 使用可以让展示的画面效果和质感有质的提升。ECharts GL 中使用了基于物理的渲染(PBR) 来表现真实感材质。
    
    from pyecharts import Bar3D
    
    bar3d = Bar3D("3D 柱状图示例", width=1200, height=600)
    x_axis = [
        "12a", "1a", "2a", "3a", "4a", "5a", "6a", "7a", "8a", "9a", "10a", "11a",
        "12p", "1p", "2p", "3p", "4p", "5p", "6p", "7p", "8p", "9p", "10p", "11p"
        ]
    y_axis = [
        "Saturday", "Friday", "Thursday", "Wednesday", "Tuesday", "Monday", "Sunday"
        ]
    data = [
        [0, 0, 5], [0, 1, 1], [0, 2, 0], [0, 3, 0], [0, 4, 0], [0, 5, 0],
        [0, 6, 0], [0, 7, 0], [0, 8, 0], [0, 9, 0], [0, 10, 0], [0, 11, 2],
        [0, 12, 4], [0, 13, 1], [0, 14, 1], [0, 15, 3], [0, 16, 4], [0, 17, 6],
        [0, 18, 4], [0, 19, 4], [0, 20, 3], [0, 21, 3], [0, 22, 2], [0, 23, 5],
        [1, 0, 7], [1, 1, 0], [1, 2, 0], [1, 3, 0], [1, 4, 0], [1, 5, 0],
        [1, 6, 0], [1, 7, 0], [1, 8, 0], [1, 9, 0], [1, 10, 5], [1, 11, 2],
        [1, 12, 2], [1, 13, 6], [1, 14, 9], [1, 15, 11], [1, 16, 6], [1, 17, 7],
        [1, 18, 8], [1, 19, 12], [1, 20, 5], [1, 21, 5], [1, 22, 7], [1, 23, 2],
        [2, 0, 1], [2, 1, 1], [2, 2, 0], [2, 3, 0], [2, 4, 0], [2, 5, 0],
        [2, 6, 0], [2, 7, 0], [2, 8, 0], [2, 9, 0], [2, 10, 3], [2, 11, 2],
        [2, 12, 1], [2, 13, 9], [2, 14, 8], [2, 15, 10], [2, 16, 6], [2, 17, 5],
        [2, 18, 5], [2, 19, 5], [2, 20, 7], [2, 21, 4], [2, 22, 2], [2, 23, 4],
        [3, 0, 7], [3, 1, 3], [3, 2, 0], [3, 3, 0], [3, 4, 0], [3, 5, 0],
        [3, 6, 0], [3, 7, 0], [3, 8, 1], [3, 9, 0], [3, 10, 5], [3, 11, 4],
        [3, 12, 7], [3, 13, 14], [3, 14, 13], [3, 15, 12], [3, 16, 9], [3, 17, 5],
        [3, 18, 5], [3, 19, 10], [3, 20, 6], [3, 21, 4], [3, 22, 4], [3, 23, 1],
        [4, 0, 1], [4, 1, 3], [4, 2, 0], [4, 3, 0], [4, 4, 0], [4, 5, 1],
        [4, 6, 0], [4, 7, 0], [4, 8, 0], [4, 9, 2], [4, 10, 4], [4, 11, 4],
        [4, 12, 2], [4, 13, 4], [4, 14, 4], [4, 15, 14], [4, 16, 12], [4, 17, 1],
        [4, 18, 8], [4, 19, 5], [4, 20, 3], [4, 21, 7], [4, 22, 3], [4, 23, 0],
        [5, 0, 2], [5, 1, 1], [5, 2, 0], [5, 3, 3], [5, 4, 0], [5, 5, 0],
        [5, 6, 0], [5, 7, 0], [5, 8, 2], [5, 9, 0], [5, 10, 4], [5, 11, 1],
        [5, 12, 5], [5, 13, 10], [5, 14, 5], [5, 15, 7], [5, 16, 11], [5, 17, 6],
        [5, 18, 0], [5, 19, 5], [5, 20, 3], [5, 21, 4], [5, 22, 2], [5, 23, 0],
        [6, 0, 1], [6, 1, 0], [6, 2, 0], [6, 3, 0], [6, 4, 0], [6, 5, 0],
        [6, 6, 0], [6, 7, 0], [6, 8, 0], [6, 9, 0], [6, 10, 1], [6, 11, 0],
        [6, 12, 2], [6, 13, 1], [6, 14, 3], [6, 15, 4], [6, 16, 0], [6, 17, 0],
        [6, 18, 0], [6, 19, 0], [6, 20, 1], [6, 21, 2], [6, 22, 2], [6, 23, 6]
        ]
    range_color = ['#313695', '#4575b4', '#74add1', '#abd9e9', '#e0f3f8', '#ffffbf',
                   '#fee090', '#fdae61', '#f46d43', '#d73027', '#a50026']
    bar3d.add(
        "",
        x_axis,
        y_axis,
        [[d[1], d[0], d[2]] for d in data],
        is_visualmap=True,
        visual_range=[0, 20],
        visual_range_color=range_color,
        grid3d_width=200,
        grid3d_depth=80,
    )
    bar3d.render()
    

    data 中,如 [1, 2, 3] 表示 x 轴的索引为 1,即 “1a”;y 轴的索引为 2,即 “Thursday”;z 轴的数值为 3
    在这里插入图片描述
    设置 grid3d_shading可以让柱状更真实

    bar3d = Bar3D("3D 柱状图示例", width=1200, height=600)
    bar3d.add(
        "",
        x_axis,
        y_axis,
        [[d[1], d[0], d[2]] for d in data],
        is_visualmap=True,
        visual_range=[0, 20],
        visual_range_color=range_color,
        grid3d_width=200,
        grid3d_depth=80,
        grid3d_shading="lambert",
    )
    bar3d.render()
    

    在这里插入图片描述
    设置 is_grid3d_rotate启动自动旋转功能

    bar3d = Bar3D("3D 柱状图示例", width=1200, height=600)
    bar3d.add(
        "",
        x_axis,
        y_axis,
        [[d[1], d[0], d[2]] for d in data],
        is_visualmap=True,
        visual_range=[0, 20],
        visual_range_color=range_color,
        grid3d_width=200,
        grid3d_depth=80,
        is_grid3d_rotate=True,
    )
    bar3d.render()
    

    在这里插入图片描述
    设置 grid3d_rotate_speed调节旋转速度

    bar3d = Bar3D("3D 柱状图示例", width=1200, height=600)
    bar3d.add(
        "",
        x_axis,
        y_axis,
        [[d[1], d[0], d[2]] for d in data],
        is_visualmap=True,
        visual_range=[0, 20],
        visual_range_color=range_color,
        grid3d_width=200,
        grid3d_depth=80,
        is_grid3d_rotate=True,
        grid3d_rotate_speed=180,
    )
    bar3d.render()
    
    展开全文
  • Pyecharts ——(一)bar

    千次阅读 2019-11-02 09:29:42
    Echarts 是一个由百度开源的数据可视化,凭借着良好的交互性,精巧的图表设计,得到了众多开发者的认可...Bar(柱状图/条形图) Bar3D(3D 柱状图) Boxplot(箱形图) EffectScatter(带有涟漪特效动画的散点图) ...

    Echarts 是一个由百度开源的数据可视化,凭借着良好的交互性,精巧的图表设计,得到了众多开发者的认可。而 Python 是一门富有表达力的语言,很适合用于数据处理。当数据分析遇上数据可视化时,pyecharts 诞生了。

    pyecharts包含的图表:

    • Bar(柱状图/条形图)
    • Bar3D(3D 柱状图)
    • Boxplot(箱形图)
    • EffectScatter(带有涟漪特效动画的散点图)
    • Funnel(漏斗图)
    • Gauge(仪表盘)
    • Geo(地理坐标系)
    • Graph(关系图)
    • HeatMap(热力图)
    • Kline(K线图)
    • Line(折线/面积图)
    • Line3D(3D 折线图)
    • Liquid(水球图)
    • Map(地图)
    • Parallel(平行坐标系)
    • Pie(饼图)
    • Polar(极坐标系)
    • Radar(雷达图)
    • Sankey(桑基图)
    • Scatter(散点图)
    • Scatter3D(3D 散点图)
    • ThemeRiver(主题河流图)
    • WordCloud(词云图)

    用户自定义

    • Grid 类:并行显示多张图
    • Overlap 类:结合不同类型图表叠加画在同张图上
    • Page 类:同一网页按顺序展示多图
    • Timeline 类:提供时间线轮播多张图

    本系列会对常用的图表种类进行详细介绍。


    一、准备工作

    在windows环境下,可以直接通过pip安装

    pip install pyecharts
    

    这里要专门说明一下,自从 0.3.2 开始,为了缩减项目本身的体积以及维持 pyecharts 项目的轻量化运行,pyecharts 将不再自带地图 js 文件。如用户需要用到地图图表(Geo、Map),可自行安装对应的地图文件包。
    否则在用到这两个包的时候,并能完整的显示地图效果。

    全球国家地图: echarts-countries-pypkg (1.9MB): 世界地图和 213 个国家,包括中国地图
    中国省级地图: echarts-china-provinces-pypkg (730KB):23 个省,5 个自治区
    中国市级地图: echarts-china-cities-pypkg (3.8MB):370 个中国城市

    Windows下通过已下的pip命令进行安装

    pip install echarts-countries-pypkg
    pip install echarts-china-provinces-pypkg
    pip install echarts-china-cities-pypkg
    

    安装好后在如果能够成功import,就代表安装成功了

    接下来看下版本

    import pyecharts
    pyecharts.__version__
    

    在这里插入图片描述

    准备工作到此就基本完成了,话不多说,进入绘图阶段


    二、实例

    在正式绘图之前,还要介绍几个后续会非常常见的方法:

    • add()
      主要方法,用于添加图表的数据和设置各种配置项

    • show_config()
      打印输出图表的所有配置项

    • render()
      默认将会在根目录下生成一个 render.html 的文件,支持 path 参数,设置文件保存位置,如 render(r"C:\Users\acer\Documents\chart.html"),文件用浏览器打开。

    • render_notebook()
      由于是在IPython上运行的,通过render_notebook()可以直接将结果展示出来,不用保存html到本地


    先绘制一个最简单的bar

    import pyecharts.charts as pyec
    import pyecharts.options as opts
    
    x = ['甲','乙','丙']
    y = [
        [300,800,600],
        [1200,500,200]
    ]
    
    bar = pyec.Bar()
    bar.add_xaxis(x)
    bar.add_yaxis(series_name='公司A',yaxis_data=y[0])
    bar.add_yaxis(series_name='公司B', yaxis_data=y[1])
    bar.set_global_opts(title_opts=opts.TitleOpts(title='比较图',pos_left='right'))
    
    
    bar.render_notebook()
    

    在这里插入图片描述
    可以单击上面的legend,单独查看一个类别的
    在这里插入图片描述


    显示toolbox

    import pyecharts.charts as pyec
    import pyecharts.options as opts
    
    x = ['甲','乙','丙']
    y = [
        [300,800,600],
        [1200,500,200]
    ]
    
    bar = pyec.Bar()
    bar.add_xaxis(x)
    bar.add_yaxis(series_name='公司A',yaxis_data=y[0],category_gap="60%")
    bar.add_yaxis(series_name='公司B', yaxis_data=y[1],category_gap="60%")
    bar.set_global_opts(title_opts=opts.TitleOpts(title='比较图',pos_left='right'))
    bar.set_global_opts(toolbox_opts=opts.ToolboxOpts(is_show=True))
    
    
    
    bar.render_notebook()
    

    在这里插入图片描述

    与Echarts一样,默认的toolbox包括save as imagerestoredataviewdatazoom

    save as image可以将图标保存为图片;
    restore可以恢复默认设置
    dataview可以根据自己的需求改变数据,实时查看图标效果
    datazoom可以对某块区域放大


    修改单系列柱间距离

    import pyecharts.charts as pyec
    import pyecharts.options as opts
    
    x = ['甲','乙','丙']
    y = [
        [300,800,600],
        [1200,500,200]
    ]
    
    bar = pyec.Bar()
    bar.add_xaxis(x)
    bar.add_yaxis(series_name='公司A',yaxis_data=y[0],category_gap="80%")
    bar.add_yaxis(series_name='公司B', yaxis_data=y[1],category_gap="80%")
    bar.set_global_opts(title_opts=opts.TitleOpts(title='比较图',pos_left='right'))
    bar.set_global_opts(toolbox_opts=opts.ToolboxOpts(is_show=True))
    
    
    
    bar.render_notebook()
    

    在这里插入图片描述


    修改多系列柱间距离

    import pyecharts.charts as pyec
    import pyecharts.options as opts
    
    x = ['甲','乙','丙']
    y = [
        [300,800,600],
        [1200,500,200]
    ]
    
    bar = pyec.Bar()
    bar.add_xaxis(x)
    bar.add_yaxis(series_name='公司A',yaxis_data=y[0],gap="80%")
    bar.add_yaxis(series_name='公司B', yaxis_data=y[1],gap="80%")
    bar.set_global_opts(title_opts=opts.TitleOpts(title='比较图',pos_left='right'))
    bar.set_global_opts(toolbox_opts=opts.ToolboxOpts(is_show=True))
    
    
    
    bar.render_notebook()
    

    在这里插入图片描述


    设定坐标轴名称

    import pyecharts.charts as pyec
    import pyecharts.options as opts
    
    x = ['甲','乙','丙']
    y = [
        [300,800,600],
        [1200,500,200]
    ]
    
    bar = pyec.Bar()
    bar.add_xaxis(x)
    bar.add_yaxis(series_name='公司A',yaxis_data=y[0])
    bar.add_yaxis(series_name='公司B', yaxis_data=y[1])
    bar.set_global_opts(title_opts=opts.TitleOpts(title='比较图',pos_left='right'))
    bar.set_global_opts(toolbox_opts=opts.ToolboxOpts(is_show=True),
                        yaxis_opts=opts.AxisOpts(name="我是 Y 轴"),
                        xaxis_opts=opts.AxisOpts(name="我是 X 轴"))
    
    
    
    
    bar.render_notebook()
    

    在这里插入图片描述


    翻转xy轴

    import pyecharts.charts as pyec
    import pyecharts.options as opts
    
    x = ['甲','乙','丙']
    y = [
        [300,800,600],
        [1200,500,200]
    ]
    
    bar = pyec.Bar()
    bar.add_xaxis(x)
    bar.add_yaxis(series_name='公司A',yaxis_data=y[0])
    bar.add_yaxis(series_name='公司B', yaxis_data=y[1])
    bar.set_global_opts(title_opts=opts.TitleOpts(title='比较图',pos_left='right'))
    bar.set_global_opts(toolbox_opts=opts.ToolboxOpts(is_show=True),
                        yaxis_opts=opts.AxisOpts(name="我是 Y 轴"),
                        xaxis_opts=opts.AxisOpts(name="我是 X 轴"))
    bar.reversal_axis()
    
    
    bar.render_notebook()
    

    在这里插入图片描述


    堆叠部分数据

    import pyecharts.charts as pyec
    import pyecharts.options as opts
    
    x = ['甲','乙','丙']
    y = [
        [300,800,600],
        [1200,500,200],
        [600,900,1100]
    ]
    
    bar = pyec.Bar()
    bar.add_xaxis(x)
    bar.add_yaxis(series_name='公司A',yaxis_data=y[0],stack='stack1')
    bar.add_yaxis(series_name='公司B', yaxis_data=y[1],stack='stack1')
    bar.add_yaxis(series_name='公司C', yaxis_data=y[2])
    bar.set_series_opts(label_opts=opts.LabelOpts(is_show=False))
    bar.set_global_opts(title_opts=opts.TitleOpts(title='比较图',pos_left='right'))
    bar.set_global_opts(toolbox_opts=opts.ToolboxOpts(is_show=True),
                        yaxis_opts=opts.AxisOpts(name="我是 Y 轴"),
                        xaxis_opts=opts.AxisOpts(name="我是 X 轴"))
    
    
    bar.render_notebook()
    

    在这里插入图片描述


    标记指定类型

    import pyecharts.charts as pyec
    import pyecharts.options as opts
    
    x = ['甲','乙','丙']
    y = [
        [300,800,600],
        [1200,500,200],
        [600,900,1100]
    ]
    
    bar = pyec.Bar()
    bar.add_xaxis(x)
    bar.add_yaxis(series_name='公司A',yaxis_data=y[0])
    bar.add_yaxis(series_name='公司B', yaxis_data=y[1])
    bar.set_series_opts(label_opts=opts.LabelOpts(is_show=False),
                        markpoint_opts=opts.MarkPointOpts(
                            data=[
                                opts.MarkPointItem(type_="max", name="最大值"),
                                opts.MarkPointItem(type_="min", name="最小值"),
                                opts.MarkPointItem(type_="average", name="平均值")
                            ]
                ))
    bar.set_global_opts(title_opts=opts.TitleOpts(title='比较图',pos_left='right'))
    bar.set_global_opts(toolbox_opts=opts.ToolboxOpts(is_show=True),
                        yaxis_opts=opts.AxisOpts(name="我是 Y 轴"),
                        xaxis_opts=opts.AxisOpts(name="我是 X 轴"))
    
    
    bar.render_notebook()
    

    在这里插入图片描述


    添加水平slider

    import pyecharts.charts as pyec
    import pyecharts.options as opts
    
    x = ['甲','乙','丙']
    y = [
        [300,800,600],
        [1200,500,200],
        [600,900,1100]
    ]
    
    bar = pyec.Bar()
    bar.add_xaxis(x)
    bar.add_yaxis(series_name='公司A',yaxis_data=y[0])
    bar.add_yaxis(series_name='公司B', yaxis_data=y[1])
    bar.set_series_opts(label_opts=opts.LabelOpts(is_show=False),
                        markpoint_opts=opts.MarkPointOpts(
                            data=[
                                opts.MarkPointItem(type_="max", name="最大值"),
                                opts.MarkPointItem(type_="min", name="最小值"),
                                opts.MarkPointItem(type_="average", name="平均值")
                            ]
                ))
    bar.set_global_opts(title_opts=opts.TitleOpts(title='比较图',pos_left='right'))
    bar.set_global_opts(toolbox_opts=opts.ToolboxOpts(is_show=True),
                        yaxis_opts=opts.AxisOpts(name="我是 Y 轴"),
                        xaxis_opts=opts.AxisOpts(name="我是 X 轴"),
                        datazoom_opts=opts.DataZoomOpts(type_='slider',range_start=0,range_end=1200))
    
    
    bar.render_notebook()
    

    在这里插入图片描述


    旋转x轴标签

    import pyecharts.charts as pyec
    import pyecharts.options as opts
    
    x = ['甲','乙','丙']
    y = [
        [300,800,600],
        [1200,500,200],
        [600,900,1100]
    ]
    
    bar = pyec.Bar()
    bar.add_xaxis(x)
    bar.add_yaxis(series_name='公司A',yaxis_data=y[0])
    bar.add_yaxis(series_name='公司B', yaxis_data=y[1])
    bar.set_series_opts(label_opts=opts.LabelOpts(is_show=False),
                        markpoint_opts=opts.MarkPointOpts(
                            data=[
                                opts.MarkPointItem(type_="max", name="最大值"),
                                opts.MarkPointItem(type_="min", name="最小值"),
                                opts.MarkPointItem(type_="average", name="平均值")
                            ]
                ))
    bar.set_global_opts(title_opts=opts.TitleOpts(title='比较图',pos_left='right'))
    bar.set_global_opts(toolbox_opts=opts.ToolboxOpts(is_show=True),
                        yaxis_opts=opts.AxisOpts(name="我是 Y 轴"),
                        xaxis_opts=opts.AxisOpts(name="我是 X 轴",axislabel_opts=opts.LabelOpts(rotate=-15)),
                        datazoom_opts=opts.DataZoomOpts(type_='slider',range_start=0,range_end=1200))
    
    
    bar.render_notebook()
    

    在这里插入图片描述


    展开全文
  • 相关源码: \frameworks\base\packages\SystemUI\src\...在文章《Android P SystemUI之super_status_bar.xml解析》讲到,StatusBar的UI主要是在super_status_bar.xml中...

    相关源码:
    \frameworks\base\packages\SystemUI\src\com\android\systemui\statusbar\phone\CollapsedStatusBarFragment.java

    在文章《Android P SystemUI之super_status_bar.xml解析》讲到,StatusBar的UI主要是在super_status_bar.xml中加载的,其中状态栏UI部分主要容器status_bar_container中。

    super_status_bar.xml的状态栏UI部分:

     <FrameLayout
         android:id="@+id/status_bar_container"
         android:layout_width="match_parent"
         android:layout_height="wrap_content" />
    

    在StatusBar.java中初始化状态栏的UI:

    // ================================================================================
    // Constructing the view
    // ================================================================================
    protected void makeStatusBarView() {
    	//省略一部分代码
    	//...
           FragmentHostManager.get(mStatusBarWindow)
                   .addTagListener(CollapsedStatusBarFragment.TAG, (tag, fragment) -> {
                       CollapsedStatusBarFragment statusBarFragment =
                               (CollapsedStatusBarFragment) fragment;
                       statusBarFragment.initNotificationIconArea(mNotificationIconAreaController);
                       PhoneStatusBarView oldStatusBarView = mStatusBarView;
                       mStatusBarView = (PhoneStatusBarView) fragment.getView();
                       mStatusBarView.setBar(this);
                       mStatusBarView.setPanel(mNotificationPanel);
                       mStatusBarView.setScrimController(mScrimController);
                       mStatusBarView.setBouncerShowing(mBouncerShowing);
                       if (oldStatusBarView != null) {
                           float fraction = oldStatusBarView.getExpansionFraction();
                           boolean expanded = oldStatusBarView.isExpanded();
                           mStatusBarView.panelExpansionChanged(fraction, expanded);
                       }
                       if (mHeadsUpAppearanceController != null) {
                           // This view is being recreated, let's destroy the old one
                           mHeadsUpAppearanceController.destroy();
                       }
                       mHeadsUpAppearanceController = new HeadsUpAppearanceController(
                               mNotificationIconAreaController, mHeadsUpManager, mStatusBarWindow);
                       mStatusBarWindow.setStatusBarView(mStatusBarView);
                       setAreThereNotifications();
                       checkBarModes();
                   }).getFragmentManager()
                   .beginTransaction()
                   .replace(R.id.status_bar_container, new CollapsedStatusBarFragment(),
                           CollapsedStatusBarFragment.TAG)
                   .commit();
    	//省略一部分代码
    	//...
    }
    

    关键点:replace(R.id.status_bar_container, new CollapsedStatusBarFragment(),CollapsedStatusBarFragment.TAG)

    mStatusBarWindow就是加载了layout view super_status_bar.xml的窗口对象。

    这里使用CollapsedStatusBarFragment来填充status_bar_container的view。

    CollapsedStatusBarFragment.java

    CollapsedStatusBarFragment中加载的UI正是R.layout.status_bar

    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container,
            Bundle savedInstanceState) {
        return inflater.inflate(R.layout.status_bar, container, false);
    }
    

    status_bar.xml

    <!--    android:background="@drawable/status_bar_closed_default_background" -->
    <com.android.systemui.statusbar.phone.PhoneStatusBarView
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:systemui="http://schemas.android.com/apk/res/com.android.systemui"
        android:layout_width="match_parent"
        android:layout_height="@dimen/status_bar_height"
        android:id="@+id/status_bar"
        android:background="@drawable/system_bar_background"
        android:orientation="vertical"
        android:focusable="false"
        android:descendantFocusability="afterDescendants"
        android:accessibilityPaneTitle="@string/status_bar"
        >
    
        <ImageView
            android:id="@+id/notification_lights_out"
            android:layout_width="@dimen/status_bar_icon_size"
            android:layout_height="match_parent"
            android:paddingStart="@dimen/status_bar_padding_start"
            android:paddingBottom="2dip"
            android:src="@drawable/ic_sysbar_lights_out_dot_small"
            android:scaleType="center"
            android:visibility="gone"
            />
    
        <LinearLayout android:id="@+id/status_bar_contents"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:paddingStart="@dimen/status_bar_padding_start"
            android:paddingEnd="@dimen/status_bar_padding_end"
            android:orientation="horizontal"
            >
            <ViewStub
                android:id="@+id/operator_name"
                android:layout_width="wrap_content"
                android:layout_height="match_parent"
                android:layout="@layout/operator_name" />
            <FrameLayout
                android:layout_height="match_parent"
                android:layout_width="0dp"
                android:layout_weight="1">
    
                <include layout="@layout/heads_up_status_bar_layout" />
    
                <!-- The alpha of the left side is controlled by PhoneStatusBarTransitions, and the
                 individual views are controlled by StatusBarManager disable flags DISABLE_CLOCK and
                 DISABLE_NOTIFICATION_ICONS, respectively -->
                <LinearLayout
                    android:id="@+id/status_bar_left_side"
                    android:layout_height="match_parent"
                    android:layout_width="match_parent"
                    android:clipChildren="false"
                >
                    <com.android.systemui.statusbar.policy.Clock
                        android:id="@+id/clock"
                        android:layout_width="wrap_content"
                        android:layout_height="match_parent"
                        android:textAppearance="@style/TextAppearance.StatusBar.Clock"
                        android:singleLine="true"
                        android:paddingStart="@dimen/status_bar_left_clock_starting_padding"
                        android:paddingEnd="@dimen/status_bar_left_clock_end_padding"
                        android:gravity="center_vertical|start"
                    />
    
                    <com.android.systemui.statusbar.AlphaOptimizedFrameLayout
                        android:id="@+id/notification_icon_area"
                        android:layout_width="0dp"
                        android:layout_height="match_parent"
                        android:layout_weight="1"
                        android:orientation="horizontal"
                        android:clipChildren="false"/>
    
                </LinearLayout>
            </FrameLayout>
    
            <!-- Space should cover the notch (if it exists) and let other views lay out around it -->
            <android.widget.Space
                android:id="@+id/cutout_space_view"
                android:layout_width="0dp"
                android:layout_height="match_parent"
                android:gravity="center_horizontal|center_vertical"
            />
    
            <com.android.keyguard.AlphaOptimizedLinearLayout android:id="@+id/system_icon_area"
                android:layout_width="0dp"
                android:layout_height="match_parent"
                android:layout_weight="1"
                android:orientation="horizontal"
                android:gravity="center_vertical|end"
                >
    
                <include layout="@layout/system_icons" />
            </com.android.keyguard.AlphaOptimizedLinearLayout>
        </LinearLayout>
    
        <ViewStub
            android:id="@+id/emergency_cryptkeeper_text"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:layout="@layout/emergency_cryptkeeper_text"
        />
    </com.android.systemui.statusbar.phone.PhoneStatusBarView>
    

    status_bar.xml的组成部分:
    1、ImageView,id="@+id/notification_lights_out",低辨识度模式,flag是SYSTEM_UI_FLAG_LOW_PROFILE,进入进入低辨识度模式只显示这个imageView,为一个灰色小圆点,一般不可见。

    status_bar_contents,状态栏的主Content,包括状态栏的全部图标,主要包括:
    2、ViewStub,id="@+id/operator_name",包含了operator_name.xml,主要显示运营商名称
    3、layout,heads_up_status_bar_layout,包含了一个heads_up_status_bar_layout.xml,主要显示heads_up信息,是一个提示信息,主要显示在状态栏下方,类似一个弹框的显示,用于提示信息。
    4、 LinearLayout,status_bar_left_side,左边显示区域,时钟区域和notification_icon_area,一是显示时钟Clock,二是显示通知icon。
    5、Space,id="@+id/cutout_space_view",空view,位于状态来中间位置。用于视图布局,不显示实际内容。
    6、LinearLayout,id="@+id/system_icon_area",系统图标区域,主要包括蓝牙,wifi,4G信号等图标显示。这里加载了,system_icons.xml中去完成这些图标
    7、ViewStub,:d="@+id/emergency_cryptkeeper_text",加载了emergency_cryptkeeper_text.xml,用于显示紧急电话文字。

    需要注意的是,android 9.0系统中没有去使用signal_cluster_view加载信号变化图标显示。

    signal_cluster_view是android 9.0之前的版本中使用到的。

    展开全文
  • 最近在写商城,中途遇到了需要...一脸懵逼咧,貌似不能满足这需求,而且后续也要实现点击导航滚动定位,组件传参麻烦,而且未必能实现,于是我把WeUI的navigation-bar组件的精华提取出来写了一份。 wxml文件 <...
  • obj_t *bar, int16_t min, int16_t max) 说明:为指定的Bar控件设置一个范围值 输入:要设置的Bar对象指针,最小值,最大值 设置Bar类型:void lv_bar_set_type(lv_obj_t *bar, lv_bar_type_ttype) 说明:为指定的...
  • 用R画带ErrorBar的分组条形图

    千次阅读 2019-12-06 10:29:53
    用R画带ErrorBar的分组条形图 本文介绍了如何用R画出带error bar的分组条形图。 笔者近期画了一张带error bar的分组条形图,将相关的代码分享一下。 感谢知乎网友青山屋主的建议,提示笔者要严谨区分技术重复和...
  • Touch Bar上的彩虹猫 - Touch Bar Nyan Cat

    千次阅读 2020-10-22 14:50:11
    Touch Bar Nyan Cat就将彩虹猫动画搬到了 Touch Bar 上。只需轻轻一点,你就能在自己 $2K+ 的 MacBook Pro 上欣赏一场永无止境的奔跑,配合着魔性的 BGM,可以说是 Touch Bar 最佳伴侣了。 尽管苹果在新款Macbook...
  • matplotlib基础绘图命令之errorbar

    千次阅读 2020-07-27 20:58:13
    欢迎关注”生信修炼手册”!在matplotlib中,errorbar方法用于绘制带误差线的折线图,基本用法如下plt.errorbar(x=[1, 2, 3, 4], y=[1, 2, ...
  • 将右图的单元放大得到两种类型的 bar (绿色空心代表价格上升的 bar,红色实心代表价格下降的 bar): 我在 〖 Python 系列〗 里最喜欢说的一句就是「万物皆对象」,这里 bar 也不例外,也是个对象,它里面的属性有...
  • def add_yaxis( # 系列名称,用于 tooltip 的显示,legend 的图例筛选。... y_axis: Sequence[Numeric, opts.BarItem, dict], # 是否选中图例 is_selected: bool = True, # 使用的 x 轴的 ...
  • delphi中改变statusbar的背景色和字体颜色
  • 【Python】plt.bar绘制柱状图参数详解

    千次阅读 多人点赞 2020-12-21 19:48:48
    bar(x, height, width=0.8, bottom=None, ***, align='center', data=None, **kwargs) x 表示x坐标,数据类型为int或float类型, height 表示柱状图的高度,也就是y坐标值,数据类型为int或float类型, width 表示...
  • BetterTouchTool使用指南——TouchBar

    千次阅读 2020-09-13 18:25:11
    BetterTouchTool使用指南——TouchBar篇 1、安装指南 1.1系统版本 ​ 博主更新了Big Sur Beta版,使用了一个月了,安装BetterTouchTool(以下简称BTT)会面临各种奇奇怪怪的闪退,当然其他应用例如Navicat是直接打...
  • 访问PCIe BAR空间

    万次阅读 2017-06-20 23:31:54
    BAR空间以及配置空间的访问做一个系统的总结,其实就是在回答以下几个问题: 1. PCIe中四种tlp和BAR空间的关系是怎样的? 2. tlp是怎么发起的? 3. tlp是怎么到相应的下游设备的?
  • Touchbar Pet 是一款正在测试中的 macOS 应用,它能够在你 Mac 电脑上的 Touch Bar 触控栏上,养一只宠物。 这是近两天非常火爆的一个小玩具,它没什么实际功能,就是在 Mac 电脑的 Touch Bar 触控栏上,养一只宠物...
  • 函数的签名为matplotlib.pyplot.errorbar(x, y, yerr=None, xerr=None, fmt='', ecolor=None, elinewidth=None, capsize=None, barsabove=False, lolims=False, uplims=False, xlolims=False, xuplims=False, er
  • Python:matplotlib分组Bar柱状图

    千次阅读 2021-01-18 00:53:17
    Python:matplotlib分组Bar柱状图 import numpy as np import matplotlib.pyplot as plt def get_data(size): border = 80 x = np.linspace(start=1, stop=size, endpoint=True, num=size, dtype=np.int) # x...
  • WPF StatusBar控件

    千次阅读 2019-05-23 13:50:12
    应用程序窗口的顶部通常... 对我们来说幸运的是,WPF带有一个很好的StatusBar控件,可以很容易地为您的应用程序添加状态栏功能。 让我们从一个非常基础的例子开始: <Window x:Class="WpfTutorialSamples.Com...
  • bar()函数概述 bar()函数用于绘制柱形图。 bar()的函数签名为matplotlib.pyplot.bar(x, height, width=0.8, bottom=None, *, align='center', data=None, **kwargs)。 bar()的返回值为BarContainer对象,其中patche...
  • FlexibleSpaceBar组件效果图 示例代码 import 'package:flutter/material.dart'; void main() =&gt; runApp(new MyApp()); class MyApp extends StatelessWidget { @override Widget build(BuildCo...
  • "Bar-默认取消显示某 series" ) ) ) bar6 . render ( 'echarts-bar.html' ) # 例7 显示toolbox bar7 = ( Bar ( ) . add_xaxis ( Faker . choose ( ) ) . add_yaxis ( "数据1" , Faker . values ...
  • 使用BetterTouchTool自定义你的touchBar

    万次阅读 热门讨论 2018-10-29 17:56:40
    2017年Apple发布了新款Mac,键盘上多了条显示屏,即所谓的TouchBar,奈何这玩意只能显示固定的几种插件,太浪费了 1. 什么是BetterTouchTool BetterTouchTool是一款@Vas3k开源的touchbar插件,可以做到自定义。 Git...
  • mui tab bar 顶部+底部

    千次阅读 2018-02-26 17:42:37
    底部选项卡+div模式 通过DIV模拟一个独立页面,通过DIV的显示、隐藏模拟不同页面的切换,典型的SPA模式;这种模式适合简单业务系统,因为每个选项卡内容要写在一个DIV中, 若逻辑复杂,会导致当前页面DOM...mui-bar...
  • Matlab bar画图

    千次阅读 2019-09-21 20:42:35
    clc; clear; %数据集1 data_1=[0.8317 0.8933 0.7770 0.8742 0.7303 0.8034 0.8591 0.8975 0.8764 0.9025 0.8369 0.8897 ...bar(data_1,'DisplayName','data_1'); xlabel('Dataset','FontSize',12)...
  • bar_label()概述 与其他可视化工具相比,为数据系列添加数据标签一直是matplotlib的薄弱项。bar_label()函数是matplotlib3.4.0新增API,功能是为柱状图添加数据标签。 函数的签名为matplotlib.pyplot.bar_label...
  • Android 8.0 SystemUI(三)——StatusBar

    千次阅读 2018-11-29 13:22:48
    状态栏与导航栏的启动由StatusBar.start()完成 /frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java @Override public void start() { mNetworkController = ...
  • MPAndroidChart 3.0——BarChart(一)

    万次阅读 2018-09-27 02:11:51
    概要 Github: MPAndroidChart MPAndroidChart 是 一个强大的 Android图表...我们先从简单的 BarChart (条形图)开始使用。(MPAndroidChart 2.版本和 3.版本。部分 API 有所改变) Gradle Project level build...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 661,280
精华内容 264,512
关键字:

bar