gitweixin
  • 首页
  • 小程序代码
    • 资讯读书
    • 工具类
    • O2O
    • 地图定位
    • 社交
    • 行业软件
    • 电商类
    • 互联网类
    • 企业类
    • UI控件
  • 大数据开发
    • Hadoop
    • Spark
    • Hbase
    • Elasticsearch
    • Kafka
    • Flink
    • 数据仓库
    • 数据挖掘
    • flume
    • Kafka
    • Hive
    • shardingsphere
    • solr
  • 开发博客
    • Android
    • php
    • python
    • 运维
    • 技术架构
    • 数据库
  • 程序员网赚
  • bug清单
  • 量化投资
  • 在线查询工具
    • 去行号
    • 在线时间戳转换工具
    • 免费图片批量修改尺寸在线工具
    • SVG转JPG在线工具

鸿蒙Harmony和Android共享数据对比

精品微信小程序开发门户,代码全部亲测可用

  • 首页   /  
  • 作者: east
  • ( 页面57 )
Android, Harmony 6月 8,2021

鸿蒙Harmony和Android共享数据对比

在现在多应用互动,多屏互动的时代,共享数据在日常应用中非常多,harmony和android共享数据的机制也比较类似。

Harmony共享数据:

harmony使用Data模板的Ability(以下简称“Data”)有助于应用管理其自身和其他应用存储数据的访问,并提供与其他应用共享数据的方法。Data既可用于同设备不同应用的数据共享,也支持跨设备不同应用的数据共享。

数据的存放形式多样,可以是数据库,也可以是磁盘上的文件。Data对外提供对数据的增、删、改、查,以及打开文件等接口,这些接口的具体实现由开发者提供。

URI介绍

Data的提供方和使用方都通过URI(Uniform Resource Identifier)来标识一个具体的数据,例如数据库中的某个表或磁盘上的某个文件。HarmonyOS的URI仍基于URI通用标准,格式如下:

  • scheme:协议方案名,固定为“dataability”,代表Data Ability所使用的协议类型。
  • authority:设备ID。如果为跨设备场景,则为目标设备的ID;如果为本地设备场景,则不需要填写。
  • path:资源的路径信息,代表特定资源的位置信息。
  • query:查询参数。
  • fragment:可以用于指示要访问的子资源。

URI示例:

  • 跨设备场景:dataability://device_id/com.domainname.dataability.persondata/person/10
  • 本地设备:dataability:///com.domainname.dataability.persondata/person/10

Android共享数据:

在Android中有很多的内容提供者,包括内置的、自己编写的和他人编写的。那么,如何识别和找到需要的内容提供者呢?Android提供了一种叫做Content URI技术,通过它可以指定一个内容提供者,访问内容提供者后面的资源。

Android中的Content URI就是Android平台的内容资源定位符,与Web上的应用一样,Android平台上的Content URI定义的时候也要全球唯一,因此它的命名可以借助所在应用的包名命名,但是要注意这种命名方式不是必须的,而是推荐的命名方式。因为一个应用的包名是唯一的,不会重复的。

(1)协议名字。content是URI协议名字,content表明这个URI是一个内容提供器。类似于http://www.acme.com/icons/logo.gif中的HTTP,协议名不可以修改。

(2)权限。URI的权限部分,用来标识内容提供者,它的命名必须确保唯一性,类似于http://www.acme.com/icons/logo.gif中的www.acme.com部分。

(3)路径。用来判断请求数据类型的路径。在Content URI中可以有0个或多个路径。类似http://www.acme.com/icons/logo.gif中的icons部分。

(4)id。被指定的特定记录的id,如果没有指定特定id记录,这个部分可以省略,类似于http://www.acme.com/icons/logo.gif中的logo.gif部分。

对比说明:

从上面看,harmony和android共享数据定义的协议URI非常类似,harmony多了一个填写设备ID可用于跨屏。

作者 east
Android, Harmony 6月 6,2021

鸿蒙Harmony和Android的UI控件概览对比

Android对于UI控件,可以在xml中来写ui控件, Android 提供对应 View 类及其子类的简明 XML 词汇,如用于微件和布局的词汇。也可使用 Android Studio 的 Layout Editor,并采用拖放界面来构建 XML 布局。 也可以直接在java等代码 创建 View 对象和 ViewGroup 对象(并操纵其属性) 。Harmony提供了Java UI框架和JS UI框架。两者的UI组件还是比较相同,都可以自定义组件。

Android的UI概览:

布局定义了应用中的界面结构(例如 Activity 的界面结构)。布局中的所有元素均使用 View 和 ViewGroup 对象的层次结构进行构建。View 通常用于绘制用户可看到并与之交互的内容。ViewGroup 则是不可见的容器,用于定义 View 和其他 ViewGroup 对象的布局结构

属性

每个 View 对象和 ViewGroup 对象均支持自己的各种 XML 属性。某些属性是 View 对象的特有属性(例如,TextView 支持 textSize 属性),但可扩展此类的任一 View 对象也会继承这些属性。某些属性是所有 View 对象的共有属性,因为它们继承自 View 根类(例如 id 属性)。此外,其他属性被视为“布局参数”,即描述 View 对象特定布局方向的属性,如该对象的父 ViewGroup 对象所定义的属性。

ID

任何 View 对象均可拥有与之关联的整型 ID,用于在结构树中对 View 对象进行唯一标识。编译应用后,系统会以整型形式引用此 ID,但在布局 XML 文件中,系统通常会以字符串的形式在 id 属性中指定该 ID。这是所有 View 对象共有的 XML 属性(由 View 类定义),并且您会经常使用该属性。XML 标记内部的 ID 语法是:

android:id="@+id/my_button"

字符串开头处的 @ 符号指示 XML 解析器应解析并展开 ID 字符串的其余部分,并将其标识为 ID 资源。加号 (+) 表示这是一个新的资源名称,必须创建该名称并将其添加到我们的资源(在 R.java 文件中)内。Android 框架还提供许多其他 ID 资源。引用 Android 资源 ID 时,不需要加号,但必须添加 android 软件包命名空间,如下所示:

android:id="@android:id/empty"

Harmony的Java UI概览:

应用的Ability在屏幕上将显示一个用户界面,该界面用来显示所有可被用户查看和交互的内容。

应用中所有的用户界面元素都是由Component和ComponentContainer对象构成。Component是绘制在屏幕上的一个对象,用户能与之交互。ComponentContainer是一个用于容纳其他Component和ComponentContainer对象的容器。

Java UI框架提供了一部分Component和ComponentContainer的具体子类,即创建用户界面(UI)的各类组件,包括一些常用的组件(比如:文本、按钮、图片、列表等)和常用的布局(比如:DirectionalLayout和DependentLayout)。用户可通过组件进行交互操作,并获得响应。

所有的UI操作都应该在主线程进行设置。

组件和布局

用户界面元素统称为组件,组件根据一定的层级结构进行组合形成布局。组件在未被添加到布局中时,既无法显示也无法交互,因此一个用户界面至少包含一个布局。在UI框架中,具体的布局类通常以XXLayout命名,完整的用户界面是一个布局,用户界面中的一部分也可以是一个布局。布局中容纳Component与ComponentContainer对象。

Component和ComponentContainer
  • Component:提供内容显示,是界面中所有组件的基类,开发者可以给Component设置事件处理回调来创建一个可交互的组件。Java UI框架提供了一些常用的界面元素,也可称之为组件,组件一般直接继承Component或它的子类,如Text、Image等。
  • ComponentContainer:作为容器容纳Component或ComponentContainer对象,并对它们进行布局。Java UI框架提供了一些标准布局功能的容器,它们继承自ComponentContainer,一般以“Layout”结尾,如DirectionalLayout、DependentLayout等。

图1 Component结构

LayoutConfig

每种布局都根据自身特点提供LayoutConfig供子Component设定布局属性和参数,通过指定布局属性可以对子Component在布局中的显示效果进行约束。例如:“width”、“height”是最基本的布局属性,它们指定了组件的大小。图2 LayoutConfig

组件树

布局把Component和ComponentContainer以树状的层级结构进行组织,这样的一个布局就称为组件树。组件树的特点是仅有一个根组件,其他组件有且仅有一个父节点,组件之间的关系受到父节点的规则约束。

Harmony JS UI框架概览:

JS UI框架是一种跨设备的高性能UI开发框架,支持声明式编程和跨设备多态UI。阅读本开发指南前,开发者需要掌握以下基础知识:

  • HTML5
  • CSS
  • JavaScript

关于组件和接口的详细参考文档请参见JS API参考。说明

本文档适用于手机(Phone)、平板(Tablet)、智慧屏(TV)和智能穿戴(Wearable)应用开发,针对轻量级智能穿戴(Lite Wearable)请参考轻量级智能穿戴开发。

基础能力
  • 声明式编程JS UI框架采用类HTML和CSS声明式编程语言作为页面布局和页面样式的开发语言,页面业务逻辑则支持ECMAScript规范的JavaScript语言。JS UI框架提供的声明式编程,可以让开发者避免编写UI状态切换的代码,视图配置信息更加直观。
  • 跨设备开发框架架构上支持UI跨设备显示能力,运行时自动映射到不同设备类型,开发者无感知,降低开发者多设备适配成本。
  • 高性能开发框架包含了许多核心的控件,如列表、图片和各类容器组件等,针对声明式语法进行了渲染流程的优化。
整体架构

