如何在 Creator3D 中切换模型贴图,超级简单

1效果预览

640?wx_fmt=gif

前两天有伙伴在 QQ 上询问,如何在 Creator 3D 中切换模型贴图。Shawn 之前也没尝试过,不过根据之前 Cocos Creator 的经验以及这几天对 Creator 3D 的学习,简单尝试了一下,方法可行,在此将它分享给大家。2模型材质资源在 Creator 3D 中,一个 3D 物体主要由 ModelComponent 组件渲染,其中包含两大部分: Mesh 和 Material,而模型的纹理就在材质属性上进行控制。在 Creator3D 编辑中,我们可通过图形化拖动的方式修改材质贴图,如下图:

640?wx_fmt=png

上图中,先使用引擎内置的无光照的 Effect,它的选项看起来没那么多,可以减少畏惧感,我们将一 ground 的图片拖动到 test.mtl 材质资源上。然后将 test 材质拖动到 Cube 物体的 ModelComponent 组件上:

640?wx_fmt=jpeg

设置好后你就可以看到 Cube 上的像石头一样的材质表现了。3使用脚本修改材质纹理我这里创建了一个 test.ts 的脚本文件,用于修改材质上的纹理资源,先看下组件属性:

640?wx_fmt=png

注意 3D 物体上的贴图不是Cocos Creator中的 SpriteFrame,而是 Texture2D 类型,下面是 Texture1、Texture2属性定义:

@ccclass("test")export class test extends Component {     @property({type: Texture2D })    texture1: Texture2D = null;     @property(Texture2D)    texture2: Texture2D = null; }

复杂数据类型需要给 @property 输入一个 type 参数,同时下面一行,需要给变量设置为null,不然在属性面板上不显示。纹理资源已经设置好了,如何通过代码访问或修改材质呢?经过Shawn的一阵摸索,发现还是非常简单的,使用材质对像的getProperty、setProperty就可以搞定:

swithcTextue() {    //获取ModelComponent组件    let modelComponent = this.getComponent(ModelComponent);    //获取0号材质    let material = modelComponent.materials[0];    //获取纹理    let texture = material.getProperty('mainTexture');    //设置纹理    material.setProperty('mainTexture', texture === this.texture1 ? this.texture2 : this.texture1);}

material.setProperty的参数是Key和Value,分别对应材质面板上的Key与纹理对象,看下图:

640?wx_fmt=png

用material.setProperty也是同理,如果你是使用的标准Effect,也是用同样的方法:

640?wx_fmt=jpeg

只需要将材质属性中的属性名,首字母小写就可以了!3小结本篇介绍了使用 material.setProperty API 修改材质纹理。最后我们思考一个问题,如果有两个 3D 物理,使用了同一个材质资源,在编辑器中修改材质贴图你会发现两个物理都会同时发生变化,看下图:

640?wx_fmt=gif

如果我们是用代码,在运行时修改了任意一个 3D 物体上的材质属性,另一个 3D 物体的材质会变吗?Shawn做了一下测试,但并没有变,看下面的效果:

640?wx_fmt=gif

之前 Shawn 在想,如果运行时也会变的话,比如生成一桌子的麻将牌,岂不是要为每一纹理创建一个材质资源,现在好像担心多了!

https://blog.csdn.net/6346289/article/details/102752180

【iOS】苹果IAP(内购)中沙盒账号使用注意事项

目标

  • 沙盒账号的正确使用方式
  • 沙盒账号使用的注意事项

1.沙盒账号是什么

iOS应用里面用到了苹果应用内付费(IAP)功能,在项目上线前一定要进行功能测试。测试肯定是需要的,何况这个跟money有关。。。开发完成了之后,如何进行测试呢?难道我测试个内购功能要自己掏钱?就算是公司掏钱,但是苹果要吃掉3成的啊,想想如果是99刀的商品,点下购买的时候心里都有点发慌。。。
苹果当然没这么坑了,测试内购,苹果提供了沙盒账号(也叫沙箱账号)的方式。这个沙箱账号其实是虚拟的AppleID,在开发者账号后台的iTune Connect上配置了之后就能使用沙盒账号测试内购,有了沙盒账号,就能体验一把土豪的感觉了,游戏钻石什么的随便充,反正不用我的钱。

注意:你可以把沙盒账号看做是一个虚拟的AppleID,这个AppleID只有进行内购测试的功能。

2.沙盒账号使用的前提

  • bundleID别搞错了,开发者账号、证书、bundleID要一致
  • 内购的商品ID,价格等相关信息已经录入到开发者后台了(不然那你买什么)
  • 开发者后台已经创建好沙盒测试账号了(下面我们会讲如何创建)
  • 你要有一部真机(iPhone或iPad都行,别用模拟器就好。而且不能是越狱机)
  • 如果你是第一次在这个开发者账号上集成内购功能,请先将iTune Connect上的税务协议都填写好,否则内购时会发现商品ID无效。

税务协议的问题不少童鞋遇到了,可以参考这篇文章http://www.jianshu.com/u/62f0c72a2004

3.沙盒账号创建

登录苹果开发者后台–iTunes Connect–用户和职能–沙箱测试技术员,在这个界面你可以看到当前账号已经创建好的沙盒账号。

沙箱测试技术员管理界面

点击“+”进行创建

创建沙盒账号

新创建的沙盒账号

如图,我创建一个沙盒账号。具体信息:

  • 名字为test1
  • AppleID为jianshutest1@123.com(也就是上面填的电子邮件)
  • App Store地区为中国

注意:

  • 电子邮件不能是别人已经注册过AppleID的邮箱
  • 电子邮箱可以是一个不存在电子邮箱(只要符合格式,随便写)
  • App Store 地区不要乱选。虽然随便哪个地区都可以用来测试(还没上线之前app并没有地区之分),但是在沙盒测试的时候,弹出的购买提示框会根据当前AppleID(沙盒账号)的地区显示语言的。

4.沙盒账号使用流程

  • 1.在iPhone上安装测试包(必须是adhoc签名证书或者develop签名证书打的包,不能是从App Store上下载的)
  • 2.退出iPhone的App Store账号(因为我们需要使用沙盒账号登录)。
    • 操作方法一:打开App Store应用首页滑到最下方–选中AppleID–注销
    • 操作方法二:设置–iTunes Store与App Store–选中AppleID–注销

这里只需要退出账号,退出之后,不需要在这里登录沙盒账号,因为你压根就登录不了。之前已经说过了,沙盒账号是一个假的AppleID账号,不能直接登录的。如果强行登陆,会出现以下报错提示:

使用沙盒账号直接登录报错提示

  • 3.在测试包里面购买商品,系统会让你进行登录,这里我们点击“使用现有的AppleID”就可以输入刚才创建好的沙盒测试账号进行登录了。

点击购买商品后出现登录窗口

输入沙盒账号密码进行登录

  • 4.输入账号之后,有可能会出现如下提示,点击确定之后会跳转到App Store,导致这次购买失败。没关系,我们再次回到测试包,然后购买商品就好

跳转到App Store跳转店面的提示

出现提示的原因:因为AppleID是分地区的。之前我们创建沙盒账号的时候就看到了,需要选择地区。App Store也是分地区的,对应的AppleID只能在App Store对应的地区进行下载和购买东西。我们刚才创建的jianshutest1@123.com这个账号的地区是中国,所以只能在中国店面登录。由于我之前的登录的账号越南的,所以此时AppStore店面是越南店面。所以我们这次登录,系统会跳转到AppStore应用将店面切换到中国。另外,App Store应用切换地区的时候,会报【Your request produced an error】。这个不需要管。

  • 5.点击购买商品之后,成功的话会出现相应提示。

商品内容和价格展示窗口

备注:我们在iTunes Connect上创建商品了之后,除了需要填商品ID,商品名称,商品描述,价格等之外,还要上传一张图片,图片就是上面这个界面。

购买成功提示

沙盒账号注意事项

  • BudleID,证书,商品ID等内容一致,才能进行接下来的储值测试(BundleID都不对,还玩什么)
  • 测试设备需要使用不越狱的真机(越狱机不能进行沙盒储值,模拟器也不能进行沙盒储值)
  • 沙盒账号是不能直接在App Store进行登录的,只能在点击了购买商品之后,在弹出的登录框进行登录。
  • 真实的AppleID不能在adhoc证书和develop证书打出来的包进行沙盒储值测试,所以在沙盒测试之前,需要退出真实的AppleID账号
  • 从App Store上面下载的包不能使用沙盒账号进行储值

关于证书的问题:
1.使用develop签名证书和adhoc签名证书打的ipa包,我把他们叫做测试包,测试包只能使用沙盒账号进行储值,不能使用真实的AppleID进行储值
2.从App Store应用下载的包,我把他们叫做线上包,线上包只能使用真实的AppleID进行储值,不能使用沙盒账号进行储值

另外唠叨一下:
楼主平常上传包的时候是打包了ipa包之后,使用Xcode里面的Application Loader应用上传ipa包的。
虽然很多人上传包使用的是appstore的签名证书,但是,其实使用adhoc的证书打包的ipa包也是可以正常上传并且送审上线的。我平常就是用adhoc的证书打包成ipa包,给测试妹子测试,测试完直接用这个包上传送审了。嘿嘿。
2020.06.28更新:最近苹果App Store Connect改版,不能使用adhoc描述证书的包送审了,真是个悲伤的故事。。

作者:谦言忘语
链接:https://www.jianshu.com/p/1ef61a785508
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

游戏策划的软件与工具

本文修改自前公司的一份交接文档,分享了工作中一些常用的软件。


Axure

界面示意图/流程图制作软件

  • 大前提:Windows系统、无法直连外网
    • Mac系统的话,sketch、principle之类的选择太多了
    • 如果可以直连外网,还有墨刀之类的在线编辑工具可选
  • 可以自定义控件库
  • 一般软件里自带的控件都是基本的web控件或app控件,而游戏里常用的界面元素要远多于这些基础控件,因此提前制作一套适合自己游戏的自定义控件可以在之后的工作中节省不少时间,还能保持统一性。
    自定义控件
  • 可以创建交互效果、并且便于分享
  • 理论上可以制作各种复杂的交互效果、高保真原型,但是从时间投入考虑性价比不高,因此一般我只会创建「点击 – 跳转页面」这一种事件,来简单模拟整个系统的操作流程
  • Axure生成的原型都是HTML网页,系统自带的IE就能打开
  • 作为流程图软件时
    • 如果是界面关系流程图,可以关联已创建的界面,生成HTML网页后,点击流程图可以直接跳到对应的界面,便于讲解流程时的细节展开。
    • 如果是一般操作逻辑流程图,axure并没有明显的优点,但也没太大的缺点,中规中矩

SublimeText

万能编辑器,所有的配置文件都推荐用这个软件编辑(xls之类二进制文件除外)

  • 鼠标中键可以直接多行选择,非常实用!
    中键可以直接多行选择
  • 针对整个目录的全局搜索/替换,速度极快。
  • SublimeText的强大远不止于此,这只是编辑配置文件时最实用的两点 。

XMLSpy

专业的XML编辑软件。

  • 用这个软件主要就为了一点:
  • 在网格模式下,可以直接把Excel里计算好的成百上千行数据粘贴过去,大大提升效率

可以直接粘贴Excel数据

  • 当然这个软件也有很大的缺点:运行慢、占内存。所以要配合SublimeText来使用,XMLSpy主要是用来粘贴大量数据时用的,轻量的编辑还是采用SublimeText更高效。
  • 不要再用用UltraEdit、Notepad++ 甚至记事本来编辑XML了!

MindManger

脑图软件

  • 我见过用Excel、Word、Visio来画脑图的(确切的说不是脑图,只是想法收集整理的文档)
  • 然而,还是用专门的脑图软件好一些

Q-Dir

资源管理器窗口布局软件

  • 配置一个系统要涉及好多个目录:设定表、客户端配置、服务端配置、美术资源等等……
  • 这个软件可以在一个窗口中分多栏、同时打开多个目录(最多分四栏)
    窗口分栏布局
  • 还可以保存分栏的布局模式和对应打开的目录,以便之后编辑。
  • 我给那些配置复杂的系统,各保存设置了一套布局摆在桌面上,再也不用改一个系统打开4个资源管理器窗口、一层一层找目录了。

Bulk Rename Utility

批量重命名文件的软件

  • 能用软件解决的事情,我都不想人工操作;
  • 就算不会用正则表达式,光是基础的替换、加前后缀都足以节省很多无意义的手工劳动。
    批量重命名

PNGOUT

png图片无损压缩

  • PS直接存保存的png图片经常比容量较大,用工具压缩一下可以节省很多容量。
  • 这类图片压缩工具有很多,PNGOUT未必是最出色的一个,但胜在操作简单。
  • 我一般会在每个大版本前夜,把所有图标都扔进去压一遍。

png图片压缩

Everything

文件搜索

那么多文档素材,就算目录结构再清晰也难免有找不到某个文件的时候,
而Windows系统自身的搜索实在太慢,用这个软件试一下吧,搜索速度极速提升。

KKCapture

视频录制软件

之前研究其他游戏(页游)的引导流程时,用这个录了几十个游戏的视频,
不过后来做手游后感觉最好是能用Mac的QuickTime直接录屏——60fps高清无码。

BeyondCompare

文件对比软件

  • 我们一定会遇到需要比对一个文件的不同版本、检查配置错误的时候。
  • 这个软件,绝对比SVN、CVS自带比对功能好用。
  • 还有一个连Git都没有的最大优点——可以对比Excel文件,绝对神器!
    可以对比Excel文件

Sothink SWF Decompiler

SWF反编译软件

  • 以前做页游项目时,总觉得我们美术做的动画素材容量太大,因此用这个软件去破解了其他游戏的素材,寻找动画制作、压缩方面的技巧,还算有点帮助。
  • 不过现在flash都快被淘汰了,以后可能用不到了。

FontCreatorSetup

字体编辑软件

  • 美术选用了一个字体专门用于等级、数值等,因此只需要用到英文字母、数字和少量标-点。
  • 由于这是一个中文字体,ttf文件有10MB多。
  • 这个软件可以编辑字体文件的字库,删除不需要的文字,达到压缩字体文件的目的。
  • 最终处理过后的字体文件从10MB压到了几十KB。

字体编辑

格式工厂

视频音频格式转换软件

  • 宣传视频的原始输出太大,需要转个格式压缩一下……
  • Cocos引擎下音频都需要转成MP3格式……
  • 一个团队里总要有人做这些事情。

虽然格式工厂的转换速度不快、有时还会出错,只是胜在使用起来简单粗暴,如需更专业一些转码工具可用MediaCoder、AudioCoder这类。

GoldWave

音频编辑软件

  • 网上扒来的背景音乐音量不一致,用这个调整一下音量
    • 这个要特殊申明一下,我们游戏正式上线之前音乐音效都会外包。只是测试体验期间需要先有素材来代替,同时还能充当外包需求的「效果图」
  • 再加一下渐入渐出,让音乐的出现不会很突兀
  • 这种级别的音频编辑并不需要什么专业的音乐素养,都是简单的软件操作,以淡入淡出为例:
    • 选择一段音频 – 点淡入按钮 – 选个预设的淡入模式 – 确定

音频编辑

Chrome

浏览器

  • 主要目的是为了文章题图的矩阵布局,增加一个图标凑数用。
  • 例行黑百度,我也不算小白用户了,安装软件时都会自己检查各种不起眼的勾选项,但Chrome首页居然一度被篡改成了百度系的hao123,真是防不胜防。FuckBaidu!
  • 页游的一些资源加载问题可以通过在F12的调试窗口里初步检查,判断问题属于程序还是运维部门。
  • 当然我也确实见过一些新人依然是用IE的,还是要介绍一下世界上存在Chrome这么个浏览器。

其他

Adobe大家族、Office大家族

  • Adobe系列,当你想点美术系天赋时,自然会用到其中一些。
    不过说实话,对于策划来说,那些基本的功能,尤其是简单的批量操作,美图秀秀确实会比PS的脚本更方便。
    不考虑逼格问题的话,还是可以考虑装一个美图秀秀(我装了,没截在图里而已)。
  • Office系列就不介绍了,只可能不熟练,不可能不知道。
    只提醒一点:多研究一下Excel的函数公式,能用公式填表就不要手填

最后

  • 有些新人总是会认为:这个不是应该美术做?那个不是应该程序做?
  • 我的观点是:作为什么都不会的策划,只有什么都会才能活下去。

作者:UXplayer
链接:https://www.jianshu.com/p/ceddde705933
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

HTML5新增内容精华总结

001: HTML5和HTML4究竟有哪些不同?

#声明方面

  1. HTML5 文件类型声明(<!DOCTYPE>)变成下面的形式:

<!DOCTYPE html>

#标准方面

  1. HTML5的文档解析不再基于SGML(Standard Generalized Markup Language)标准,而是形成了自己的一套标准。

#标签方面

  1. 新增语义标签,其中包括

<header>、<footer>、<section>、<article>、<nav>、<hgroup>、<aside>、<figure>

  1. 废除一些网页美化方面的标签,使样式与结构分离更加彻底, 包括

<big>、<u>、<font>、<basefont>、<center>、<s>、<tt>

  1. 通过增加了<audio>、<video>两个标签来实现对多媒体中的音频、视频使用的支持。

#属性方面

  1. 增加了一些表单属性, 主要是其中的input属性的增强

<!– 此类型要求输入格式正确的email地址 –><input type=email >

<!– 要求输入格式正确的URL地址 –><input type=url >

<!– 要求输入格式数字,默认会有上下两个按钮 –><input type=number >

<!– 时间系列,但目前只有 Opera和Chrome支持 –><input type=date ><input type=time >

<input type=datetime ><input type=datetime-local >

<input type=month ><input type=week >

<!– 默认占位文字 –><input type=text placeholder=”your message” >

<!– 默认聚焦属性 –><input type=text autofacus=”true” >

  1. 其他标签新增了一些属性,

<!– meta标签增加charset属性 –>

<meta charset=”utf-8″>

<!– script标签增加async属性 –>

<script async></script>

  1. 使部分属性名默认具有boolean属性

<!– 只写属性名默认为true –><input type=”checkbox” checked/>

<!– 属性名=”属性名”也为true –><input type=”checkbox” checked=”checked”/>

#存储方面

  1. 新增WebStorage, 包括localStorage和sessionStorage
  2. 引入了IndexedDB和Web SQL,允许在浏览器端创建数据库表并存储数据, 两者的区别在于IndexedDB更像是一个NoSQL数据库,而WebSQL更像是关系型数据库。W3C已经不再支持WebSQL。
  3. 引入了应用程序缓存器(application cache),可对web进行缓存,在没有网络的情况下使用,通过创建cache manifest文件,创建应用缓存,为PWA(Progressive Web App)提供了底层的技术支持。

总结

对于HTML5与HTML4的区别,这些基本的概念是要有印象的,也许现在还比较粗略,但后面会一步步追问细节,慢慢深入,达到知其然也其所以然的效果。

002: meta标签属性有哪些?

简介: 常用于定义页面的说明,关键 字,最后修改日期,和其它的元数据。这些元数据将服务于浏览器(如何布局或重载页 面),搜索引擎和其它网络服务。

#charset属性

<!– 定义网页文档的字符集 –><meta charset=”utf-8″ />

#name + content属性

<!– 网页作者 –><meta name=”author” content=”开源技术团队”/>

<!– 网页地址 –><meta name=”website” content=”url”/>

<!– 网页版权信息 –><meta name=”copyright” content=”2018-2019 demo.com“/>

<!– 网页关键字, 用于SEO –><meta name=”keywords” content=”meta,html”/>

<!– 网页描述 –><meta name=”description” content=”网页描述”/>

<!– 搜索引擎索引方式,一般为all,不用深究 –><meta name=”robots” content=”all” />

<!– 移动端常用视口设置 –><meta name=”viewport” content=”width=device-width,initial-scale=1.0,maximum-scale=1.0, user-scalable=no”/>

<!–

viewport参数详解:

width:宽度(数值 / device-width)(默认为980 像素)

height:高度(数值 / device-height)

initial-scale:初始的缩放比例 (范围从>0 到10)

minimum-scale:允许用户缩放到的最小比例

maximum-scale:允许用户缩放到的最大比例

user-scalable:用户是否可以手动缩 (no,yes)

–>

#http-equiv属性

<!– expires指定网页的过期时间。一旦网页过期,必须从服务器上下载。 –>

<meta http-equiv=”expires” content=”Fri, 12 Jan 2020 18:18:18 GMT”/>

<!– 等待一定的时间刷新或跳转到其他url。下面1表示1秒 –>

<meta http-equiv=”refresh” content=”1; url=https://www.baidu.com“/>

<!– 禁止浏览器从本地缓存中读取网页,即浏览器一旦离开网页在无法连接网络的情况下就无法

访问到页面。 –>

<meta http-equiv=”pragma” content=”no-cache”/>

<!– 也是设置cookie的一种方式,并且可以指定过期时间 –>

<meta http-equiv=”set-cookie”

content=”name=value expires=Fri, 12 Jan 2001 18:18:18 GMT,path=/”/>

<!– 使用浏览器版本 –><meta http-equiv=”X-UA-Compatible”

content=”IE=edge,chrome=1″ />

<!– 针对WebApp全屏模式,隐藏状态栏/设置状态栏颜色,

content的值为default | black | black-translucent –>

<meta name=”apple-mobile-web-app-status-bar-style”

content=”black-translucent” />

 

003: src和href的区别是什么?

#定义

href是Hypertext Reference的简写,表示超文本引用,指向网络资源所在位置。

常见场景:

<a href=”http://www.baidu.com“></a>

<link type=”text/css” rel=”stylesheet” href=”common.css”>

src是source的简写,目的是要把文件下载到html页面中去。

常见场景:

<img src=”img/girl.jpg”></img>

<iframe src=”top.html”>

<script src=”show.js”>

#作用结果

  1. href 用于在当前文档和引用资源之间确立联系
  2. src 用于替换当前内容

#浏览器解析方式

  1. 当浏览器遇到href会并行下载资源并且不会停止对当前文档的处理。(同时也是为什么建议使用 link 方式加载 CSS,而不是使用 @import 方式)
  2. 当浏览器解析到src ,会暂停其他资源的下载和处理,直到将该资源加载或执行完毕。(这也是script标签为什么放在底部而不是头部的原因)

 

004: script标签中defer和async的区别是什么?

默认情况下,脚本的下载和执行将会按照文档的先后顺序同步进行。当脚本下载和执行的时候,文档解析就会被阻塞,在脚本下载和执行完成之后文档才能往下继续进行解析。

下面是async和defer两者区别:

  • 当script中有defer属性时,脚本的加载过程和文档加载是异步发生的,等到文档解析完(DOMContentLoaded事件发生)脚本才开始执行。
  • 当script有async属性时,脚本的加载过程和文档加载也是异步发生的。但脚本下载完成后会停止HTML解析,执行脚本,脚本解析完继续HTML解析。
  • 当script同时有async和defer属性时,执行效果和async一致。

HBuilder X应用内展示的广告组件,可用于banner或信息流

开通广告步骤:

  1. 开通广告 需在广告平台后台操作:
  2. 申请广告位id 在各位后台申请广告位id
  3. 在页面合适位置编写代码,放置ad组件,配上广告位id(app是adpid,微信、头条、qq小程序是unit-id,百度小程序是apid)
  4. App端打包后生效,打包时必须选择要集成的广告SDK(穿山甲、广点通、360联盟、快手)。

属性说明

属性名类型默认值说明平台差异
dataObject可选广告数据,通过 plus.ad.getAds (参考示例代码),设置后adpid将无效App
adpidStringuni-AD App广告位id,在uni-AD官网申请广告位App
unit-idString广告单元id,可在小程序管理后台的流量主模块新建微信小程序、字节跳动小程序(最低版本1.19.0+)、QQ小程序
ad-intervalsnumber广告自动刷新的间隔时间,单位为秒,参数值必须大于等于30(该参数不传入时 Banner 广告不会自动刷新)微信小程序(基础库2.3.1+)
appidString小程序应用 ID百度小程序
apidString小程序广告位 ID百度小程序
ad-leftNumbertype为feeds时广告左边距(px),必须大于0QQ小程序
ad-topNumbertype为feeds时广告上边距(px),必须大于0QQ小程序
ad-widthNumbertype为feeds时广告宽度(px),默认100%,最大值为屏幕宽度,最小值为265QQ小程序
ad-heightNumbertype为feeds时广告高度(px),最小85,最大160QQ小程序
typeStringfeedQQ小程序、百度小程序、字节跳动小程序
@loadEventHandle广告加载成功的回调
@errorEventHandle广告加载失败的回调,event.detail = {errCode: }
@closeEventHandle广告关闭的回调

type属性 百度

广告类型:banner/feed,需和百青藤平台上的代码位类型相匹配。

type属性 头条

广告的类型,默认 bannner,具体类型有:banner、video(视频)、large(大图)、lImg(左图右文)、rImg(右图左文),默认值为 banner

type属性 QQ

说明
bannerbanner广告 分 1 图和 3 图 1 文。3 图 1 文广告的背景色、文字颜色会根据祖先节点的背景色调整,分三种情况深色背景、浅色背景和白色背景
swip翻页广告,1 图 1 文,会覆盖整个小程序,显示、隐藏逻辑需开发者自行控制
card卡片广告,1 图,可关闭
feeds自定义广告,可灵活控制广告上、左边距和宽高,以适应界面其他内容。可监听size事件获取实际宽高

App和微信小程序的ad组件没有type属性,可以用于banner,也可以用于信息流。

注意

  • 无广告时没有高度,关闭广告时释放高度,宽度由父容器决定
  • App 平台,因广告组件内部获得广告数据计算后设置组件大小,会出现界面抖动问题,可以提前通过 plus.ad.getAds 获得广告数据,设置 data 后 adpid 将无效
  • 微信小程序 <ad> 组件不支持触发 tap 等触摸相关事件
  • Android 平台 nvue的 <list> 组件中使用 <ad> 时,必须指定宽度属性<ad width="750rpx" />,因为 <list> 有自动的内存回收机制,不在屏幕范围的组件不被创建,组件内部无法获取大小
  • 广点通概率出现重复广告,可根据需求请求广告数据,推荐单次大于1条(plus.ad.getAds) 来降低重复率
  • app-vue 页面使用 <ad> 不支持非 V3 编译,必须使用v3编译器。
  • <recycle-list> 暂不支持 <ad>
  • app-vue|QQ是客户端原生组件,层级最高无法被覆盖,app-nvue|微信|头条没有层级覆盖问题
  • app-vue 无法在 <swiper> 组件中使用<ad>
  • app-vue 不能在 <scroll-view> 组件中使用 <ad>,仅适用于页面级的滚动
  • HBuilderX2.8+版本Android平台更新穿山甲(今日头条)广告SDK后不再支持x86类型CPU,无法运行到x86类型cpu的模拟器。
  • <ad> 组件测试广告位是上图下文,uniAD后台申请的广告位默认左图右文
  • HBuilderX标准基座真机运行测试信息流广告位标识(adpid)为:1111111111

@error 错误码

示例:

<template>
  <view class="content">

    <!-- App平台 示例 1 -->
    <!-- adpid="1111111111" 此广告位标识仅在HBuilderX标准基座中有效,仅用于测试,替换为自己申请获取的广告位标识 -->
    <view class="ad-view">
      <ad adpid="1111111111" @load="onload" @close="onclose" @error="onerror"></ad>
    </view>

    <!-- App平台 示例 2 -->
    <!-- 需要时可自定义属性,监听到 error 回调后(e.target可以取到),开发者可以针对性的处理,比如隐藏广告组件的父容器,以保证用户体验 -->
    <view class="ad-view" v-for="adItem in adList" :key="adItem.id">
      <ad :adpid="adItem.adpid" :data-xx="adItem.id"></ad>
    </view>

    <!-- App平台 示例 3 (手动请求广告数据 仅App平台支持) -->
    <view>
      <button @click="getAdData">Get ad data</button>
    </view>
    <view class="ad-view">
      <ad :data="adData"></ad>
    </view>

    <!-- 微信小程序 -->
    <view class="ad-view">
      <ad unit-id="" ad-intervals="100"></ad>
    </view>

    <!-- 百度小程序 -->
    <view class="ad-view">
      <ad appid="" apid="" type="feed"></ad>
    </view>

    <!-- 多平台兼容 -->
    <view class="ad-view">
      <ad adpid="1111111111" unit-id="" appid="" apid="" type="feed"></ad>
    </view>

  </view>
</template>
export default {
  data() {
    return {
      title: 'uni-app ad',
      adList: [],
      adData: {}
    }
  },
  onReady: function (e) {
    // 显示 4 个广告
    for (let i = 0; i < 4; i++) {
      this.adList.push({
        id: i,
        adpid: "1111111111"
      })
    }
  },
  methods: {
    getAdData: function (e) {
      // 仅APP平台支持
      plus.ad.getAds({
          adpid: '1111111111',  // 替换为自己申请获取的广告位标识,此广告位标识仅在HBuilderX标准基座中有效,仅用于测试
          count: 1,   // 广告数量,默认 3
          width: 300  // 根据宽度获取合适的广告(单位px)
        },
        (res) => {
          this.adData = res.ads[0];
          console.log(this.adData);
        },
        (err) => {
          console.log(err);
        }
      )
    },
    onload(e) {
      console.log("onload");
    },
    onclose(e) {
      console.log("onclose: " + e.detail);
    },
    onerror(e) {
      console.log("onerror: " + e.detail.errCode + " message:: " + e.detail.errMsg);
    }
  }
}
<style>
  .content {
    background-color: #DBDBDB;
    padding: 10px;
  }

  .ad-view {
    background-color: #FFFFFF;
    margin-bottom: 10px;
  }
</style>

Vue 定时执行函数

 
例一、
<script>
        new Vue({
            el: '#app',
            data() {
                return {
                    clock: '',
                }
            },
            mounted() {
                this.$nextTick(() => {
                    setInterval(this.CurentTime, 1000);
                })
            },
            methods: {
                CurentTime() {
                    var getTime = new Date();
                    var year = getTime.getFullYear(); //年
                    var month = getTime.getMonth() + 1; //月
                    var day = getTime.getDate(); //日
                    var hh = getTime.getHours(); //时
                    var mm = getTime.getMinutes(); //分
                    var ss = getTime.getSeconds(); //秒
                    var clock = year + "-";
                    if (month < 10)
                        clock += "0";
                    clock += month + "-";

                    if (day < 10)
                        clock += "0";

                    clock += day + " ";

                    if (hh < 10)
                        clock += "0";

                    clock += hh + ":";

                    if (mm < 10) clock += '0';
                    clock += mm + ":";

                    if (ss < 10) clock += '0';
                    clock += ss;

                    this.clock = clock
                }

            },
        })
    </script>

例二、
 var app = new Vue({         el: '#app',         data: {                      },         filters: {                   },         created: function () {             setInterval(this.timer, 1000);         },         methods: {          timer: function () {                 console.log("time");             }         },         watch: {         },         computed: {         }     }); 

vue实现数组中的项随机显示的两种方法

<!DOCTYPE html> <html lang=”en”> <head> <meta charset=”UTF-8″> <meta name=”viewport” content=”width=device-width, initial-scale=1.0″> <meta http-equiv=”X-UA-Compatible” content=”ie=edge”> <title>vue实现数组中的项随机显示</title> </head> <style> #app { width: 600px; margin: auto; } li { list-style: none; } p { display: inline-block; margin: 0 3px; text-align: center; float: left; } </style> <body> <div id=”app”> <button @click=”handleClick”>数组项随机显示</button> <li v-for=”user in userArr”> <p>{{user.name}}</p> </li> </div> </body> <script src=”./vue.js”></script> <script> const vm = new Vue({ el: “#app”, data: { userArr: [ { id: 0, name: “feifei” }, { id: 1, name: “wanglan” }, { id: 2, name: “xiaya” }, { id: 3, name: “weiwei” }, { id: 4, name: “anpei” }, { id: 5, name: “lanlan” } ] }, methods: { // 方法一 // handleClick(){ // this.userArr.sort(function(){ // return Math.random()-0.5 // }) // } // 方法二 handleClick() { function sortArr(val) { for (let i = 0; i < val.length; i++) { let res = Math.floor(Math.random() * val.length); let tempArr = val[res] val[res] = val[i] val[i] = tempArr // 如果不添加这一句,vue检测不到数组的变化,页面数据是不会发生改变的 val.splice(val.length) } return val; } sortArr(this.userArr) console.log(this.userArr) } } }) </script> </html>

Android中定时执行任务的3种实现方法(推荐)

Android中定时执行任务的3种实现方法(推荐)_Android_脚本之家

在Android开发中,定时执行任务的3种实现方法:

一、采用Handler与线程的sleep(long)方法(不建议使用,Java的实现方式)

二、采用Handler的postDelayed(Runnable, long)方法(最简单的android实现)

三、采用Handler与timer及TimerTask结合的方法(比较多的任务时建议使用)

下面逐一介绍:

一、采用Handle与线程的sleep(long)方法

Handler主要用来处理接受到的消息。这只是最主要的方法,当然Handler里还有其他的方法供实现,有兴趣的可以去查API,这里不过多解释。

1. 定义一个Handler类,用于处理接受到的Message。?

123456Handler handler = new Handler() { public void handleMessage(Message msg) { // 要做的事情 super.handleMessage(msg); } };

Handler handler = new Handler() { public void handleMessage(Message msg) { // 要做的事情 super.handleMessage(msg); } };

2. 新建一个实现Runnable接口的线程类,如下:?

1234567891011121314151617public class MyThread implements Runnable { @Overridepublic void run() { // TODO Auto-generated method stub while (true) { try { Thread.sleep(10000);// 线程暂停10秒,单位毫秒 Message message = new Message(); message.what = 1; handler.sendMessage(message);// 发送消息 } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } }

public class MyThread implements Runnable { @Override public void run() { // TODO Auto-generated method stub while (true) { try { Thread.sleep(10000);// 线程暂停10秒,单位毫秒 Message message = new Message(); message.what = 1; handler.sendMessage(message);// 发送消息 } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } }

3. 在需要启动线程的地方加入下面语句:

new Thread(new MyThread()).start(); 

4. 启动线程后,线程每10s发送一次消息。

二、采用Handler的postDelayed(Runnable, long)方法

这个实现比较简单一些。

1. 定义一个Handler类
?

123456789Handler handler=new Handler(); Runnable runnable=new Runnable() { @Overridepublic void run() { // TODO Auto-generated method stub //要做的事情 handler.postDelayed(this, 2000); } };

Handler handler=new Handler(); Runnable runnable=new Runnable() { @Override public void run() { // TODO Auto-generated method stub //要做的事情 handler.postDelayed(this, 2000); } };

2. 启动计时器

handler.postDelayed(runnable, 2000);//每两秒执行一次runnable. 

3. 停止计时器

handler.removeCallbacks(runnable);  

三、采用Handler与timer及TimerTask结合的方法

1. 定义定时器、定时器任务及Handler句柄
?

12345678910private final Timer timer = new Timer(); private TimerTask task; Handler handler = new Handler() { @Overridepublic void handleMessage(Message msg) { // TODO Auto-generated method stub // 要做的事情 super.handleMessage(msg); } };

private final Timer timer = new Timer(); private TimerTask task; Handler handler = new Handler() { @Override public void handleMessage(Message msg) { // TODO Auto-generated method stub // 要做的事情 super.handleMessage(msg); } };

2. 初始化计时器任务?

123456789task = new TimerTask() { @Overridepublic void run() { // TODO Auto-generated method stub Message message = new Message(); message.what = 1; handler.sendMessage(message); } }; 

task = new TimerTask() { @Override public void run() { // TODO Auto-generated method stub Message message = new Message(); message.what = 1; handler.sendMessage(message); } };

3. 启动定时器

timer.schedule(task, 2000, 2000);  

4. 停止计时器

timer.cancel(); 

简要说一下上面三步提到的一些内容:

1. 定时器任务(TimerTask)顾名思义,就是说当定时器到达指定的时间时要做的工作,这里是想Handler发送一个消息,由Handler类进行处理。

2. java.util.Timer.schedule(TimerTask task, long delay):这个方法是说,dalay/1000秒后执行task.只执行一次。

java.util.Timer.schedule(TimerTask task, long delay, long period):这个方法是说,delay/1000秒后执行task,然后进过period/1000秒再次执行task,这个用于循环任务,执行无数次,当然,你可以用timer.cancel();取消计时器的执行。

每一个Timer仅对应唯一一个线程。

Timer不保证任务执行的十分精确。

Timer类的线程安全的。