JS UI框架包括应用层(Application)、前端框架层(Framework)、引擎层(Engine)和平台适配层(Porting Layer)。

  • Application应用层表示开发者使用JS UI框架开发的FA应用,这里的FA应用特指JS FA应用。使用Java开发FA应用请参考《Java UI框架》。
  • Framework前端框架层主要完成前端页面解析,以及提供MVVM(Model-View-ViewModel)开发模式、页面路由机制和自定义组件等能力。
  • Engine引擎层主要提供动画解析、DOM(Document Object Model)树构建、布局计算、渲染命令构建与绘制、事件管理等能力。
  • Porting Layer适配层主要完成对平台层进行抽象,提供抽象接口,可以对接到系统平台。比如:事件对接、渲染管线对接和系统生命周期对接等。

上一篇

作者 east
Android, Harmony 6月 6,2021

Harmony鸿蒙和Android安卓资源文件的分类对比

鸿蒙Harmoney的资源文件和Android很类似,下面做一些对比:

先来个总的概览:

Android的资源目录结构:

    res/
        drawable/
            graphic.png
        drawable-en/
        drawable-fr-rCA/
        drawable-en-port/
        drawable-en-notouch-12key/
        drawable-port-ldpi/
        drawable-port-notouch-12key/
        layout/
            main.xml
            info.xml
        mipmap/
            icon.png
        values/
            strings.xml
        drawable/

Harmoney的资源目录结构:

resources
|---base  // 默认存在的目录
|   |---element
|   |   |---string.json
|   |---media
|   |   |---icon.png
|---en_GB-vertical-car-mdpi // 限定词目录示例,需要开发者自行创建   
|   |---element
|   |   |---string.json
|   |---media
|   |   |---icon.png
|---rawfile  // 默认存在的目录

对比:目录结构差不多,都有存放图片、存放字符串的,都有配置限定字符,都是默认的目录;不同的是harmoney采用json,而不像android主要用xml来描述。

Android的限定词取值规则:

配置限定符值描述MCC 和 MNC示例:
mcc310
mcc310-mnc004
mcc208-mnc00
等等

移动设备国家代码 (MCC),(可选)后跟设备 SIM 卡中的移动设备网络代码 (MNC)。例如,mcc310 是指美国的任一运营商,mcc310-mnc004 是指美国的 Verizon 公司,mcc208-mnc00 是指法国的 Orange 公司。

如果设备使用无线装置连接(GSM 手机),则 MCC 和 MNC 值均来自 SIM 卡。

您也可以单独使用 MCC(例如,将国家/地区特定的合法资源加入应用)。如果只需根据语言指定,则改用语言和地区限定符(稍后进行介绍)。如果决定使用 MCC 和 MNC 限定符,请谨慎执行此操作并测试限定符是否按预期工作。

另请参阅配置字段 mcc 和 mnc,二者分别表示当前的移动设备国家代码和移动设备网络代码。语言和区域示例:
en
fr
en-rUS
fr-rFR
fr-rCA
b+en
b+en+US
b+es+419

语言通过由两个字母组成的 ISO 639-1 语言代码进行定义,可以选择后跟两个字母组成的 ISO 3166-1-alpha-2 区域码(前缀用小写字母 r)。

这些代码不区分大小写;r 前缀用于区分区域码。您不能单独指定区域。

Android 7.0(API 级别 24)引入对 BCP 47 语言标记的支持,可供您用来限定特定语言和区域的资源。语言标记由一个或多个子标记序列组成,每个子标记都能优化或缩小由整体标记标识的语言范围。如需了解有关语言标记的详细信息,请参阅用于标识语言的标记。

如要使用 BCP 47 语言标记,请将 b+ 和两个字母的 ISO 639-1 语言代码连接;其后还可选择使用其他子标记,用 + 分隔即可。

如果用户在系统设置中更改语言,则语言标记可能会在应用的生命周期中发生变更。如需了解运行时应用会因此受到何种影响,请参阅处理运行时变更。

有关针对其他语言本地化应用的完整指南,请参阅本地化。

另请参阅 getLocales() 方法,了解该方法提供的已定义语言区域列表。此列表包含主要的语言区域。布局方向ldrtl
ldltr

应用的布局方向。ldrtl 是指“布局方向从右到左”。ldltr 是指“布局方向从左到右”(默认的隐式值)。

此配置适用于布局、可绘制资源或值等任何资源。

例如,若要针对阿拉伯语提供某种特定布局,并针对任何其他“从右到左”的语言(如波斯语或希伯来语)提供某种通用布局,则可提供以下资源:

res/
    layout/
        main.xml (Default layout)
    layout-ar/
        main.xml (Specific layout for Arabic)
    layout-ldrtl/
        main.xml (Any "right-to-left" language, except
                  for Arabic, because the "ar" language qualifier
                  has a higher precedence.)

请注意:如要为应用启用从右到左的布局功能,则必须将 supportsRtl 设置为 "true",并将 targetSdkVersion 设置为 17 或更高版本。

此项为 API 级别 17 中的新增配置。smallestWidthsw<N>dp

示例:
sw320dp
sw600dp
sw720dp
等等

屏幕的基本尺寸,由可用屏幕区域的最小尺寸指定。具体而言,设备的 smallestWidth 是屏幕可用高度和宽度的最小尺寸(您也可将其视为屏幕的“最小可能宽度”)。无论屏幕的当前方向如何,您均可使用此限定符确保应用界面的可用宽度至少为 <N> dp。

例如,如果布局要求屏幕区域的最小尺寸始终至少为 600dp,则可使用此限定符创建布局资源 res/layout-sw600dp/。仅当可用屏幕的最小尺寸至少为 600dp(无论 600dp 表示的边是用户所认为的高度还是宽度)时,系统才会使用这些资源。最小宽度为设备的固定屏幕尺寸特征;即使屏幕方向发生变化,设备的最小宽度仍会保持不变。

使用最小宽度确定一般屏幕尺寸非常有用,因为宽度通常是设计布局时的驱动因素。界面经常会垂直滚动,但对其水平方向所需要的最小空间具有非常硬性的限制。可用宽度也是确定是否对手持式设备使用单窗格布局,或对平板电脑使用多窗格布局的关键因素。因此,您可能最关注每台设备上的最小可能宽度。

设备的最小宽度会将屏幕装饰元素和系统界面考虑在内。例如,如果设备屏幕上的某些永久性界面元素沿着最小宽度轴占据空间,则系统会声明最小宽度小于实际屏幕尺寸,因为这些屏幕像素不适用于您的界面。

以下是一些可用于常见屏幕尺寸的值:

  • 320,适用于屏幕配置如下的设备:
    • 240×320 ldpi(QVGA 手机)
    • 320×480 mdpi(手机)
    • 480×800 hdpi(高密度手机)
  • 480,适用于 480×800 mdpi 之类的屏幕(平板电脑/手机)。
  • 600,适用于 600×1024 mdpi 之类的屏幕(7 英寸平板电脑)。
  • 720,适用于 720×1280 mdpi 之类的屏幕(10 英寸平板电脑)。

当应用为多个资源目录提供不同的 smallestWidth 限定符值时,系统会使用最接近(但未超出)设备 smallestWidth 的值。

此项为 API 级别 13 中的新增配置。

另请参阅 android:requiresSmallestWidthDp 属性(声明与应用兼容的最小 smallestWidth)和 smallestScreenWidthDp 配置字段(存放设备的 smallestWidth 值)。

如需了解有关不同屏幕设计和使用此限定符的详细信息,请参阅支持多种屏幕开发者指南。可用宽度w<N>dp

示例:
w720dp
w1024dp
等等

指定资源应使用的最小可用屏幕宽度(以 dp 为单位,由 <N> 值定义)。当屏幕方向在横向和纵向之间切换时,此配置值也会随之变化,以匹配当前的实际宽度。

此功能往往有助于确定是否使用多窗格布局,因为即便在使用平板电脑设备时,您通常也不希望竖屏以横屏的方式使用多窗格布局。因此,您可以使用此功能指定布局所需的最小宽度,而无需同时使用屏幕尺寸和屏幕方向限定符。

应用为此配置提供具有不同值的多个资源目录时,系统会使用最接近(但未超出)设备当前屏幕宽度的值。此处的值会考虑屏幕装饰元素,因此如果设备显示屏的左边缘或右边缘上有一些永久性 UI 元素,考虑到这些 UI 元素,同时为减少应用的可用空间,设备会使用小于实际屏幕尺寸的宽度值。

此项为 API 级别 13 中的新增配置。

另请参阅 screenWidthDp 配置字段,该字段存放当前屏幕宽度。

如需了解有关不同屏幕设计和使用此限定符的详细信息,请参阅支持多种屏幕开发者指南。可用高度h<N>dp

示例:
h720dp
h1024dp
等等

指定资源应使用的最小可用屏幕高度(以“dp”为单位,由 <N> 值定义)。当屏幕方向在横向和纵向之间切换时,此配置值也会随之变化,以匹配当前的实际高度。

对比使用此方式定义布局所需高度与使用 w<N>dp 定义所需宽度,二者均非常有用,且都无需同时使用屏幕尺寸和方向限定符。但大多数应用不需要此限定符,因为界面经常垂直滚动,所以高度需更有弹性,而宽度则应更固定。

当应用为此配置提供具有不同值的多个资源目录时,系统会使用最接近(但未超出)设备当前屏幕高度的值。此处的值会考虑屏幕装饰元素,因此如果设备显示屏的上边缘或下边缘上有一些永久性 UI 元素,考虑到这些 UI 元素,同时为减少应用的可用空间,设备会使用小于实际屏幕尺寸的高度值。非固定的屏幕装饰元素(例如,全屏时可隐藏的手机状态栏)并不在考虑范围内,标题栏或操作栏等窗口装饰亦如此,因此应用必须准备好处理稍小于其指定值的空间。

此项为 API 级别 13 中的新增配置。

另请参阅 screenHeightDp 配置字段,该字段存放当前屏幕宽度。

如需了解有关不同屏幕设计和使用此限定符的详细信息,请参阅支持多种屏幕开发者指南。屏幕尺寸small
normal
large
xlarge

  • small:尺寸类似于低密度 VGA 屏幕的屏幕。小屏幕的最小布局尺寸约为 320×426 dp。例如,QVGA 低密度屏幕和 VGA 高密度屏幕。
  • normal:尺寸类似于中等密度 HVGA 屏幕的屏幕。标准屏幕的最小布局尺寸约为 320×470 dp。例如,WQVGA 低密度屏幕、HVGA 中等密度屏幕、WVGA 高密度屏幕。
  • large:尺寸类似于中等密度 VGA 屏幕的屏幕。大屏幕的最小布局尺寸约为 480×640 dp。例如,VGA 和 WVGA 中等密度屏幕。
  • xlarge:明显大于传统中等密度 HVGA 屏幕的屏幕。超大屏幕的最小布局尺寸约为 720×960 dp。在大多数情况下,屏幕超大的设备体积太大,不能放进口袋,最常见的是平板式设备。此项为 API 级别 9 中的新增配置。

请注意:使用尺寸限定符并不表示资源仅适用于该尺寸的屏幕。如果没有为备用资源提供最符合当前设备配置的限定符,则系统可能会使用其中最匹配的资源。

注意:如果所有资源均使用大于当前屏幕的尺寸限定符,则系统不会使用这些资源,并且应用将在运行时崩溃(例如,如果所有布局资源均以 xlarge 限定符标记,但设备是标准尺寸的屏幕)。

此项为 API 级别 4 中的新增配置。

如需了解详细信息,请参阅支持多种屏幕。

另请参阅 screenLayout 配置字段,该字段指示屏幕是小尺寸、标准尺寸还是大尺寸。屏幕纵横比long
notlong

  • long:宽屏,如 WQVGA、WVGA、FWVGA
  • notlong:非宽屏,如 QVGA、HVGA 和 VGA

此项为 API 级别 4 中新增配置。

此配置完全基于屏幕的纵横比(宽屏较宽),并且与屏幕方向无关。

另请参阅 screenLayout 配置字段,该字段指示屏幕是否为宽屏。圆形屏幕round
notround

  • round:圆形屏幕,例如圆形可穿戴式设备
  • notround:方形屏幕,例如手机或平板电脑

此项为 API 级别 23 中的新增配置。

另请参阅 isScreenRound() 配置方法,该方法指示屏幕是否为圆形屏幕。广色域widecg
nowidecg

  • {@code widecg}:显示广色域,如 Display P3 或 AdobeRGB
  • {@code nowidecg}:显示窄色域,如 sRGB

此项为 API 级别 26 中的新增配置。

另请参阅 isScreenWideColorGamut() 配置方法,该方法指示屏幕是否具有广色域。高动态范围 (HDR)highdr
lowdr

  • {@code highdr}:显示高动态范围
  • {@code lowdr}:显示低/标准动态范围

此项为 API 级别 26 中的新增配置。

另请参阅 isScreenHdr() 配置方法,该方法指示屏幕是否具有 HDR 功能。屏幕方向port
land

  • port:设备处于纵向(垂直)
  • land:设备处于横向状态(水平)

如果用户旋转屏幕,此配置可能会在应用生命周期中发生变化。如需了解这会在运行时期间给应用带来哪些影响,请参阅处理运行时变更。

另请参阅 orientation 配置字段,该字段指示当前的设备方向。界面模式car
desk
television
appliance
watch
vrheadset

  • car:设备正在车载手机座上显示
  • desk:设备正在桌面手机座上显示
  • television:设备正在通过电视显示内容,通过将界面投影到离用户较远的大屏幕上,为用户提供“十英尺”体验。主要面向遥控交互或其他非触控式交互
  • appliance:设备正在用作没有显示屏的装置
  • watch:设备配有显示屏,并且可戴在手腕上
  • vrheadset:设备正在通过虚拟现实耳机显示内容

此项为 API 级别 8 中的新增配置,API 13 中的新增电视配置,API 20 中的新增手表配置。

如需了解应用在设备插入基座或从中移除时的响应方式,请阅读确定并监控插接状态和类型。

如果用户将设备插入基座,此配置可能会在应用生命周期中发生变化。您可以使用 UiModeManager 启用或禁用其中的部分模式。如需了解这会在运行时期间给应用带来哪些影响,请参阅处理运行时变更。夜间模式night
notnight

  • night:夜间
  • notnight:白天

此项为 API 级别 8 中的新增配置。

如果夜间模式停留在自动模式(默认),此配置可能会在应用生命周期中发生变化。在此情况下,该模式会根据当天的时间进行调整。您可以使用 UiModeManager 启用或禁用此模式。如需了解这会在运行时期间给应用带来哪些影响,请参阅处理运行时变更。屏幕像素密度 (dpi)ldpi
mdpi
hdpi
xhdpi
xxhdpi
xxxhdpi
nodpi
tvdpi
anydpi
nnndpi

  • ldpi:低密度屏幕;约为 120dpi。
  • mdpi:中等密度(传统 HVGA)屏幕;约为 160dpi。
  • hdpi:高密度屏幕;约为 240dpi。
  • xhdpi:超高密度屏幕;约为 320dpi。此项为 API 级别 8 中的新增配置
  • xxhdpi:绝高密度屏幕;约为 480dpi。此项为 API 级别 16 中的新增配置
  • xxxhdpi:极高密度屏幕使用(仅限启动器图标,请参阅支持多种屏幕中的注释);约为 640dpi。此项为 API 级别 18 中的新增配置
  • nodpi:可用于您不希望为匹配设备密度而进行缩放的位图资源。
  • tvdpi:密度介于 mdpi 和 hdpi 之间的屏幕;约为 213dpi。此限定符并非指“基本”密度的屏幕。它主要用于电视,且大多数应用都不使用该密度 — 大多数应用只会使用 mdpi 和 hdpi 资源,而且系统将根据需要对这些资源进行缩放。此项为 API 级别 13 中的新增配置
  • anydpi:此限定符适合所有屏幕密度,其优先级高于其他限定符。这非常适用于矢量可绘制对象。此项为 API 级别 21 中的新增配置
  • nnndpi:用于表示非标准密度,其中 nnn 是正整数屏幕密度。此限定符不适用于大多数情况。使用标准密度存储分区,可显著减少因支持市场上各种设备屏幕密度而产生的开销。

六个基本密度之间的缩放比为 3:4:6:8:12:16(忽略 tvdpi 密度)。因此,9×9 (ldpi) 位图相当于 12×12 (mdpi)、18×18 (hdpi)、24×24 (xhdpi) 位图,依此类推。

如果您认为图像资源在电视或其他某些设备上的呈现效果不够好,进而想尝试使用 tvdpi 资源,则缩放系数应为 1.33*mdpi。例如,mdpi 屏幕的 100px x 100px 图像应相当于 tvdpi 屏幕的 133px x 133px 图像。

请注意:使用密度限定符并不表示资源仅适用于该密度的屏幕。如果没有为备用资源提供最符合当前设备配置的限定符,则系统可能使用其中最匹配的资源。

如需详细了解如何处理不同屏幕密度以及 Android 如何缩放位图以适应当前密度,请参阅支持多种屏幕。触摸屏类型notouch
finger

  • notouch:设备没有触摸屏。
  • finger:设备有一个专供用户通过手指直接进行交互的触摸屏。

另请参阅 touchscreen 配置字段,该字段指示设备上的触摸屏类型。键盘可用性keysexposed
keyshidden
keyssoft

  • keysexposed:设备拥有可用的键盘。如果设备启用了软键盘(不无可能),那么即使用户未找到硬键盘,或者该设备没有硬键盘,也可使用此限定符。如果未提供或已禁用软键盘,则只有在配备硬键盘的情况下才可使用此限定符。
  • keyshidden:设备具有可用的硬键盘,但其处于隐藏状态,且设备未启用软键盘。
  • keyssoft:设备已启用软键盘(无论是否可见)。

如果您提供了 keysexposed 资源,但未提供 keyssoft 资源,则无论键盘是否可见,只要系统已启用软键盘,其便会使用 keysexposed 资源。

如果用户打开硬键盘,此配置可能会在应用生命周期中发生变化。如需了解这会在运行时期间给应用带来哪些影响,请参阅处理运行时变更。

另请参阅配置字段 hardKeyboardHidden 和 keyboardHidden,二者分别指示硬键盘的可见性和任一键盘(包括软键盘)的可见性。主要的文本输入法nokeys
qwerty
12key

  • nokeys:设备没有用于文本输入的硬按键。
  • qwerty:设备拥有标准硬键盘(无论是否对用户可见)。
  • 12key:设备拥有 12 键硬键盘(无论是否对用户可见)。

另请参阅 keyboard 配置字段,该字段指示可用的主要文本输入法。导航键可用性navexposed
navhidden

  • navexposed:导航键可供用户使用。
  • navhidden:导航键不可用(例如,在密封盖子后面)。

如果用户显示导航键,此配置可能会在应用生命周期中发生变化。如需了解这会在运行时期间给应用带来哪些影响,请参阅处理运行时变更。

另请参阅 navigationHidden 配置字段,该字段指示导航键是否处于隐藏状态。主要的非触摸导航方法nonav
dpad
trackball
wheel

  • nonav:除了使用触摸屏以外,设备没有其他导航设施。
  • dpad:设备具有用于导航的方向键。
  • trackball:设备具有用于导航的轨迹球。
  • wheel:设备具有用于导航的方向盘(不常见)。

另请参阅 navigation 配置字段,该字段指示可用的导航方法类型。平台版本(API 级别)示例:
v3
v4
v7
等等

设备支持的 API 级别。例如,v1 对应 API 级别 1(装有 Android 1.0 或更高版本系统的设备),v4 对应 API 级别 4(装有 Android 1.6 或更高版本系统的设备)。如需了解有关这些值的详细信息,请参阅 Android API 级别文档。

Harmony的限定词取值规则:

限定词类型含义与取值说明
移动国家码和移动网络码移动国家码(MCC)和移动网络码(MNC)的值取自设备注册的网络。MCC后面可以跟随MNC,使用下划线(_)连接,也可以单独使用。例如:mcc460表示中国,mcc460_mnc00表示中国_中国移动。详细取值范围,请查阅ITU-T E.212(国际电联相关标准)。
语言表示设备使用的语言类型,由2~3个小写字母组成。例如:zh表示中文,en表示英语,mai表示迈蒂利语。详细取值范围,请查阅ISO 639(ISO制定的语言编码标准)。
文字表示设备使用的文字类型,由1个大写字母(首字母)和3个小写字母组成。例如:Hans表示简体中文,Hant表示繁体中文。详细取值范围,请查阅ISO 15924(ISO制定的文字编码标准)。
国家或地区表示用户所在的国家或地区,由2~3个大写字母或者3个数字组成。例如:CN表示中国,GB表示英国。详细取值范围,请查阅ISO 3166-1(ISO制定的国家和地区编码标准)。
横竖屏表示设备的屏幕方向,取值如下:vertical:竖屏horizontal:横屏
设备类型表示设备的类型,取值如下:phone:手机tablet:平板car:车机tv:智慧屏wearable:智能穿戴
颜色模式表示设备的颜色模式,取值如下:dark:深色模式light:浅色模式
屏幕密度表示设备的屏幕密度(单位为dpi),取值如下:sdpi:表示小规模的屏幕密度(Small-scale Dots Per Inch),适用于dpi取值为(0, 120]的设备。mdpi:表示中规模的屏幕密度(Medium-scale Dots Per Inch),适用于dpi取值为(120, 160]的设备。ldpi:表示大规模的屏幕密度(Large-scale Dots Per Inch),适用于dpi取值为(160, 240]的设备。xldpi:表示特大规模的屏幕密度(Extra Large-scale Dots Per Inch),适用于dpi取值为(240, 320]的设备。xxldpi:表示超大规模的屏幕密度(Extra Extra Large-scale Dots Per Inch),适用于dpi取值为(320, 480]的设备。xxxldpi:表示超特大规模的屏幕密度(Extra Extra Extra Large-scale Dots Per Inch),适用于dpi取值为(480, 640]的设备。

对比说明:

还是很类似,比如语言、横竖屏,android发展年数比较久,规则和完档相对多些。而harmony强大之处是支持万物互联,比android多了一些支持设备。

作者 east
Harmony 6月 6,2021

鸿蒙HarmonyOS应用基础知识对比Android App和微信小程序

鸿蒙HarmonyOS近日正式推出,作为一个Android App和微信小程序的程序员,从应用基础知识横向对比一下Android App和微信小程序。

用户应用程序

用户应用程序泛指运行在设备的操作系统之上,为用户提供特定服务的程序,简称“应用”。

在HarmonyOS上运行的应用,有两种形态:

  • 传统方式的需要安装的应用。(这个和Android App相同)
  • 提供特定功能,免安装的应用(即原子化服务)。(有些类似小程序)

在HarmonyOS文档中,如无特殊说明,“应用”所指代的对象包括上述两种形态。

(看到这里,觉得鸿蒙是有后发优势,是聚多个优点的集大成者)

用户应用程序包结构

HarmonyOS的用户应用程序包以APP Pack(Application Package)形式发布,它是由一个或多个HAP(HarmonyOS Ability Package)以及描述每个HAP属性的pack.info组成。HAP是Ability的部署包,HarmonyOS应用代码围绕Ability组件展开。

一个HAP是由代码、资源、第三方库及应用配置文件组成的模块包,可分为entry和feature两种模块类型,如图1所示。

  • entry:应用的主模块。一个APP中,对于同一设备类型必须有且只有一个entry类型的HAP,可独立安装运行。(类似Android,但Android后期太碎片化了,版本匹配非常头疼)
  • feature:应用的动态特性模块。一个APP可以包含一个或多个feature类型的HAP,也可以不含。只有包含Ability的HAP才能够独立运行。

图1 APP逻辑视图

Ability

Ability是应用所具备的能力的抽象,一个应用可以包含一个或多个Ability。Ability分为两种类型:FA(Feature Ability)和PA(Particle Ability)。FA/PA是应用的基本组成单元,能够实现特定的业务功能。FA有UI界面,而PA无UI界面。

库文件

库文件是应用依赖的第三方代码(例如so、jar、bin、har等二进制文件),存放在libs目录。(这个类似于Android App)

资源文件

应用的资源文件(字符串、图片、音频等)存放于resources目录下,便于开发者使用和维护,详见资源文件的分类。
(这个类似于Android App)

配置文件

配置文件 (config.json) 是应用的Ability信息,用于声明应用的Ability,以及应用所需权限等信息,详见应用配置文件。
(这个类似于Android App和微信小程序,微信小程序这个文件叫app.json,Android App叫AndroidManifest.xml)

pack.info

描述应用软件包中每个HAP的属性,由IDE编译生成,应用市场根据该文件进行拆包和HAP的分类存储。HAP的具体属性包括:

  • delivery-with-install: 表示该HAP是否支持随应用安装。“true”表示支持随应用安装;“false”表示不支持随应用安装。
  • name:HAP文件名。
  • module-type:模块类型,entry或feature。
  • device-type:表示支持该HAP运行的设备类型。

HAR

HAR(HarmonyOS Ability Resources)可以提供构建应用所需的所有内容,包括源代码、资源文件和config.json文件。HAR不同于HAP,HAR不能独立安装运行在设备上,只能作为应用模块的依赖项被引用。

作者 east
Hbase 6月 4,2021

使用Hbase出现KeeperErrorCode = Session expired for /hbase/hbaseid

在使用FusionInsight HD大数据平台安全认证模式时,用hbase Shell或代码调用hbase时,有时出现”KeeperErrorCode = Session expired for /hbase/hbaseid”等错误。这是因为安全认证session过时了。

可以切换到hd,使用HBase客户端安装目录 ,输入下面命令

source bigdata_env
kinit 组件业务用户
按提示输入密码

再使用hbase shell就不会上面的问题。
如果是在Spark上调用的话,可以在调用的shell脚本上kinit 指定机机认证的安全认证文件。或者干脆写个定时执行的脚本配置在crontab上。

作者 east
私域流量 6月 3,2021

微信如何打造高信任人设

没有人设的微信个人号是没有灵魂的。你的用户渴望成为什么样的人,你的人设就应该是什么样的。要努力成为你的用户想要成为的样子。微信个人号的人设是用户信任的前提,当你的用户不够了解你时,你是很难通过微信成交的。人设能够让你的微信个人号拥有“灵魂”,使其有血、有肉、有故事,在跟你聊天时,用户不会觉得是在与一个“微信号”聊天,而是在与一个“有趣的人”聊天。

人设的标签

主标签主要描述你要做的主要的事,属于职业标签,比如笔者的主标签是门店私域流量。主标签是能够在一个细分领域展示自己最擅长的内容,切记不要同时出现多个主标签,多一个标签就会降低用户对你专业性的信任度。××品牌创始人、××产品运营总监、××平台首席文案官等,都属于职业属性标签。辅助标签是用于辅助你的主标签的,属于生活标签,比如笔者的辅标签有自律、爱读书、爱分享。辅助标签是用来增加你与用户之间关系的点。在生活标签中,比如还可以设定为一年读书××本、一年旅行××个城市、1个月瘦身××斤等,以凸显自己在某一方面的特长。确定了主标签、辅助标签后,也就确定了个人号主要打造的方向。

自我介绍

自我介绍是用户了解你的基础,很多人在进行微信社交时,是没有自我介绍意识的,往往加对方为好友之后甚至对方都不知道你是做什么的,你也不了解对方是做什么的,很难产生关系连接。有数据调查显示,如果微信好友不知道你是做什么的、能够给对方提供什么价值,你被删除的概率将上升一倍。那么如何在微信上面进行自我介绍更好呢?首先我们要考虑,做自我介绍的目的,是希望对方能够了解“我”、了解“我正在做的事情”,还是希望未来能够产生更多连接和机会。笔者经常在微信里面向那些笔者不知道是做什么的好友要他们的自我介绍,有的好友只是发给笔者一个名字,但仅知道名字又能有什么用呢?如果笔者知道了好友是做什么的,可能还可以帮助对方提供一些合作资源。自我介绍的五个核心点是:①能够帮助别人解决什么问题;②让别人知道你是做什么的;③让别人对我产生兴趣,主动连接;④证明自己有这样的能力;⑤让别人知道自己是做什么的并且能够短时间内记住你。

1、自我介绍的要素

高质量自我介绍公式=昵称+城市+主标签/主业务+主要成就+拥有的资源+需求资源当用户加你为好友之后,给对方的第一印象就是你的自我介绍。有关昵称与城市的介绍可以让用户感知到你是一个真实的人物,主标签与主业务是你目前最主要的身份,比如笔者的主标签和主业务的介绍就是“门店私域流量操盘手”。你可根据卖的产品直接介绍自己,卖服装的可以设定为金牌服装穿搭师,卖减肥产品的可以设定为营养师,卖母婴类产品的可以设定为育儿专家,美妆品牌可以设定为美妆达人或皮肤管理专家等。主要成就介绍是用来给对方展示你的主标签体现的价值的,比如已帮助374个人健康减重5000斤、单次裂变增长活动零成本1天增粉10万、帮助500位宝妈守护宝宝健康、已服务300多个品牌搭建私域流量可循环体系等,在进行主要成就的介绍中,尤其要突出具体的数字或者效果,这样才能更加真实和直观。拥有的资源,是能够给对方提供的价值,比如你是一个购物中心的店长,你拥有的是购物中心的内购价、本地的合作资源等;比如你拥有的是系统育儿的知识体系,可以辅导宝妈育儿。对你自己所拥有、能够提供的资源进行梳理,要思考清楚哪些真正能够帮助到对方

2、自我介绍的原则

自我介绍的第一个原则是以个人为中心,而不是以产品为中心。你在给用户发送自我介绍时,是在“卖你自己”,而不是卖你的产品,在对方对你有了一定了解之后,再进行你所经营产品的介绍。在介绍内容中加上自己能够给对方提供的除产品以外的其他价值,会让对方认为你是对他有价值的人。第二个原则是自我介绍要简明扼要,曾经看过很多人的自我介绍,超过150字的介绍基本上没有人能够看完,也就是说在用自我介绍传递自我价值的过程中要不断提炼和优化介绍内容。第三个原则是对于不同的人提供多个版本的自我介绍,针对不同用户和其需求进行自我介绍。

3、优秀的自我介绍

比如笔者的一个朋友是朋友圈运营专家,他的自我介绍就是:【昵称】:端银【城市】:广州【标签】:“90后”朋友圈营销“老司机”,网易、创业邦等全网37个平台特邀课程讲师,累积帮助上万名学员实现月增收1000元以上。【特长】:擅长朋友圈营销和课程培训,全网累积有20多万名学员学习过我的朋友圈课程。【个人经历】:从月薪1000元的实习生靠朋友圈“逆袭”到成为年收入百万元的创业者,毕业一年买房。【我能提供什么】:朋友圈营销思路和方法,帮你靠微信每月多赚1000多元零花钱。在这个介绍过程中目标用户就能感知到自己能够从他这儿获取什么价值,为后面与他进行连接提供了方向。

作者 east
neo4j 5月 27,2021

Neo4j的地理空间特性

很多数据库都有地理空间特性,例如mysql在5.0以上就有,es也有。

从Neo4j 3.0版本开始就内置了有限的空间支持功能。默认支持点和距离。假定点设置了经纬度属性值,就可计算出两点之间的距离。先让我们创建塔,并养成好习惯定义相应的约束:

CREATE CONSTRAINT ON (t:Tower) ASSERT t.name IS UNIQUE
CREATE (paris:Tower {name:"Eiffel Tower",country:"FRA",latitude:48.82322,longitude:2.29323})

CREATE (guangzhou:Tower {name:"Guangzhou Tower",country:"CN",latitude:68.82322,longitude:128.29323})

可通过下面查询语句获得埃菲尔铁塔和其他塔之间的距离:

MATCH (et:Tower {name:'Eiffle Tower'}), (other:Tower)
RETURN et.name, other.name, round(distance(point(et),
point(other))/10)/100 as dist_km

这里的关键是点(point),一个地理位置点是用图数据库中的一个带有纬度和经度属性的节点进行表示,distance函数是通过两点位置计算出来的。Round函数的作用是舍入到最近的整数,使用小技巧(/10/100),可将数值保留到小数点后两位

可通过以下方式查询APOC的空间过程列表:

CALL apoc.help("spatial")

APOC提供了地理编码的可能性,它将地址转换成空间坐标并按距离对路径进行排序。虽然它只是将地址映射到坐标,但不只是两个浮点数,地理编码并不容易,大量工程师在通过代码进行地理编码的变换。存储汽车行走时拍摄的照片需要消耗大量存储资源,识别图片中的数字需要消耗大量的CPU计算资源。因此,首选是不要自己来处理地理编码,而是依赖一个可被APOC透明调用的提供方。

作者 east
私域流量 5月 24,2021

私域流量干货:9种实测有效方法把线下流量引流到线上

1、购物袋引流

引流的福利不一定是价格多高的东西,在用户最有需求的场景下给到用户的东西才是最有价值的。有一个互联网新零售生活用品品牌,将消费用户导流到微信个人号是在用户结账区进行的。顾客需要打包袋时,需要付费1元,但如果顾客扫描张贴在门店收货区的二维码,则可以免费获取,以此达到引流的目的。需要注意的是,打包袋、购物袋、外卖袋的质量不能太差,如果质量太差,容易影响用户对品牌形象的感知,一些知名零售品牌都会定制自己专属的购物袋。

2、停车券引流

在大型购物中心、商业综合体的停车场停车超过一定时长是需要付费的,但如果用户扫描商家的个人号二维码之后,就可以收到商家发来的停车券凭证,用户在离开停车场时可以使用这个凭证,不需要再额外缴费。

3、赠品引流

赠品分为两大类型,一种赠品是在门店内销售的产品,另一种赠品是门店非卖品,比如服装店赠送的袜子、手套、护腕等,餐饮门店赠送的菜品、饮料、折扣等,教育门店赠送的辅导资料、线上课程、书籍等,不同的行业门店赠送的产品可根据现有产品体系来赠送,需要注意的是,不能将自己门店的主打产品作为赠品,要有专属的引流产品。以门店的非卖品作赠品就可以了,可以是有意思的玩偶,比如可爱的米老鼠、唐老鸭、小熊猫等,在阿里巴巴上采购成本在0.5元左右,但是比较吸引小朋友,如果摆放在门店内,有小朋友想要领取时,需要家长添加门店老板的微信个人号。我们经常能够看到在一些商业街上会有一些做微商的团队拿着夜光气球,吸引小朋友的注意,通过给小朋友送气球来添加家长的微信个人号,只不过礼品的成本和人工成本比较高,气球平均成本2元一个。

对于餐饮门店,可以通过赠送餐巾纸的形式来获取用户的微信,比如添加微信好友就可以领取一包手帕纸,手帕纸一般超市的零售价在1元左右,进货成本在0.15~0.2元,用户导流成本很低。有的店专门配备线下“吸粉”用的纸巾机设备,用户扫码关注一个公众号或者一个微信个人号就可以获得一包手帕纸,还有的店是赠送80厘米长的卷纸,成本只需要0.03元。设备商会将设备安装在线下医院、学校、餐厅、车站、机场、卫生间等各个不同的场景,通过广告投放来赚取广告佣金。

4、会员福利

用户添加你为好友,一定是需要一个理由的,对于门店用户而言,添加微信好友后可以享受到哪些特殊待遇,是他们最为关心的。比如在西贝莜面村(简称西贝)的私域流量体系运营中,西贝给予用户多重特权,顾客在西贝完成消费之后,西贝会通过微信公众号给顾客推送一条引导信息:“欢迎您成为西贝VIP会员,您的VIP专属经理已在恭候,扫描二维码,任何问题他都会帮您。”通过这一段话术凸显这个西贝的微信个人号并不是客服号,而是你的专属经理,消除顾客的顾虑。在发送完引导消息之后,西贝还会推出一张引导海报,海报上标注会员可享受到的福利是:解答VIP权益、店内优先取号、新品推荐、问题优先解决、甄选服务、商城福利,给予顾客充分的会员服务待遇。还有一家超市,在超市入口张贴了一张大海报,把微信好友每天可以享受到的权益都写得很清楚,周一到周日八大活动:活动一,群友专属商品。每周一到周日,20种群友专属商品,凭借微信群结账可以享受群友价格。活动二,夜场券疯狂抢。每周二群内抢购夜场券,晚17点到闭店时使用,每人限量1张,抢完为止。活动三,限时秒杀。每周三限时秒杀,精选一款产品,底价让利,让群内小伙伴享受实惠!每人限购一份,先到先得。活动四,超低价商品预售。每周四群内推出一款专项低价预售商品,让群内小伙伴享受实惠,数量有限。活动五,购物满额赠好礼。每周五、六、日,群内小伙伴购物满指定金额即可到换购处领取好礼一份,每人限量一份。活动六,群友问卷调查送好礼。群友们有什么想买的,或有什么好的建议,或者有需要超市改进的地方可以提出来,超市尽量做得更好,并有礼品相赠。活动七,群内小伙伴邀请10名好友进群,凭截图即可到换购处领取礼品一份。活动八,群友生日专属好礼。群友生日当天凭借有效证件,到换购处可领取专属生日礼品一份。这么多的活动和福利,会特别有吸引力,80%以上到店消费的顾客都会被引导到微信个人号,再受邀加入门店专属的微信群内。

5、外卖引流

餐饮外卖平台扣点接近25%,对于餐饮门店商家来讲增加了很多成本,他们也想避开外卖平台的收费,通过建立自己的流量池,用户在微信下单后可以免运费送达,就可以省下25%的平台抽成。在进行外卖平台引流到线上时,需要在引流卡上面标注清楚用户所能享受到的服务,比如添加好友的微信订单可以享受9折优惠、可免除运费、可被邀请到福利群享受各种免单机会等。另外在进行外卖送达时,可以给予用户超值的体验,比如笔者有一天订水果捞,外卖到了之后,商家还送了一个小猪玩具;第二天又订了同一商家的水果捞,送的是一个小黄鸭玩具。我在淘宝上查了一下,这种小赠品成本也就在0.2~0.3元,却能够给客户带来超值的欣喜。

6、红包引流

对于餐饮门店,使用红包引流的形式,可以将门店到店的80%以上的用户都导流到微信个人号里面,我们为此还专门开发了一款红包引流的小程序。将门店需要引流的个人号登录在系统后台的机器人系统中,把这个个人号二维码打印出来,制作成桌卡,摆放在餐桌上面,当顾客在点餐和结账时进行两次引导,告知顾客可以通过扫描二维码获得结账立减红包,每个人都可以抢红包,抢到的红包最后结账的时候可以叠加使用。在系统后台可以设定每一个餐桌可以抢多少个红包,用户扫描二维码添加门店的微信个人号,添加后会给顾客回复一个抢红包的小程序,点击小程序就可以获得一定额度的红包。通过这种形式(见下图),能够在很大程度上提高门店引流的效率。

7、朋友圈好友价

目表朋友圈好友价目表顾名思义就是门店微信个人号好友可以享受到的专属价目表。门店内的产品标注两个价格,对于餐饮店可以采用两种菜单,一个价格是普通用户价格,另一个价格是门店店长朋友圈好友的价格,朋友圈好友可以得到更多优惠福利。如果顾客还不是门店店长的朋友圈好友,可以引导顾客添加,主要目的是将顾客导流至微信个人号上进行深度精细化的运营。顾客每次来店内,都可以享受朋友圈好友的价格。实体门店与门店内大部分的顾客属于半熟人关系,因为在线下店可以见到门店的工作人员、店长或者老板,顾客添加了好友之后能够更加简单地与门店微信个人号建立起信任关系。

8、线下活动引流

很多线下门店经常会举办各类促销活动,每次活动都会产生促销的成本,但是每次促销活动结束之后,并没有把顾客留存在自己的流量池内,造成了大量顾客的流失。将每次参加促销打折活动的顾客统一导流到门店的微信个人号内而不是门店的公众号,可以有效提高门店的用户触达率。除了自家门店的活动外,还可以多参加如本地商场、购物中心等机构举办的线下活动,或者本地其他组织举办的线下活动,通过线下活动进行导流虽然效率比较低,但是能够扩充门店外的流量池,并且在同一场活动上添加的微信好友,能够有更多的互动和留存。

9、鲜花引流

鲜花在用户心智中属于价值、价格比较高的产品,一般10支玫瑰花在线下花店里售价在50~100元,而如果是在昆明国际鲜花交易中心,10支玫瑰花只需要不到9元钱就可以买到。用鲜花作为福利,当用户到店后,引导用户转发门店的宣传海报,凡是转发集赞的用户,都可以赠送一束10支的玫瑰花,或者可以用9元钱购买价值99元的鲜花,用户体验和用户感知会特别好。当然,每个季节有当季的鲜花品种,可根据产地的品种供应,来选择送花的品类。

作者 east
UI控件 5月 23,2021

滑动选型卡微信小程序代码

无论app,还是小程序,都需要像今日头条那样,用滑动选项卡来展示不同的栏目。

通过本组件,能快速方便实现选项卡。

wxml代码如下:

<view class="container">
	<view class="container-body">
		<view class="tab">
			<view class="tab-nav">
				<text wx:for="{{tabnav.tabitem}}" bindtap="setTab" class="{{showtab==index?'active':''}}" data-tabindex="{{index}}" data-type="{{item.type}}" wx:key="{{item.type}}">{{item.text}}</text>
				<view class="tab-line" style="width:{{100/tabnav.tabnum}}%;transform:translateX({{100*showtab}}%);"></view>
			</view>
			<view class="tab-content" style="" bindtouchstart="scrollTouchstart" bindtouchmove="scrollTouchmove" bindtouchend="scrollTouchend" style="width: {{tabnav.tabnum*100}}%;transform:translateX(-{{showtab*100/tabnav.tabnum}}%);margin-left: {{marginleft}}px;">
				<view class="tab-panel">
					<view class="test-list">
						<view class="test-item" wx:for="{{testdata1}}" wx:key="{{item.id}}">
							<view class="test-item-t">类型:{{item.type}}</view>
							<view class="test-item-b">{{item.text}}</view>
						</view>
					</view>
				</view>
				<view class="tab-panel">
					<view class="test-list">
						<view class="test-item" wx:for="{{testdata2}}" wx:key="{{item.id}}">
							<view class="test-item-t">类型:{{item.type}}</view>
							<view class="test-item-b">{{item.text}}</view>
						</view>
					</view>
				</view>
				<view class="tab-panel">
					<view class="test-list">
						<view class="test-item" wx:for="{{testdata3}}" wx:key="{{item.id}}">
							<view class="test-item-t">类型:{{item.type}}</view>
							<view class="test-item-b">{{item.text}}</view>
						</view>
					</view>
				</view>
				<view class="tab-panel">
					<view class="test-list">
						<view class="test-item" wx:for="{{testdata4}}" wx:key="{{item.id}}">
							<view class="test-item-t">类型:{{item.type}}</view>
							<view class="test-item-b">{{item.text}}</view>
						</view>
					</view>
				</view>
				<view class="tab-panel">
					<view class="test-list">
						<view class="test-item" wx:for="{{testdata5}}" wx:key="{{item.id}}">
							<view class="test-item-t">类型:{{item.type}}</view>
							<view class="test-item-b">{{item.text}}</view>
						</view>
					</view>
				</view>
			</view>
		</view>
	</view>
<!-- 	<view class="footer-tab footer-tab-widthicon">
		<view class="footer-tab-item {{showfootertab==0?'active':''}}" data-index="0" bindtap="showTab">
			<image src="../../images/{{showfootertab==0?'xinxifill':'xinxi'}}.png" mode="aspectFit"></image>
			<text>问题反馈</text>
		</view>
		<view class="footer-tab-item {{showfootertab==1?'active':''}}" data-index="1" bindtap="showTab">
			<image src="../../images/{{showfootertab==1?'wenhaofill':'wenhao'}}.png" mode="aspectFit"></image>
			<text>常见问题</text>
		</view>
	</view> -->
</view>

js代码如下:

Page({
data: {
showtab:0, //顶部选项卡索引
showtabtype:”, //选中类型
tabnav:{}, //顶部选项卡数据
testdataall:[], //所有数据
testdata1:[], //数据列表
testdata2:[], //数据列表
testdata3:[], //数据列表
testdata4:[], //数据列表
testdata5:[], //数据列表
startx:0, //开始的位置x
endx:0, //结束的位置x
critical: 100, //触发切换标签的临界值
marginleft:0, //滑动距离
},
onLoad: function () {
this.setData({
tabnav:{
tabnum:5,
tabitem:[
{
“id”:1,
“type”:”A”,
“text”:”tab1″
},
{
“id”:2,
“type”:”B”,
“text”:”tab2″
},
{
“id”:3,
“type”:”C”,
“text”:”tab3″
},
{
“id”:4,
“type”:”D”,
“text”:”tab4″
},
{
“id”:5,
“type”:”E”,
“text”:”tab5″
},
]
},
})
this.fetchTabData(0);
},
fetchData:function(t){ //生成数据
const newquestions = [];
for (let i = 0; i < 20; i++) { newquestions.push({ “id”:i+1, “type”: t, “text”:”服务名称适用品类服务实施详情服务期限服务生效时间摔碰管修一年笔记本本服务有效期内,如客户的数码摄照产品在正常使用过程中由于不慎将产品坠落、挤压、碰撞,而产生的硬件故障,本服务将免费提供硬件维修或更换,使产品重新恢复正常运行。12个月购机满30天后开始生效摔碰管修两年笔记本、数码相机、摄像机、手机、小数码” }) } return newquestions }, fetchTabData:function(i){ console.log(Number(i)); switch(Number(i)) { case 0: this.setData({ testdata1: this.fetchData(‘A’) }) break; case 1: this.setData({ testdata2: this.fetchData(‘B’) }) break; case 2: this.setData({ testdata3: this.fetchData(‘C’) }) break; case 3: this.setData({ testdata4: this.fetchData(‘D’) }) break; case 4: this.setData({ testdata5: this.fetchData(‘E’) }) break; default: return; } }, setTab:function(e){ //设置选项卡选中索引 const edata = e.currentTarget.dataset; this.setData({ showtab: Number(edata.tabindex), showtabtype: edata.type }) this.fetchTabData(edata.tabindex); }, scrollTouchstart:function(e){ let px = e.touches[0].pageX; this.setData({ startx: px }) }, scrollTouchmove:function(e){ let px = e.touches[0].pageX; let d = this.data; this.setData({ endx: px, }) if(px-d.startx-d.critical){
this.setData({
marginleft: px – d.startx
})
}
},
scrollTouchend:function(e){
let d = this.data;
if(d.endx-d.startx >d.critical && d.showtab>0){
this.setData({
showtab: d.showtab-1,
})
// this.fetchTabData(d.showtab-1);
}else if(d.endx-d.startx <-d.critical && d.showtab<this.data.tabnav.tabnum-1){
this.setData({
showtab: d.showtab+1,
})
}
this.fetchTabData(d.showtab);
this.setData({
startx:0,
endx:0,
marginleft:0
})
},
})

下载地址:工程代码

作者 east
私域流量 5月 22,2021

私域流量干货:微信如何加群发展百万用户

如果你在百度上面搜索“微信群”,会看到大量的各类微信群的平台,这些平台大多数是不靠谱的,平台上的微信群也基本上是微商群或者是推广项目发布的群。那怎么样能够在最短的时间内加入更多有效精准的用户群呢?我们经过十几个月的测试,总结出来7种方法,使用这套方法,1个月内就可以让你找到上百个精准流量群。

1、区域自媒体

一般区域自媒体都会有自己的“粉丝”交流群,而且还不止一个群,我们可以在不同的区域自媒体上面查找“粉丝”群的入口,用不同的微信号加入不同的“粉丝”微信群组中。一个城市的自媒体公众号不少于100个,每个平台最少有一个粉丝微信群,这些都是巨大的流量载体。除了区域自媒体本身的群以外,在自媒体上投放广告的品牌方,也会留下微信群的入口,只要你进行添加,都会邀请你加入微信群。

2、物业小区

物业小区的微信群具有一定的密闭性,同时群内的用户属性和黏性也一样会更高,在获取物业小区群时,我们可以通过线下张贴小区交流群的二维码来获取基础“粉丝”,再通过群内的基础流量引导好友邀请其他小区业主加入。比如建小区业主交流群、小区业主维权群、小区业主互助群等,激发业主共同的兴趣。

3、门店粉丝群

很多门店,尤其是餐饮门店,都会有自己用于“粉丝”维护的微信群,微信群或者微信个人号一般会张贴在餐桌或者摆放在吧台。当然,通过门店地推走访的形式也可以获取到大量商家“粉丝”微信群的入口。

4、豆瓣

豆瓣的交流圈子是分小组的,如果你要推广新媒体运营的知识付费课程,可以在豆瓣上面搜索关键词,加入小组。因为比较活跃的小组都会建立自己的微信群圈子,所以再搜索“微信群”可以将用户发布的微信群检索到,从而申请进群。如果微信群的二维码过期了,也可以给群主留言进群。

5、简书

在简书平台上进群有两种形式,一种形式是在简书中搜索微信群,根据搜索出来的微信群结果申请入群。另一种形式就是自己建群,比如在新媒体相关的文章下部评论:大家好,我建了一个简书作者交流群,欢迎添加我的微信,邀请你进群。对简书写作感兴趣的作者就会主动添加你的微信,申请进群。

6、知识付费平台

我有一个朋友,他的商业模式就是不断加入知识付费群,进群后与群友混个脸熟,再将群友加到自己的微信个人号中,通过分销各类知识付费课程来实现变现,现在自己拥有5个微信个人号,每个月分销课程收入在5万元以上。通过知识付费平台找到的微信群的用户质量相对较高,因为大家都是对这个知识付费课程认可并且付费的人。我们可以通过喜马拉雅、荔枝微课、千聊等线上知识付费平台来筛选知识付费价格在200元以内的,并且有课程交流微信群的课程。如果课程费用是199元,微信群学员有400个,相当于你只用了0.5元就获得了一个精准的流量客户。

7、线下活动

线下活动或者线下课程是最容易产生连接和信任关系的地方,我们可以通过在互动吧、活动行等活动发布平台上寻找与你的产品或者品牌相关的活动报名参加,在现场加入活动微信群。找群是一个长期积累的过程,不是一蹴而就的,在这个过程中我们要留意每一个可以加群的机会,始终坚持一个原则:进更多群、拥有更多的流量。

作者 east
工具类 5月 21,2021

查汉字读音微信小程序源代码

在现实生活中,读错别人姓名是件尴尬的事。通过查汉字读音微信小程序,可以方便知道字的读音。


<view class="container">
  <view class="info-container">
    <text class="pinyin-text">{{pinyinText}}</text>
    <input focus="{{true}}" maxlength="1" bindinput="onInput" placeholder="" />
    <text class="tip">输入汉字</text>
  </view>
</view>
// index.js
var app = getApp()
var pinyin = require('../../utils/pinyin.js');
Page({
  data: {
    pinyinText: '',
  },
  onLoad: function () {

  },
  // 事件处理函数
  onInput: function(e) {
    console.log(e)
    var char = e.detail.value;
    console.log('--', char);
    char = char && char.trim();
    if (char.length == 1) {
      if (pinyin.hasOwnProperty(char)) {
        console.log(pinyin[char].join(', '))
        this.setData({
          pinyinText: pinyin[char].join(', ')
        });
      }
      else {
        this.setData({
          pinyinText: '找不到,^_^'
        });
      }
    }
    else {
      this.setData({
        pinyinText: ''
      });
    }
  },

})

下载地址:工程代码

作者 east
电商类 5月 19,2021

仿拼多多拼团倒计时微信小程序源码

拼多多起家一个原因,是利用微信海量流量,用拼团使用户自发拉新用户。本小程序有这个特色功能,还有首页、商家、进货单、兑换、我的等功能。

//home.js
//获取应用实例
// var ajax = require('../../utils/ajax.js')
// var CountDown = require('../../utils/countdown.js');

var app = getApp()
Page({
  data: {
    scrollTop:0,
    height:"1000px",
    /*轮播图*/
    swiper:{
      height:"420rpx",
      imgUrls: [],
      changeHandler:function(e){
        console.log(e.detail.current)
      },
      indicatorDots: false,
      autoplay: false,
      interval: 0,
      duration: 0
    },
    /*类目列表*/
    sortRows:[
      [
        {
          image:"./images/wx.png",
          title:"文胸",
          url:"./"
        },
        {
          image:"./images/nk.png",
          title:"内裤",
          url:"./"
        },
        {
          image:"./images/jjf.png",
          title:"家居服",
          url:"./"
        },
        {
          image:"./images/ssy.png",
          title:"塑身衣",
          url:"./"
        },
        {
          image:"./images/wp.png",
          title:"袜品",
          url:"./"
        }
      ],[
        {
          image:"./images/bnny.png",
          title:"保暖内衣",
          url:"./"
        },
        {
          image:"./images/cgny.png",
          title:"常规内衣",
          url:"./"
        },
        {
          image:"./images/ddk.png",
          title:"打底裤",
          url:"./"
        },
        {
          image:"./images/ssdp.png",
          title:"时尚单品",
          url:"./"
        },
        {
          image:"./images/more.png",
          title:"更多",
          url:"./"
        }
      ]
    ],
    /*拼团*/
    groups:[
      {
        teamBuyingDesc:"秋衣扎在秋裤里秋裤扎在袜子里这是对冬天最起码的尊重,但是首先你要有秋衣和秋裤。壹级采本期为您推荐37度恒温发热衣,秋衣秋裤纯棉系列,秋衣秋裤莫代尔系列,一定要看哦!",
        teamBuyingId:28,
        teamBuyingImg:"http://img-service.yijicai.cn/modTeamBuying/ab041947-54ed-4251-a4a4-635c89fdaeb6.png",
        teamBuyingTitle:"【天天拼货团-秋衣秋裤专场】",
        time:6000
      }
    ]

  },
  onLoad: function (opts) {
   console.log("onload");
   console.log(opts);
   console.log("onload");
   this.loadData();
  },
  onUnload: function (opts) {
   console.log("onUnload");
   
  },
  onReady:function(){
  },
  onShow:function(opts){
    console.log("onshow");
   console.log(opts);
   console.log("onshow");
  },
  //加载页面数据
  loadData:function(){
    var vm = this;
    // 加载轮播和拼团
    wx.request({
      url: 'https://safe.yijicai.cn/wap/data/get?action=tbIndex', //仅为示例,并非真实的接口地址
      header: {
          'content-type': 'application/json'
      },
      success: function(res) {
        var data = res.data;
        var result = data.result;
        var teamBuying = result.teamBuying;
        teamBuying = [
          {
            teamBuyingImg: "http://img-service.yijicai.cn/addTeamBuying/5096903f-c0b6-4f98-8917-26fc46c65544.png",
            teamBuyingId: 30,
            time: -26000,
            teamBuyingTitle: "【天天拼货团-厂家内裤专场】",
            teamBuyingDesc: "秋天纯棉内裤专场会。"
          },
          {
            teamBuyingImg: "http://img-service.yijicai.cn/addTeamBuying/69bba867-fdd4-405d-80e8-e93db36e27e2.png",
            teamBuyingId: 29,
            time: 27000,
            teamBuyingTitle: "【天天拼货团-打底保暖专场】",
            teamBuyingDesc: "降温了!客户说必须到“壹级采”采购保暖衣、打底裤回来卖!壹级采搜罗了爆款跑量的加绒保暖衣,百搭内搭外穿打底裤,保证品质,绝对低价!"
          },
          {
            teamBuyingImg: "http://img-service.yijicai.cn/modTeamBuying/ab041947-54ed-4251-a4a4-635c89fdaeb6.png",
            teamBuyingId: 28,
            time: 28000,
            teamBuyingTitle: "【天天拼货团-秋衣秋裤专场】",
            teamBuyingDesc: "秋衣扎在秋裤里秋裤扎在袜子里这是对冬天最起码的尊重,但是首先你要有秋衣和秋裤。壹级采本期为您推荐37度恒温发热衣,秋衣秋裤纯棉系列,秋衣秋裤莫代尔系列,一定要看哦!"
          },
          {
            teamBuyingImg: "http://img-service.yijicai.cn/addTeamBuying/2629d616-2029-4fa9-9ef5-748c3f0acb44.png",
            teamBuyingId: 27,
            time: 29000,
            teamBuyingTitle: "【天天拼货团-可爱袖套专场】",
            teamBuyingDesc: "冬季,各式各样的温暖大衣将会成为唯一热卖的单品... 一个实用的单品横空出世,不仅解决了保暖问题,同时也成为冬季时尚不可或缺的搭配,那就是袖套.壹级采为您推荐卡哇依16年新款袖套!"
          },
          {
            teamBuyingImg: "http://img-service.yijicai.cn/addTeamBuying/4a6913f7-07e5-4055-a14b-c70c12c5ae39.png",
            teamBuyingId: 25,
            time: 30000,
            teamBuyingTitle: "【天天拼货团-冬季棉拖专场(50双发货)】",
            teamBuyingDesc: "万佳鑫热销爆款棉拖又来了!本期壹级采为您推荐万佳鑫包跟拖鞋,更暖,更舒适,一定要关注哟!"
          }
        ];
        
        vm.setData({
          groups:teamBuying,
          'swiper.imgUrls':result.ads.map(function(item,index){
            return item.adsImg
          })
        });



        var timeArr =  teamBuying.map(function(item,index){
          return {
            time: item.time,
            index: index
          };
        });
        // new CountDown.CountDown({
        //   timeArr:timeArr,
        //   fn:function(){

        //   }
        // })

        function countDown(){
          var item;
          var update = {};
          for(var i=0;i<timeArr.length;i++){
            item = timeArr[i];
            item.time -= 100;
            // debugger;
            update["groups["+item.index+"].time"] = item.time;
            update["groups["+item.index+"].timeObj"] = timeConverter(item.time);
            if( item.time <= 0){
              timeArr.splice(i--,1);
            }
          }
          console.log("countdown.......");
          vm.setData(update);
          if(timeArr.length){
              setTimeout(countDown,100);
          }
        }
        countDown();
        function timeConverter(time){
          time=parseInt(time);
          // 分秒(毫秒)
          var minSec=parseInt( (time % 1000) / 100 );
          var sec= parseInt( time % 60000 / 1000 );
          sec=sec>=10?sec+"":"0"+sec;
          var min=parseInt( time % 3600000 / 60000 );
          min=min>=10?min+"":"0"+min;
          var hour=parseInt( time / 3600000 );
          hour=hour>=10?hour+"":"0"+hour;
          return {
            minSec:minSec,
            sec:sec,
            min:min,
            hour:hour
          }
        }
      }
   });

   //加载推荐商品
   wx.request({
    url: 'test.php', //仅为示例,并非真实的接口地址
    data: {
      x: '' ,
      y: ''
    },
    header: {
        'content-type': 'application/json'
    },
    success: function(res) {
      console.log(res.data)
    }
  });


  },
  //搜索框点击
  searchtap:function(event){
    // console.log(event.currentTarget.dataset);
    // wx.navigateTo({
    //   url: '../productDetail/productDetail'
    // });
    // console.log(11111);
  },
  //拼团
  grouptap:function(event){
    var id=event.currentTarget.dataset.id;
    console.log(id);
    // wx.navigateTo({
    //   url: '../?id='+id
    // });
  },
  //页面竖向滚动(触发频率太低了)
  scrollY:function(event){
    var that=this;
    var scrollTop=event.detail.scrollTop;
    that.setData({
        scrollTop:scrollTop
    });
    console.log(scrollTop);
  },
  /*跳转页面 */
  pageTo:function(page){
    wx.navigateTo({
      url: page,
      success: function(res){
        // success
      },
      fail: function() {
        // fail
      },
      complete: function() {
        // complete
      }
    })
  }

})

下载地址:工程代码

作者 east

上一 1 … 56 57 58 … 93 下一个

关注公众号“大模型全栈程序员”回复“小程序”获取1000个小程序打包源码。回复”chatgpt”获取免注册可用chatgpt。回复“大数据”获取多本大数据电子书

标签

AIGC AI创作 bert chatgpt github GPT-3 gpt3 GTP-3 hive mysql O2O tensorflow UI控件 不含后台 交流 共享经济 出行 图像 地图定位 外卖 多媒体 娱乐 小程序 布局 带后台完整项目 开源项目 搜索 支付 效率 教育 日历 机器学习 深度学习 物流 用户系统 电商 画图 画布(canvas) 社交 签到 联网 读书 资讯 阅读 预订

官方QQ群

小程序开发群:74052405

大数据开发群: 952493060

近期文章

  • 如何在Chrome中设置启动时自动打开多个默认网页
  • spark内存溢出怎样区分是软件还是代码原因
  • MQTT完全解析和实践
  • 解决运行Selenium报错:self.driver = webdriver.Chrome(service=service) TypeError: __init__() got an unexpected keyword argument ‘service’
  • python 3.6使用mysql-connector-python报错:SyntaxError: future feature annotations is not defined
  • 详解Python当中的pip常用命令
  • AUTOSAR如何在多个供应商交付的配置中避免ARXML不兼容?
  • C++thread pool(线程池)设计应关注哪些扩展性问题?
  • 各类MCAL(Microcontroller Abstraction Layer)如何与AUTOSAR工具链解耦?
  • 如何设计AUTOSAR中的“域控制器”以支持未来扩展?

文章归档

  • 2025年8月
  • 2025年7月
  • 2025年6月
  • 2025年5月
  • 2025年4月
  • 2025年3月
  • 2025年2月
  • 2025年1月
  • 2024年12月
  • 2024年11月
  • 2024年10月
  • 2024年9月
  • 2024年8月
  • 2024年7月
  • 2024年6月
  • 2024年5月
  • 2024年4月
  • 2024年3月
  • 2023年11月
  • 2023年10月
  • 2023年9月
  • 2023年8月
  • 2023年7月
  • 2023年6月
  • 2023年5月
  • 2023年4月
  • 2023年3月
  • 2023年1月
  • 2022年11月
  • 2022年10月
  • 2022年9月
  • 2022年8月
  • 2022年7月
  • 2022年6月
  • 2022年5月
  • 2022年4月
  • 2022年3月
  • 2022年2月
  • 2022年1月
  • 2021年12月
  • 2021年11月
  • 2021年9月
  • 2021年8月
  • 2021年7月
  • 2021年6月
  • 2021年5月
  • 2021年4月
  • 2021年3月
  • 2021年2月
  • 2021年1月
  • 2020年12月
  • 2020年11月
  • 2020年10月
  • 2020年9月
  • 2020年8月
  • 2020年7月
  • 2020年6月
  • 2020年5月
  • 2020年4月
  • 2020年3月
  • 2020年2月
  • 2020年1月
  • 2019年7月
  • 2019年6月
  • 2019年5月
  • 2019年4月
  • 2019年3月
  • 2019年2月
  • 2019年1月
  • 2018年12月
  • 2018年7月
  • 2018年6月

分类目录

  • Android (73)
  • bug清单 (79)
  • C++ (34)
  • Fuchsia (15)
  • php (4)
  • python (45)
  • sklearn (1)
  • 云计算 (20)
  • 人工智能 (61)
    • chatgpt (21)
      • 提示词 (6)
    • Keras (1)
    • Tensorflow (3)
    • 大模型 (1)
    • 智能体 (4)
    • 深度学习 (14)
  • 储能 (44)
  • 前端 (5)
  • 大数据开发 (493)
    • CDH (6)
    • datax (4)
    • doris (31)
    • Elasticsearch (15)
    • Flink (79)
    • flume (7)
    • Hadoop (19)
    • Hbase (23)
    • Hive (41)
    • Impala (2)
    • Java (71)
    • Kafka (10)
    • neo4j (5)
    • shardingsphere (6)
    • solr (5)
    • Spark (100)
    • spring (11)
    • 数据仓库 (9)
    • 数据挖掘 (7)
    • 海豚调度器 (10)
    • 运维 (35)
      • Docker (3)
  • 小游戏代码 (1)
  • 小程序代码 (139)
    • O2O (16)
    • UI控件 (5)
    • 互联网类 (23)
    • 企业类 (6)
    • 地图定位 (9)
    • 多媒体 (6)
    • 工具类 (25)
    • 电商类 (22)
    • 社交 (7)
    • 行业软件 (7)
    • 资讯读书 (11)
  • 嵌入式 (71)
    • autosar (63)
    • RTOS (1)
    • 总线 (1)
  • 开发博客 (16)
    • Harmony (9)
  • 技术架构 (6)
  • 数据库 (32)
    • mongodb (1)
    • mysql (13)
    • pgsql (2)
    • redis (1)
    • tdengine (4)
  • 未分类 (7)
  • 程序员网赚 (20)
    • 广告联盟 (3)
    • 私域流量 (5)
    • 自媒体 (5)
  • 量化投资 (4)
  • 面试 (14)

功能

  • 登录
  • 文章RSS
  • 评论RSS
  • WordPress.org

All Rights Reserved by Gitweixin.本站收集网友上传代码, 如有侵犯版权,请发邮件联系yiyuyos@gmail.com删除.