开源中国

我们不支持 IE 10 及以下版本浏览器

It appears you’re using an unsupported browser

为了获得更好的浏览体验,我们强烈建议您使用较新版本的 Chrome、 Firefox、 Safari 等,或者升级到最新版本的IE浏览器。 如果您使用的是 IE 11 或以上版本,请关闭“兼容性视图”。
博客专区 - 开源中国社区

精彩阅读

  • 最新推荐

  • 今日热门

  • 本周热门

  • 每日一博

  • 最新文章

AI领袖、应用指南、窥见风口……你还能从这场全球峰会中获得更多

时代的潮流浩浩荡荡,上升到国家发展战略与基础设施的人工智能,正以不可思议的速度占据着我们生活的头条。如果说2017年宣告了人工智能接棒时代脉搏,那么2018年的人工智能将作为颠覆性变革力量迭代世界机器的运作。
GAITC

RecyclerView的简单使用

自从Android 5.0之后,googlet推出了一个RecyclerView控件,他是support-v7包中的新组件,是一个强大的滑动组件,与经典的ListView相比,同样拥有item回收复用的功能,RecyclerView相当于是ListView的升级版。 RecyclerView封装了ViewHolder的回收复用,也就是说RecyclerView标准化了ViewHolder,编写Adapter面向的是ViewHolder而不是View了,复用的逻辑被封装了,写起来更加简单。 RecyclerView提供一种插拔式的体验,高度的解耦,异常的灵活,针对一个Item的显示RecyclerView专门抽取了相应的类,来控制Item的显示,使其的扩展性特别强。 #### 引入RecyclerVIew ``` bash compile 'com.android.support:recyclerview-v7:25.1.0' ``` #### 创建布局文件 ##### 主布局文件 ``` xml /*activity_main.xml*/ ``` ##### Item布局文件 ``` xml /*item.xml*/ ``` #### 创建Adapter RecyclerView的Adapter要比ListView的Adapter设置起来稍微复杂一点,这也是RecyclerView高度解耦的体现,虽然代码复杂一点,但扩展性很好,下面介绍一下实现RecyclerView的Adapter的三个方法: ##### onCreateViewHolder() 该方法主要是为每个Item加载一个View,但是该方法返回的是一个ViewHolder,该...
jzman 发布于 3天前 阅读 98

微信团队分享:微信移动端的全文检索多音字问题解决方案

微信的移动客户端全文搜索中的多音字问题一直是搜索体验的痛点之一。微信客户端全文搜索在上线以后,也经常收到用户关于多音字问题的反馈。所以,微信全文搜索中的多音字搜索成了一个迫切需要解决的问题。本文重点讲述微信安卓客户端在SQLite FTS5的基础上,多音字问题的解决方案。
JackJiang- 发布于 5天前 阅读 250

Android Animation Detailed Tutorial / Android 动画详尽教程

最近整理了 Android 动画方面的教程,从一般的动画到 Material design 中涉及到的动画(只要是属于 Android 动画范畴)整个梳理了一边。 其详尽程度难得一见.
OCNYang 发布于 1周前 阅读 36

使用Shell批量删除AndroidStudio build目录

# 前言 多数Android程序猿都有一个痛,使用AndroidStudio开发安卓项目时,build目录占用太多存储空间。在没有版本控制工具的情况下,一些没有经验的Android开发者会将自己的程序直接打包发送给别人。这样的代码包,少则几十兆,多则数百兆,其中多数都是build目录下的文件。(**使用eclipse开发时,bin 目录和gen目录与之类似。**) 在AS工程中,至少有一个项目级的build目录,每个module 都有一个自己的build目录。也许你们觉得发送代码之前,仔细删除几个build目录,很简便的申请,没必要去为此大费周章的去写什么脚本工具。但是楼主由于工作性质,经常会有同事发送代码过来、和发送代码给同事的情况,以及电脑里存储了公司几十个项目的源码,偶尔改下bug,编译一次。这样才有了写脚本的念头。 > 下图是删除build前后的对比,节省了24G的存储空间。 ![输入图片说明](https://static.oschina.net/uploads/img/201804/12173406_OVD6.jpg "在这里输入图片标题") ![输入图片说明](https://static.oschina.net/uploads/img/201804/12173341_JtgZ.jpg "在这里输入图片标题") # shell 脚本 ## 遍历目录 遍历文件和文件夹,是一个递归的过程,因此声明一个函数`readDi...
flueky 发布于 1周前 阅读 219 评论 7

Objc Runtime在项目中该怎么用

从四个方面讲述Objc Runtime在项目中的使用场景:Method Swizzling、动态方法添加、isa Swizzling、消息转发
aron1992 发布于 2周前 阅读 38

Flutter 构建完整应用手册-动画

Flutter 构建完整应用手册-动画
scooplol 发布于 2周前 阅读 242 点赞 1

Flutter 构建完整应用手册-处理手势

Flutter 构建完整应用手册-处理手势
scooplol 发布于 2周前 阅读 162

JAVA PC端扫码支付(二)支付宝支付开发

项目完成有一段时间了,想把扫码支付这边的记录完善一下,这里简化了相关配置,专注于代码方面
DreSunny 发布于 2周前 阅读 131

iOS蓝牙开发CoreBlueTooth库核心方法使用介绍

蓝牙是设备近距离通信的一种方便手段,在iPhone引入蓝牙4.0后,设备之间的通讯变得更加简单。相关的蓝牙操作由专门的 CoreBluetooth.framework进行统一管理。通过蓝牙进行通讯交互分为两方,一方为中心设备central,一方为外设 peripheral,外设通过广播的方式向外发送信息,中心设备检索到外设发的广播信息,可以进行配对连接,进而进行数据交互。
manofit 发布于 2周前 阅读 95 点赞 1

android的MessageQueue.IdleHandler

MessageQueue内部有个IdleHandler接口,具体定义如下: /** * Callback interface for discovering when a thread is going to block * waiting for more messages. */ public static interface IdleHandler { /** * Called when the message queue has run out of messages and will now * wait for more. Return true to keep your idle handler active, false * to have it removed. This may be called if there are still messages * pending in the queue, but they are all scheduled to be dispatched * after the current time. */ boolean queueIdle(); } 简而言之,就是在looper里面的message暂时处理完了,这个时候会回调这个接口,返回false,那么就会移除它,返回true就会在下次message处理完了的时候继续回调。 下面先通过个例子来直观看下IdleHandler的执行时机。 public class IdleHandleActivity extends Activity { public static final String TAG = "IdleHandleActivity"; @Override protected void onCreate(Bundle sav...
xingjm8511 发布于 2周前 阅读 67 点赞 1

判断JS数据类型的4种方法

在 ECMAScript 规范中,共定义了 7 种数据类型,分为 基本类型 和 引用类型 两大类,如下所示: 基本类型:String、Number、Boolean、Symbol、Undefined、Null  引用类型:Object 基本类型也称为简单类型,由于其占据空间固定,是简单的数据段,为了便于提升变量查询速度,将其存储在栈中,即按值访问。 引用类型也称为复杂类型,由于其值的大小会改变,所以不能将其存放在栈中,否则会降低变量查询速度,因此,其值存储在堆(heap)中,而存储在变量处的值,是一个指针,指向存储对象的内存处,即按址访问。引用类型除 Object 外,还包括 Function 、Array、RegExp、Date 等等。 鉴于 ECMAScript 是松散类型的,因此需要有一种手段来检测给定变量的数据类型。对于这个问题,JavaScript 也提供了多种方法,但遗憾的是,不同的方法得到的结果参差不齐。 下面介绍常用的4种方法,并对各个方法存在的问题进行简单的分析。 1、typeof typeof 是一个操作符,其右侧跟一个一元表达式,并返回这个表达式的数据类型。返回的结果用该类型的字符串(全小写字母)形式表示,包括以下 7 种:number、boolean、symbol、string、object、undefined、function 等。 typeof ''; // string 有效...
太阳系的小胡狸 发布于 2周前 阅读 210 评论 1

「Python」PNG OR JPG Convert to WebP

webp python
蔡小鹏 发布于 2周前 阅读 98 评论 1 点赞 1

Chromium Android 源码编译踩坑过程(shadowsocks + ubuntu)

本人历经一个多星期,利用业余时间,踩了无数个坑,最后终于成功编译chromium android的源码,回想起来真心不易,现特将这一过程分享出来,以免他人再走弯路。 首先,我要强调3点关键因素: 一定要有完善的梯子。最好是你已肉身翻墙,比如留学,移民,甚至是去国外旅游。如果做不到这点,那就只能使用翻墙工具,关于这块,由于我已经多年没用vpn,而改用shadowsocks,但之前也只是一直在mac上用带GUI的ss,而在Linux上,却不得不自己用命令行来配置,过程繁琐,还容易出错。可以说,大部分的时间是花在了搭梯子上。另外,如果你购买的是付费的shadowsocks,一定要注意流量额度和计费方式,我就是不凑巧用了个很贵的节点,导致我一下就用完了一个月的流量,还多花了几十块钱去充流量。 一定要用linux,而且要熟练使用,之前就是光在google官网上看了个chromium pc端编译的文档,说是支持mac编译,就兴冲冲的拿mac去下代码,结果怎么也不成功。后来看了chromium android的文档,才发现只能用linux。但我linux用的确实不熟,好多操作都要去现场百度,这样就耽误了不少时间。 不要幻想用骚操作来搞定,要老老实实跟着官网的步骤一步步的走,等这条路走通了再考虑用其他方式改进...
yhchinabest 发布于 2周前 阅读 193 评论 1

开源一款自己闲余时间用Kotlin开发的看笑话的笑话APP

开源一款自己闲余时间用Kotlin开发的看笑话的笑话APP
xiaolei123 发布于 3周前 阅读 334 评论 3

嵌套滚动利器--NestedScrolling机制

最近看到许多app都有丝滑般嵌套滑动,各个组件协调滑动.于是自己网上查阅下,很多文章知识点都是零零散散,自己才有这篇文章的出现。我尽可能的表述出我是如何对一个未知的知识到认识并应用
HzhiBo 发布于 3周前 阅读 135

Shell入门看我吧

shell入门的文章,对shell不太熟悉小伙伴可以看看
aron1992 发布于 3周前 阅读 2502 评论 6 点赞 9

iOS常见问题(1): 浅拷贝与深拷贝

> 本人所有文章目录:http://my.oschina.net/ChenTF/blog/677112 > 本篇文章地址: http://my.oschina.net/ChenTF/blog/1789532 > 转载请注明出处 **在开始之前, 先来个测验:** 1. 对NSString执行copy后, 是深拷贝还是浅拷贝? 2. 对NSMutableString执行copy后, 是深拷贝还是浅拷贝? 3. 对数组进行Copy后, 是深拷贝还是浅拷贝? 4. 对数组进行Copy后, 修改旧数组内指针对象所指向的内容, 新数组对象内容是否改变? 5. 对数组进行mutableCopy呢? 6. NSArray *newArray = [[NSArray alloc] initWithArray:oldArray]. 对newArray的元素所指的指针进行操作, 会影响oldArray吗? 7. 如何实现数组的内容Copy?(一维数组) **答案:** 1. 浅拷贝 2. 深拷贝 3. 浅拷贝 4. 改变 5. 深拷贝, 改变 6. 会影响 7. initWithArray:copyItems: 争议点: 数组的内容是指针列表, 对数组进行mutableCopy时, 数组的内容已经开辟了新的空间进行了复制. 我觉得对数组对象而言已经是深拷贝. 当然有些同学觉得没有对数组所指对象进行重新分配空间, 不属于深拷贝. 如果你对以上问题都答对了, 则请忽略本文. 以下是**正文**: ---- **概念:** * 浅拷贝 / 指针拷贝: 再有指针的情况下, 增加一个指针指向已经存在的...
advancer_chen 发布于 3周前 阅读 126

金蝶随手记团队分享:还在用JSON? Protobuf让数据传输更省更快(实战篇)

本文接上篇《金蝶随手记团队分享:还在用JSON? Protobuf让数据传输更省更快(原理篇)》,以iOS端的Objective-C代码为例,向您演示如何使用Protobuf。
JackJiang- 发布于 3周前 阅读 358 评论 5

最详细的Android P版本刘海屏适配指南来了

Android P预览版增加了很多亮点新特性,其中最接地气、最直观的改变当属适配了类似于华为P20的顶部凹槽屏幕设计这一项,俗称刘海屏。 在开发者模式中,Android P系统将调整通知栏的设计来适配此种屏幕,新的APIs也将允许开发者决定通知消息的展示形式。 随着各大手机厂商挤入“刘海屏”手机发布的潮流,Android P版本的此特性,能够让各大应用厂商充分利用独特的屏幕来进行应用设计。 那么如何让你的应用快速适配刘海屏呢?本文为你提供最详细的解读指南。
华为终端开放实验室 发布于 3周前 阅读 568

JSONModel源码解析

JSOMModel是一款十分优秀的JSON数据映射开源库,其功能强大,自定义灵活。本篇博客主要分析JSONModel的一些实现思路。
珲少 发布于 3周前 阅读 235

大公司和小公司的程序员差别在哪?

  先来说说几个情况:   大公司A:不想干了,什么都学不到,每天都维护这一个东西,都想去小公司。   小公司B:累死了,什么都做,太乱太杂,没系统不规范,要是能去大公司多好。   看了这两段简短的话,我相信有一部分人会很有感触。   从上面的话中,我们不难看出,大公司的员工羡慕小公司,可以学到很多东西,好多程序员还是很有钻研精神的,学习可以说是他们的一个乐趣和展示自我价值,我身边的一个同事就是典型的如果得不到成长和学习新的东西,就会不爽。小公司的员工又会抱怨太累太杂,什么都是一个人做,虽然做了好多东西,但很羡慕大公司的正规化。   其实想解决这些问题不难,先调整好心态,只有一个好的心态,你才可能健康成长。   在小公司成长:   好多小公司都是3,4个人一个小组,工作量大,加班,杂,什么都要做,就连测试都还要亲历亲为,怎么看怎么觉得这不是人待的地方,被严重剥削的廉价劳动力。   怎么说的小公司一无是处,其实也不是的,我们要从当中看到优势,我们才有可能进步,逆向思维下,工作量大,杂是坏事吗,在我认为,对于一个想真正成长,想将来进入大公司,或者有一番作为的人,这正是小公司的优势和有点。小公司的员工...
虞姬-lu 发布于 3个月前 阅读 49

解决华为手机乱跳高德位置服务需要电话权限的方法

打开设置,应用管理,更多,显示系统进程,高德位置服务,权限,授权电话权限。
yx91490 发布于 5小时前 阅读 5

ToolBar的使用

1. 布局中引入ToolBar ``` ``` 2. 将该toolBar设置为actionBar,然后再设置title,subtitle和navigationIcon,这些东西也可以直接在布局中进行设置 ``` private void initActionBar() { toolbar = findViewById(R.id.activity_toolBar); setSupportActionBar(toolbar); setTitle("ToolBar例子"); //这里我们设置了一个SVG矢量图为 navigationIcon,只支持5.0以上的机器使用 if(Build.VERSION.SDK_INT > Build.VERSION_CODES.LOLLIPOP) { toolbar.setNavigationIcon(R.drawable.back_icon_white_24dp); } toolbar.setSubtitle("奔跑吧,兄弟"); } ``` 3. 常见到的回调 ``` //会显示在ToolBar的上面 //会显示在ToolBar的上面 ``` ``` // 生成菜单的方法 有的菜单选项会显示在ToolBar上,有的同伙popwindow显示出来 @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.nav_menu,menu); return true; } // 点击menu的item 回调事件 @Override public boolean onMenuItemClick(MenuItem menuItem) { switch (menuItem.getItemId()) { case R.id.first_menu: Toast.makeText(getApplicationContext(),"firstMenu clicked",Toast.LENGT...
折痕丶 发布于 13小时前 阅读 4

AI领袖、应用指南、窥见风口……你还能从这场全球峰会中获得更多

时代的潮流浩浩荡荡,上升到国家发展战略与基础设施的人工智能,正以不可思议的速度占据着我们生活的头条。如果说2017年宣告了人工智能接棒时代脉搏,那么2018年的人工智能将作为颠覆性变革力量迭代世界机器的运作。
GAITC

齐次坐标理解

1. 齐次 事实上带齐次的概念很多,纯粹要说“齐次”的含义的话,似乎比较抽象难懂,所以我觉得给出一个具体的齐次的东西来解释可能会更好一点。 下面我要解释的齐次坐标(homogeneous coordinates)是我所熟悉的计算机视觉和图形学这两个领域中经常要用到的概念,同时,坐标也是一般人都可以理解的东西。 二维空间中的一个点是用二元组表示的。我们可以增加一个额外的坐标得到三元组,同时我们声明这是同一个点。这看起来完全无害,因为我们可以很简单地通过增加或者删除最后一个坐标值来在两种表示方式之间来回切换。现在,有一个很重要的问题是:最后一个坐标为什么需要是1?毕竟,另外两个数字没有这样的限制呀。比方说。在这里,我们要再给出一个定义,即当k非零时,所有形如的三元组都表示同一个点,比如和就表示同一个点。由此我们就可以引出齐次坐标的定义,即给定一个二维点,那么形如的所有三元组就都是等价的,它们就是这个点的齐次坐标。对每一个齐次坐标,我们只要把它除以三元组中的第三个数,即可得到原始的二维点坐标(这就是@祝文祥的答案中所说的同比收缩的一个例子)。不过我觉得,从字面上来看,齐次坐标这个叫法还是不那么形象,不过看看和齐次对应的英文...
NickHomeSelf 发布于 2个月前 阅读 9

Android退出应用的最佳方式

 下面贴出两个方法,第一个是按两下返回键直接退出,第二个可以手动调用. 这两个方法都需要在 AndroidManifest.xml 中把 activity 设置为 singleTask,即 android:launchMode="singleTask" /** * 需要在 AndroidManifest.xml 中把 activity 设置为 singleTask * android:launchMode="singleTask" */ private boolean mIsExit; @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_BACK) { if (mIsExit) { this.finish(); } else { Toast.makeText(this, "再按一次退出", Toast.LENGTH_SHORT).show(); mIsExit = true; new Handler().postDelayed(new Runnable() { @Override public void run() { mIsExit = false; } }, 2000); } return true; } return super.onKeyDown(keyCode, event); } /** * 退出程序的对话框,可用按钮等控制 * 需要在 AndroidManifest.xml 中把 activity 设置为 singleTask * android:launchMode="singleTask" */ private void exitDialog() { Dialog dialog = new AlertDialog.Builder(MainActivity.this) .setTitle("程序退出?") /...
漫步海边小路 发布于 2周前 阅读 11

24. 二叉搜索树的后序遍历序列

  题目:输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则返回true,否则返回false。假设输入的数组的任意两个数字都互不相同。   思路:因为是二叉搜索树,所以每个根结点的左子树结点都比根结点小,右子树比根结点大。   例如输入{5,7,6,9,11,10,8},后序遍历肯定是根结点最后遍历的,所以8为根结点,然后因为5,7,6比8小,所以在8的左边,9,11,10在右边。以此类推这个数组符合。   例如输入{7,4,6,5},5为根节点,因为7大于5,所以没有左子树,但4又小于5,矛盾,所以不符合。 #include<iostream> #include<cstdio> #include<deque> using namespace std; bool VerifyBst(int sequence[], int length) { if (sequence == NULL || length <= 0) { return false; } int root = sequence[length-1]; //在二叉搜索树中左子树结点小于根结点 int i = 0; for (; i < length - 1; i++) { if (sequence[i] > root) { break; } } //右子树大于根结点 int j = i; for (; j < length - 1; j++) { if (sequence[j] < roo...
无精疯 发布于 6小时前 阅读 3

25. 二叉树中和为某一值的路径

  题目:输入一棵二叉树和一个整数,打印出二叉树中结点值为的和为输入整数的所有路径。从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。   思路:按照前序遍历的顺序遍历二叉树。将每次遍历的结点保存,然后遍历到叶结点的时候进行计算,计算完之后符合就输出,不符合就返回上一级同时删除叶结点,继续遍历。            10          5    12     从10开始遍历,10,5,4,不符合,删除4返回5。10,5,7符合,输出。删除7,返回        4   7         5,删除5,返回10。10,12符合输出。可以看出符合栈结构。   #include<iostream> #include<cstdio> #include<stack> #include<vector> using namespace std; struct BinaryTreeNode { int m_nValue; BinaryTreeNode* m_pLeft; BinaryTreeNode* m_pRight; }; BinaryTreeNode* CreateNode(int value) { BinaryTreeNode* TreeNode = new BinaryTreeNode(); TreeNode->m_nValue = value; TreeNode->m_pLeft = NULL; TreeNode->m_pRight = NULL; return TreeNode; } void ConnectTreeNodes(BinaryTreeN...
无精疯 发布于 4小时前 阅读 3

Android工程模块化平台设计-讲稿

这篇文章是我在 2018【[携程技术沙龙移动技术专场](https://mp.weixin.qq.com/s/B3eWQmgUZYFeGPs4DWo8gw)】技术分享时所讲内容的文字版本,修改删减了演讲时的冗余言语。 发布在【[开源中国博客](https://my.oschina.net/kymjs)】,希望能给买不到票参加大会的朋友带来帮助。 ![Android 模块化](https://kymjs.com/qiniu/images/blog_image/napos-modular.001.jpeg) 大家好,今天跟大家分享的主题是《Android工程模块化平台的设计》 ![Android 模块化](https://kymjs.com/qiniu/images/blog_image/napos-modular.002.jpeg) 首先自我介绍一下:我叫张涛,目前就职于饿了么移动技术部。可能有些朋友认识我,我之前也会在我博客【[开源实验室](https://kymjs.com)】写一些Android相关的技术点,如果对今天讲的模块化设计,你觉得有什么问题或者可以深入探讨的,也欢迎加我微信`kymjs123`详聊。 ![Android 模块化](https://kymjs.com/qiniu/images/blog_image/napos-modular.003.jpeg) 今天我们讲的主题是基于项目模块化来说的,模块化是什么大家肯定都是知道了的,这里问一下大家,有多少人在此之前有做过模块化的,举个手我看一下;了解过听说过模块化的呢?这次比较多。 我们...
kymjs张涛 发布于 3小时前 阅读 3

WCDBSwift笔记

是时候使用WCDBSwift了. 用过Realm, SQLite.swift, 各有利弊吧, 但都没有达到我想象中的那么好用. 最近花了几天时间研究一下WCDBSwift的用法, 发现这个才是我最想要的数据库操作库, 线程安全, 性能高, 便捷的语言集成查询, 这是目前我发现Swift最好用的数据库三方库. 两个字: 好用.
hell03W 发布于 3个月前 阅读 99

LoadingDialog使用

package ---.view; import android.app.Dialog; import android.content.Context; import android.view.WindowManager; import android.widget.TextView; import com.czb.chezhubang.R; /** * Created by zqz on 2017/7/6. */ public class LoadingDialog extends Dialog { private TextView tv_text; public LoadingDialog(Context context){ super(context); } public LoadingDialog(Context context,int theme) { super(context,theme); //去阴影 // getWindow().clearFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND); /**设置对话框背景透明*/ // getWindow().setBackgroundDrawableResource(R.color.transparent); setContentView(R.layout.loading); tv_text = (TextView) findViewById(R.id.tv_text); setCanceledOnTouchOutside(false); } /** * 为加载进度个对话框设置不同的提示消息 * @param message 给用户展示的提示信息 * @return build模式设计,可以链式调用 */ public LoadingDialog setMessage(String message) { ...
碎片逻辑 发布于 3个月前 阅读 26

android studio中文件乱码问题

从外导入工程,java文件中有中文,出现乱码,在app\build.gradle中修改如下,再sync now一次即正常: ``` ndroid { compileSdkVersion 23 buildToolsVersion "26.0.2" defaultConfig { applicationId "com.cvr.cvr100u_demo" minSdkVersion 15 targetSdkVersion 15 } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt' } } //下面就是要增加的地方 **_ compileOptions { encoding "GBK" }_** } ```
whoisliang 发布于 1周前 阅读 6

Ionic3学习笔记(十五)自定义 tab icon

**本文为原创文章,转载请标明[出处](http://metaphors.name/coding/2018/02/05/Ionic15.html)** 美工做了一套 icon,自然是要用的。将 icon copy 到 `assets` 文件夹下。 例如 `.icon-ios-home-custom` 为 iOS icon 选中状态;`.icon-ios-home-custom-outline` 为 iOS icon 未选中状态。 `app.scss`: ``` .ion-ios-home-custom, .ion-ios-home-custom-outline { width: 26px !important; height: 26px !important; min-width: 26px !important; } .ion-ios-home-custom { content: url("../assets/icon/tabs/home-active.png"); } .ion-ios-home-custom-outline { content: url("../assets/icon/tabs/home-inactive.png"); } ``` `tabs.html`: ``` ``` **如有不当之处,请予指正,谢谢~**...
Metaphors 发布于 2个月前 阅读 88

IOS基于cocoaPods创建私库,组件化开发思路

对于xcode9以上的版本,对git的支持比较好,这里我们选择使用git进行代码的版本控制。要使用git,我们很快就想到了github,不过很悲催的是,笔者使用的电脑只能连接局域网,没法访问github官网,可以使用gitblit创建内部git服务器,操作非常简单。可笔者打算使用码云作为git仓库,进行代码托管。具体步骤: 1、准备工作     1.1、对git的操作比较熟悉     1.2、通过手机网络下载github上的pod-template项目(电脑能访问github的除外),将此项目使用git上传到码云仓库上,以便后续使用pod lib create创建pod第三方组件     上传的git命令:git add、git commit、git push等 2、创建名Specs仓库    2.1、此仓库主要用来保存组件的podspec文件,后续要讲本地仓库的podspec文件同步到Specs仓库中,此文件是cocoapods进行下载第三方组件的说明文档     2.2、将Specs仓库添加到pod仓库列表中     pod repo add XXX(仓库名) http://xxxx/xxx/Specs.git ,然后使用pod repo查看说有的pod仓库列表 3、创建本地第三方组件(如AFN类似框架)     pod lib create xxx (组件名称)  默认会通过github中的pod-template项目模板创建,可以通过--template-url=URL来制定...
移动使者 发布于 1个月前 阅读 123

小程序直播渐露峥嵘,准备好拥抱最新增长潮流了吗?

小程序直播的未来已经画好,而我们又给它添了些色彩。
七牛云 发布于 2个月前 阅读 30

Android跨平台编译 —— ICONV

摘要: 公司最近开启新项目,不过核心代码三端公用,而且是用c++写的。想要在android上使用就需要经历痛苦的跨平台编译过程。
街角的小丑 发布于 2个月前 阅读 164

19. 二叉树的镜像

  题目:请完成一个函数,输入一个二叉树,该函数输出它的镜像。   思路:根据图可得到思路。先交换根结点下的左右子树,然后再交换子树下的左右结点。     测试用例:   1.功能测试   2.特使测试 #include<iostream> #include<cstdio> using namespace std; struct BinaryTreeNode { int m_nValue; BinaryTreeNode* m_pLeft; BinaryTreeNode* m_pRight; }; //创建树结点 BinaryTreeNode* CreateNode(int value) { BinaryTreeNode* TreeNode = new BinaryTreeNode(); TreeNode->m_nValue = value; TreeNode->m_pLeft = NULL; TreeNode->m_pRight = NULL; return TreeNode; } //连接树结点 void ConnectTreeNodes(BinaryTreeNode* pRoot, BinaryTreeNode* pLeft, BinaryTreeNode* pRight) { if (pRoot == NULL) { return; } pRoot->m_pLeft = pLeft; pRoot->m_pRight = pRight; } void PrintTreeNode(BinaryTreeNode* pNode) { if(pNode != NULL) { cout << "node:" << pNode->m_nValue << " "; if(pNode->m_pLeft != NULL) cout <...
无精疯 发布于 5天前 阅读 5

ios使用私有api被拒

ios使用私有api被拒,苹果什么都没说,只说了使用了PrivateFrameworks/WebCore.framework的私有api.
RayChow_周小睿 发布于 2个月前 阅读 89

Android中使用Dagger2

Dagger2基本使用
dimdim 发布于 3个月前 阅读 20

超赞!UX写手必备技能

以下内容由Mockplus团队翻译整理,仅供学习交流,Mockplus是更快更简单的原型设计工具。 今天,小编非常荣幸能与大家一起分享一些优秀UX 写手必备的成功技能: 1.开篇抓住用户的心 MBE曾说过: “第一印象更加持久。” UX 作家文案书写的目的在于引起读者注意。而吸引读者注意力首当其冲的部分就是文案的第一段落。为什么呢?因为读者更容易受到对于文案的第一印象的影响,而选择继续阅读或直接离开。所以,无论如何,尽量让你文案的前言或导语部分更具相关性,娱乐性,趣味性以及吸引力,以激起读者的阅读兴趣。 “激发读者好奇心。” 2. 晦涩的辞藻并不是明智的选择 作为一名设计师,你应该确保设计的文案对于每个人来说都是简单易懂的。如若你并不能使用更加简单易懂的语句或辞藻来进行解释,只能暴露你并不完全了解你的专业这个事实而已。 爱因斯坦曾经说过: “如果你不能把它简单地解释出来,那说明你还没有很好的理解它。” 3. 利用高质量图片 研究表明,如若为用户提供更多相关性图片,以提高文案内容的可视化,可以极大的增加文章用户保留率。而且添加适当图片对于牢牢抓住用户注意力和提升文章SEO 排名两个方面,发挥着重要作用。 “一副好图片胜过千言万语。” ...
jongde 发布于 2个月前 阅读 11

iOS MJ加载更多停不下来无限重复刷以及闪屏的问题

昨晚测试过来给我看了一个很尴尬的问题,下拉加载 duangduangduang停不下来~,以为是重复调用啥的 ,搞了半天,弄了个iOS10版本的手机居然是好的!然后发现是iOS11的锅!然后我仔细看一下发现不光是重复刷新,之前的界面还会突然跳一下,每次加载都会 解决办法:添加这三句: self.pinglunTableView.estimatedRowHeight = 0; self.pinglunTableView.estimatedSectionHeaderHeight = 0; self.pinglunTableView.estimatedSectionFooterHeight = 0;  
RainOrz 发布于 3个月前 阅读 52

AI领袖、应用指南、窥见风口……你还能从这场全球峰会中获得更多

时代的潮流浩浩荡荡,上升到国家发展战略与基础设施的人工智能,正以不可思议的速度占据着我们生活的头条。如果说2017年宣告了人工智能接棒时代脉搏,那么2018年的人工智能将作为颠覆性变革力量迭代世界机器的运作。
GAITC

开源众包优质开发商计划。一百万的项目等你来撩!

只要你有心,100万等着你
开源中国众包平台 发布于 2天前 阅读 694

Shell入门看我吧

shell入门的文章,对shell不太熟悉小伙伴可以看看
aron1992 发布于 3周前 阅读 2502 评论 6 点赞 9

最详细的Android P版本刘海屏适配指南来了

Android P预览版增加了很多亮点新特性,其中最接地气、最直观的改变当属适配了类似于华为P20的顶部凹槽屏幕设计这一项,俗称刘海屏。 在开发者模式中,Android P系统将调整通知栏的设计来适配此种屏幕,新的APIs也将允许开发者决定通知消息的展示形式。 随着各大手机厂商挤入“刘海屏”手机发布的潮流,Android P版本的此特性,能够让各大应用厂商充分利用独特的屏幕来进行应用设计。 那么如何让你的应用快速适配刘海屏呢?本文为你提供最详细的解读指南。
华为终端开放实验室 发布于 3周前 阅读 568

微信团队分享:微信移动端的全文检索多音字问题解决方案

微信的移动客户端全文搜索中的多音字问题一直是搜索体验的痛点之一。微信客户端全文搜索在上线以后,也经常收到用户关于多音字问题的反馈。所以,微信全文搜索中的多音字搜索成了一个迫切需要解决的问题。本文重点讲述微信安卓客户端在SQLite FTS5的基础上,多音字问题的解决方案。
JackJiang- 发布于 5天前 阅读 250

iOS审核解决2.1大礼包成功案例

2.1大礼包 ### Guideline 2.1 - Information Needed This type of app has been identified as one that may violate one or more of the following [App Store Review Guidelines](https://developer.apple.com/app-store/review/guidelines/). Specifically, these types of apps often: 1.1.6 - Include false information, features, or misleading metadata. 2.3.0 - Undergo significant concept changes after approval 2.3.1 - Have hidden or undocumented features, including hidden "switches" that redirect to a gambling or lottery website 3.1.1 - Use payment mechanisms other than in-app purchase to unlock features or functionality in the app 4.3.0 - Are a duplicate of another app or are conspicuously similar to another app 5.2.1 - Were not submitted by the legal entity that owns and is responsible for offering any services provided by the app 5.3.4 - Do not have the necessary licensing and permissions for all the locations where the app is used Before we can continue with our review, please confirm that t...
壹峰 发布于 2个月前 阅读 1807

iOS使用Shell脚本批量修改类名称

使用shell脚本批量修改类名称,简化重复工作,提高工作效率666
aron1992 发布于 2个月前 阅读 597 评论 7

iOS使用shell脚本注入混淆内容

使用shell脚本简化重复工作,提高工作效率666
aron1992 发布于 2个月前 阅读 626 评论 14 点赞 2 打赏 1

RecyclerView的简单使用

自从Android 5.0之后,googlet推出了一个RecyclerView控件,他是support-v7包中的新组件,是一个强大的滑动组件,与经典的ListView相比,同样拥有item回收复用的功能,RecyclerView相当于是ListView的升级版。 RecyclerView封装了ViewHolder的回收复用,也就是说RecyclerView标准化了ViewHolder,编写Adapter面向的是ViewHolder而不是View了,复用的逻辑被封装了,写起来更加简单。 RecyclerView提供一种插拔式的体验,高度的解耦,异常的灵活,针对一个Item的显示RecyclerView专门抽取了相应的类,来控制Item的显示,使其的扩展性特别强。 #### 引入RecyclerVIew ``` bash compile 'com.android.support:recyclerview-v7:25.1.0' ``` #### 创建布局文件 ##### 主布局文件 ``` xml /*activity_main.xml*/ ``` ##### Item布局文件 ``` xml /*item.xml*/ ``` #### 创建Adapter RecyclerView的Adapter要比ListView的Adapter设置起来稍微复杂一点,这也是RecyclerView高度解耦的体现,虽然代码复杂一点,但扩展性很好,下面介绍一下实现RecyclerView的Adapter的三个方法: ##### onCreateViewHolder() 该方法主要是为每个Item加载一个View,但是该方法返回的是一个ViewHolder,该...
jzman 发布于 3天前 阅读 98

关于Android构建出现Error:In <declare-styleable> FontFamilyFont, unable to find attribute android:fontVar问题

Error:In FontFamilyFont, unable to find attribute android:fontVariationSettings
安之若命 发布于 1个月前 阅读 567

iOS使用shell脚本批量修改属性

使用shell脚本批量修改属性名称,简化重复工作,提高工作效率666
aron1992 发布于 2个月前 阅读 371 评论 4

Redis的7个应用场景

一:缓存——热数据 热点数据(经常会被查询,但是不经常被修改或者删除的数据),首选是使用redis缓存,毕竟强大到冒泡的QPS和极强的稳定性不是所有类似工具都有的,而且相比于memcached还提供了丰富的数据类型可以使用,另外,内存中的数据也提供了AOF和RDB等持久化机制可以选择,要冷、热的还是忽冷忽热的都可选。 结合具体应用需要注意一下:很多人用spring的AOP来构建redis缓存的自动生产和清除,过程可能如下: Select 数据库前查询redis,有的话使用redis数据,放弃select 数据库,没有的话,select 数据库,然后将数据插入redis update或者delete数据库钱,查询redis是否存在该数据,存在的话先删除redis中数据,然后再update或者delete数据库中的数据 上面这种操作,如果并发量很小的情况下基本没问题,但是高并发的情况请注意下面场景: 为了update先删掉了redis中的该数据,这时候另一个线程执行查询,发现redis中没有,瞬间执行了查询SQL,并且插入到redis中一条数据,回到刚才那个update语句,这个悲催的线程压根不知道刚才那个该死的select线程犯了一个弥天大错!于是这个redis中的错误数据就永远的存在了下去,直到下一个update或者delete。 二:计数器 诸如...
architect刘源源 发布于 2周前 阅读 905

wx-jq:一套完全原创的微信小程序插件集合库

一套完全原创的微信小程序插件集合库
透笔度 发布于 3个月前 阅读 1080 评论 3 点赞 1

小程序的支付Demo和登录Demo

爬了几次坑,终于爬出来了
季书歌 发布于 2个月前 阅读 336

mint-ui 实现下拉刷新 上拉加载 全步骤

亲测 兼容安卓 ios主流手机 但是安卓某些手机 屏幕内容填充满时才有上拉效果
涐的野心就是占有沵 发布于 2个月前 阅读 264

AndroidStudio 配置的默认路径修改

AndroidStudio的配置默认路径在C:\Users\用户名\.AndroidStudio3.0 下,在这里会有一个缺点是C盘会常常空间不够用,所以我就想改到其他盘的。看图: Android Studio安装好以后会在系统盘用户目录下产生这么几个文件夹: .android 这个文件夹是Android SDK生成的AVD(Android Virtual Device Manager)即模拟器存放路径 .AndroidStudio 这个文件夹是Android Studio的配置文件夹,主要存放一些AndroidStudio设置和插件和项目的缓存信息 .gradle 这个文件夹是构建工具 Gradle的配置文件夹,也会存储一些项目的构建缓存信息 1.AndroidStudio文件夹的修改 进入Android Studio的安装目录,进入bin文件夹,用文本编辑软件打开idea.properties,去掉以下两项的注释符号#,修改对应的路径为新路径即可。  idea.config.path=G:/AndroidStudioSetup/.AndroidStudio3.0/config  idea.system.path=G:/AndroidStudioSetup/.AndroidStudio3.0/system 2.gradle文件夹的修改 这项比较简单,在Android Studio的配置选项中修改就行 3. .android文件夹的修改 这个文件夹是由Android SDK配置模拟器生成的,也是最占空间的一个。 首先,需要添加一个系统的环境变量ANDROID_SDK_HOME,如下图...
carlos 发布于 1个月前 阅读 254

React Native插件系列之插件汇总

react-native-iphone-x-helper iphoneX 适配 react-native-linear-gradient 颜色渐变处理 react-native-login  视频界面登录 react-native-keyboard-aware-scroll-view 键盘显示处理 react-native-popup-dialog 弹窗 react-native-dropdownalert 一种非常漂亮的alert弹窗方式,从状态栏往下弹窗; react-native-simple-radio-button 单选按钮; react-native-swiper react-native-macos macos桌面应用 react-native-wechat 集成微信相关SDK react-native-modalbox  模态弹窗 react-native-touch-id 指纹登录 react-native-prompt 可输入文字的弹窗 react-native-sqlite-storage sqlite数据库存储 react-native-permissions 权限检查 react-native-progress-hud loading圈 react-native-snackbar 类似toast的弹窗模式 react-native-qrcode-svg 二维码生产工具 native-base UI组件 react-native-busy-indicator loading圈 react-native-fit-image 图片展示优化 react-native-timer 定时器管理 react-native-scrollable-tab-view 可以左右滑动的tab react-native-zip-archive 解压工具 react-native-xml2js react-native-spinkit 好看的loading圈 react-native-interactabl...
令小力 发布于 3个月前 阅读 310

Identifiers must have user defined types from the XML file. View is missing

今天玩databinding,一切搞定之后,make一下moudle,结果报了个异常: Error:Execution failed for task ':DataBindingDemo:compileDebugJavaWithJavac'. > java.lang.RuntimeException: Found data binding errors. ****/ data binding error ****msg:Identifiers must have user defined types from the XML file. Color is missing it file:D:\Android\AndroidProject\Android5.0Demo\DataBindingDemo\src\main\res\layout\activity_resource.xml loc:120:45 - 120:49 ****\ data binding error **** 提取出主要的内容就是 Identifiers must have user defined types from the XML file. View is missing 意思是说id没有在layout文件中定义,于是我就想到底是什么id?后来经过百度,只有一片中文博客说了这个问题,还被删除了,但是,哥从百度快照里面还是找到了帖子的内容,说是的是在<data>标签中有些包没有导入,所以报这个异常。 细细查看我的layout内容后,发现如下设置: <CheckBox android:id="@+id/cb" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginSta...
猴亮屏 发布于 2个月前 阅读 161

iOS 组件化-使用cocoapods集成实战演练

## 背景 之前写过一篇 [iOS 组件化实现的一些思路总结](https://my.oschina.net/FEEDFACF/blog/1609377) ,这篇作为续集,聊一聊使用 `Cocoapods` 在iOS平台组件化的实现和集成。 ## 结果 本文中的两个例子可以在 [YTThirdPlatformManager](https://gitee.com/dhar/YTThirdPlatformManager) 项目中找到。 ## 工具介绍 `Cocoapods` 是iOS/osx平台的开发库管理工具,简单的配置然后执行安装命令 `Cocoapods` 会自动去下载第三方库并且做好相应的配置,简化了引入第三方库的流程,让开发更简单高效,是iOS开发的必备工具,使用 `Cocoapods` 作为组件化的工具是一个不错的选择。 ## 安装和设置 安装和设计可以参考这篇文章: [Cocopods安装和升级备忘录](https://my.oschina.net/FEEDFACF/blog/1480211) ## 实现 ### 简单项目组件化 以一个测试模块解耦的场景实现简单项目的组件化,主要包含以下内容 - Pod库项目创建 - 最基础podspec文件的编写的解释 - 客户端集成 #### 创建项目 使用 `pod lib create` 创建项目,会遇到几个需要输入的地方,具体的解释看代码段中的注释 ```sh ➜ DevPods pod lib create PTTestKit Cloning `https://github.com/CocoaPods/pod-template.git`...
aron1992 发布于 3个月前 阅读 239

使用wepy报错问题

开发的微信小程序项目中使用了wepy框架,今天因为旧文件缓存清除不掉而选择了清除全部缓存,依然没有解决后来是删了项目重新加载项目,然而却有这样的报错: thirdScriptError sdk uncaught third Error regeneratorRuntime is not defined ReferenceError: regeneratorRuntime is not defined 原因是什么呢?新建项目没有按照wepy文档的提示重置几个开发者工具项目设置: * 微信开发者工具-->项目-->关闭ES6转ES5。 重要:漏掉此项会运行报错。 * 微信开发者工具-->项目-->关闭上传代码时样式自动补全。 重要:某些情况下漏掉此项也会运行报错。 * 微信开发者工具-->项目-->关闭代码压缩上传。 重要:开启后,会导致真机computed, props.sync 等等属性失效。(注:压缩功能可使用WePY提供的build指令代替,详见后文相关介绍以及Demo项目根目录中的wepy.config.js和package.json文件。) [wepyjs - 小程序组件化开发框架](https://tencent.github.io/wepy/document.html#/)...
yoyoso 发布于 1个月前 阅读 194

hashmap的初始容量为什么设置为16?

static int indexFor(int h, int length) { return h & (length-1); } 我们知道对于HashMap的table而言,数据分布需要均匀(最好每项都只有一个元素,这样就可以直接找到),不能太紧也不能太松,太紧会导致查询速度慢,太松则浪费空间。计算hash值后,怎么才能保证table元素分布均与呢?我们会想到取模,但是由于取模的消耗较大,HashMap是这样处理的:调用indexFor方法。 HashMap源码中有一个indexFor方法,返回的是key的hashcode跟初始容量-1做与运算。首先length为2的整数次幂的话,h&(length-1)就相当于对length取模,这样便保证了散列的均匀,同时也提升了效率;其次,length为2的整数次幂的话,为偶数。这样length-1为奇数,奇数的最后一位为1,这样便保证了h&(length-1)的最后一位为0,也可能为1(这取决于h的值),即与后的结果可能为偶数也可能是奇数。这样便可以保证散列的均匀性, 而如果length为奇数的话,很明显length-1为偶数,它的最后一位是0,这样h&(length-1)的最后一位肯定为0,即只能为偶数,这样任何hash值都只会被散列到数组的偶数下标位置上,这便浪费了近一半的空间。所以,length取2的整数次幂,是为了使不同hash值发生碰撞的概率较小,这样就能...
无精疯 发布于 1个月前 阅读 204

Hive什么情况下可以避免进行mapreduce?

  1.本地模式下,hive可以简单的读取目录路径下的数据,然后输出格式化后的数据到控制台。比如有本地员工表employee,当执行 select * from employee时直接将文件中数据格式化输出。   2.查询语句中的过滤条件只是分区字段的情况下不会进行mapreduce。
无精疯 发布于 50分钟前

28. 字符串的排列(代码)

  题目:输入一个字符串,打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a、b、c所能排列出来的所有字符串abc、acb、bac、cab和cba。   思路:分两步。1.先求出所有可能出现在第一个位置的字符,然后用第一个字符和后面所有字符交换。2.固定第一个字符,让第二个字符和它后面所有的字符交换,以此类推。 #include<iostream> #include<cstdio> using namespace std; void Permutation(char* pStr, char* pBegin) { if (*pBegin == '\0') { cout << pStr << endl; //只有一个字符时直接输出 } else { for (char* pCh = pBegin; *pCh != '\0'; pCh++) { char temp = *pCh; *pCh = *pBegin; *pBegin = temp; Permutation(pStr, pBegin + 1); temp = *pCh; *pCh = *pBegin; *pBegin = temp; } } } void Permutation(char* pStr) { if (pStr == NULL) { return; } Permutation(pStr, pStr); } int main() { char ch[] = "abc"; Permutation(ch); }  ...
无精疯 发布于 2小时前 阅读 2

Android工程模块化平台设计-讲稿

这篇文章是我在 2018【[携程技术沙龙移动技术专场](https://mp.weixin.qq.com/s/B3eWQmgUZYFeGPs4DWo8gw)】技术分享时所讲内容的文字版本,修改删减了演讲时的冗余言语。 发布在【[开源中国博客](https://my.oschina.net/kymjs)】,希望能给买不到票参加大会的朋友带来帮助。 ![Android 模块化](https://kymjs.com/qiniu/images/blog_image/napos-modular.001.jpeg) 大家好,今天跟大家分享的主题是《Android工程模块化平台的设计》 ![Android 模块化](https://kymjs.com/qiniu/images/blog_image/napos-modular.002.jpeg) 首先自我介绍一下:我叫张涛,目前就职于饿了么移动技术部。可能有些朋友认识我,我之前也会在我博客【[开源实验室](https://kymjs.com)】写一些Android相关的技术点,如果对今天讲的模块化设计,你觉得有什么问题或者可以深入探讨的,也欢迎加我微信`kymjs123`详聊。 ![Android 模块化](https://kymjs.com/qiniu/images/blog_image/napos-modular.003.jpeg) 今天我们讲的主题是基于项目模块化来说的,模块化是什么大家肯定都是知道了的,这里问一下大家,有多少人在此之前有做过模块化的,举个手我看一下;了解过听说过模块化的呢?这次比较多。 我们...
kymjs张涛 发布于 3小时前 阅读 3

25. 二叉树中和为某一值的路径

  题目:输入一棵二叉树和一个整数,打印出二叉树中结点值为的和为输入整数的所有路径。从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。   思路:按照前序遍历的顺序遍历二叉树。将每次遍历的结点保存,然后遍历到叶结点的时候进行计算,计算完之后符合就输出,不符合就返回上一级同时删除叶结点,继续遍历。            10          5    12     从10开始遍历,10,5,4,不符合,删除4返回5。10,5,7符合,输出。删除7,返回        4   7         5,删除5,返回10。10,12符合输出。可以看出符合栈结构。   #include<iostream> #include<cstdio> #include<stack> #include<vector> using namespace std; struct BinaryTreeNode { int m_nValue; BinaryTreeNode* m_pLeft; BinaryTreeNode* m_pRight; }; BinaryTreeNode* CreateNode(int value) { BinaryTreeNode* TreeNode = new BinaryTreeNode(); TreeNode->m_nValue = value; TreeNode->m_pLeft = NULL; TreeNode->m_pRight = NULL; return TreeNode; } void ConnectTreeNodes(BinaryTreeN...
无精疯 发布于 4小时前 阅读 3

解决华为手机乱跳高德位置服务需要电话权限的方法

打开设置,应用管理,更多,显示系统进程,高德位置服务,权限,授权电话权限。
yx91490 发布于 5小时前 阅读 5

24. 二叉搜索树的后序遍历序列

  题目:输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则返回true,否则返回false。假设输入的数组的任意两个数字都互不相同。   思路:因为是二叉搜索树,所以每个根结点的左子树结点都比根结点小,右子树比根结点大。   例如输入{5,7,6,9,11,10,8},后序遍历肯定是根结点最后遍历的,所以8为根结点,然后因为5,7,6比8小,所以在8的左边,9,11,10在右边。以此类推这个数组符合。   例如输入{7,4,6,5},5为根节点,因为7大于5,所以没有左子树,但4又小于5,矛盾,所以不符合。 #include<iostream> #include<cstdio> #include<deque> using namespace std; bool VerifyBst(int sequence[], int length) { if (sequence == NULL || length <= 0) { return false; } int root = sequence[length-1]; //在二叉搜索树中左子树结点小于根结点 int i = 0; for (; i < length - 1; i++) { if (sequence[i] > root) { break; } } //右子树大于根结点 int j = i; for (; j < length - 1; j++) { if (sequence[j] < roo...
无精疯 发布于 6小时前 阅读 3

ToolBar的使用

1. 布局中引入ToolBar ``` ``` 2. 将该toolBar设置为actionBar,然后再设置title,subtitle和navigationIcon,这些东西也可以直接在布局中进行设置 ``` private void initActionBar() { toolbar = findViewById(R.id.activity_toolBar); setSupportActionBar(toolbar); setTitle("ToolBar例子"); //这里我们设置了一个SVG矢量图为 navigationIcon,只支持5.0以上的机器使用 if(Build.VERSION.SDK_INT > Build.VERSION_CODES.LOLLIPOP) { toolbar.setNavigationIcon(R.drawable.back_icon_white_24dp); } toolbar.setSubtitle("奔跑吧,兄弟"); } ``` 3. 常见到的回调 ``` //会显示在ToolBar的上面 //会显示在ToolBar的上面 ``` ``` // 生成菜单的方法 有的菜单选项会显示在ToolBar上,有的同伙popwindow显示出来 @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.nav_menu,menu); return true; } // 点击menu的item 回调事件 @Override public boolean onMenuItemClick(MenuItem menuItem) { switch (menuItem.getItemId()) { case R.id.first_menu: Toast.makeText(getApplicationContext(),"firstMenu clicked",Toast.LENGT...
折痕丶 发布于 13小时前 阅读 4

为何不使用Derby作为元数据库?

1.每次只能有一个内嵌的Derby数据块可以访问数据文件,这就意味着一次只能为metastore打开一次hive会话。   2.使用Derby时,在不同的目录下开始hive会有不同的元数据库。   Hive会为每个数据库创建一个目录。数据库中的表将会以这个数据库目录的字目录形式存储。有一个例外就是default数据库中的表,因为这个数据库本身就没有自己的记录。   用户可以通过以下方式修改目录的存放位置   hive> CREATE DATABASE financials       > LOCATION '/my/preferred.directory';  
无精疯 发布于 20小时前 阅读 3

Hive元数据库是用来做什么的,存储哪些信息?

  本质上只是用来存储hive中有哪些数据库,哪些表,表的模式,目录,分区,索引以及命名空间。为数据库创建的目录一般在hive数据仓库目录下。
无精疯 发布于 21小时前 阅读 3

cordova安装方法

安装cordova之前需要先安装node.js和npm   然后在命令行运行:npm install -g cordova即可安装到最新版本的cordova 如果要安装指定版本,命令为:npm install -g cordova@6.5.0(最后+@+版本号,此命令意思为安装6.5.0版的cordova)
canneljls 发布于 21小时前 阅读 1

chrome inspect出现白屏的解决方案

点inspect后 弹出框,可是里面一片白色 PS:原效果不是这样,只是图找不到随便p的   原因可以看这个:http://www.cnblogs.com/slmk/p/7591126.html 大概意思是用一次设备首次调试需要从google主页下载些东西,可是google被墙,因此卡住了   在此提供其中一个解决方法:翻墙 翻墙用lantern,这是他的github主页https://github.com/getlantern/forum,可以下载最新版本
canneljls 发布于 21小时前 阅读 1

cordova应用使用手机调试

对于cordova应用的调试,最方便调试方式还是作为h5应用在浏览器来调试,调试好了再打包cordova应用和打包apk。然而h5应用时的效果跟最终在安卓手机运行还有少数情况会不一样,因此,也需要有能在手机调试的方案   首先,打开vue1的以下文件,修改一下,添加调试常用的debugger和console.log   把vue1的打包配置修改一下,让打包后的js文件尽量保留原样以方便调试时看 修改webpack的生产环境(prod)配置文件 注释掉以下内容 PS:注释掉的UglifyJsPlugin用于js打包、压缩、混淆   PS:上述修改在调试后要改回来   然后使用build打包(跟一般打包一样)   PS:注意,此次打包输出的js文件名称的随机数不会改变,但实际上文件内容是变了。原因可能是开发的js文件内容没变   后面的操作就跟平时一样,最后插上手机开始调试   手机调试开始后,打开chrome浏览器(只能chrome,其他ie什么都不行),点开f12调试,然后在此进入远程设备调试工具 最左边找到调试的手机,中间是该设备运行着的程序,最后点右边的inspect开始调试 成功后看到如下界面,就可以开始调试了 PS:此处有可能是一个白屏,本博客有解决方式 可以看到可以用debugger打断点,变量值也能看 console.log输...
canneljls 发布于 21小时前 阅读 1

开发原生安卓cordova插件(有原生界面)

上文开发的插件没有调用原生界面,本文介绍开发带有activity的插件   本文很多操作与上文重复,重复部分会省略   首先打开plug1,先开发插件的原生代码   在以下命名空间创建一个activity 名称为Act1Activity   添加成功后,修改此文件 内容如下: package com.cesc.ewater.cordovaPlugin;   import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.widget.TextView;   import com.cesc.ewater.plug1.R;   public class Act1Activity extends AppCompatActivity {     @Override     protected void onCreate(Bundle savedInstanceState) {         super.onCreate(savedInstanceState);         setContentView(R.layout.activity_act1);           //以下实现获取打开此Activity时传进来的参数值(参数的key是thisText),并显示到一个TextView         TextView txt = (TextView) this.findViewById(R.id.txtInput);         txt.setText(this.getIntent().getStringExtra("thisText"));     } }   再修改他的layout,文件在此 内容如下: <?xml version="1.0" encoding="...
canneljls 发布于 21小时前 阅读 1

开发原生安卓cordova插件(基础)

cordova应用如果需要调用原生安卓接口,方法是使用cordova插件,cordova官方提供了主流原生功能的插件,但如果还不能满足需求,也可以自己开发cordova插件   以下介绍开发一个最简单的插件,功能是调用原生的toast弹出信息   首先先用as创建新工程,用于编写插件的代码 PS:开发cordova插件其中一个坑是没有一个好的编写代码环境,甚至插件的所有类文件都要手动添加到配置文件,这点后面会有体验   项目名叫plug1,包(package)名要倒着写 默认添加empry activity 配置完成后等待一段时间,待进度条消失后,build一下,没报错就说明成功   建名为org.apache.cordova的包,步骤如下:   回到capp1,可以看到有org.apache.cordova包,把此包下所有文件,拷到上一步新建的包,目的是让plug1拥有cordova的类(使得可以开发cordova插件)   拷后效果图 用于开发cordova插件时编码的plug1项目到此建立完成,后续如果还有多个插件开发都可以重用此项目 此项目不是必须的(因为最终编译不在此),理论上可以用记事本来编码   然后开始插件的编码,首先新建包com.cesc.ewater.cordovaPlugin   新建类ToastPlugin,此类内容在下面有提供,可以直接拷进去 package com.cesc.e...
canneljls 发布于 21小时前 阅读 2

使用cordova把h5应用打包成apk

由于h5应用开发不是本例重点,因此直接提供一个最简单的h5应用代码,此应用使用vue-cli框架开发   此h5应用叫vue1,用webstrom打开vue1,进行npm install安装引用 vue1代码可从百度网盘下载:链接: https://pan.baidu.com/s/1eSq71IU 密码: 1spk   PS:此套代码npm install时会报错 可以运行以下命令解决: npm install chromedriver --chromedriver_cdnurl=http://cdn.npm.taobao.org/dist/chromedriver   然后run dev测试开发环境 看到> Listening at http://localhost:9000说明成功,然后在浏览器访问http://localhost:9000 看到这样子说明,这样vue程序是正常的,然后准备用cordova打包成apk   首先打包vue应用 打包输出的文件,dist文件夹下都是   然后重新回到capp1,capp1有www目录 再打开一个webstrom(此webstrom命名为www),打开的目录就是这个www文件夹 PS:以下还会打开多个webstrom和as,以防搞混每个都有单独命名,注意不要搞错   打开后,首先把www已有的文件除了index.html都删掉 删完后的样子   把vue1打包的文件,除了index.html文件外,都拷到www文件夹下 拷完后效果   然后打开index.html,进行几项修改   首先在head部分添加引用个css文件(...
canneljls 发布于 21小时前 阅读 3

hive分桶?

  桶是更细力度的划分,把表划分为桶的理由: 1.取样更高效。具体划分桶是按值进行hash,然后除以桶的个数取余,任何一个桶内都是一个随机划分的用户集合。在处理大规模数据集时,在开发和修改查询的阶段,如果能在数据集的一小部分数据上试运行查询,会带来很多方便。 2.获得更高的查询处理效率。桶为表加上了额外的结构,Hive在处理有些查询时能利用这个结构。具体而言,连接两个在(包含连接列的)相同列上划分了桶的表,可以使用Map端连接(Map-side join)高效的实现。处理左边表的某个桶的mapper就知道右边表内相匹配的行在对应的桶,这样mapper直接就可以在对应的右边表的桶获取数据进行join。并不一定要求两个表必须有相同的桶个数,倍数关系也可以。   具体划分桶是将值进行hash,然后除以桶的个数取余。
无精疯 发布于 21小时前 阅读 4

新建cordova应用

使用命令行(本例命令行均使用as或webstrom的命令行),在任意目录输入以下命令新建cordova应用 cordova create capp1 com.cesc.ewater.capp1 其中capp1是应用名(项目名),com.cesc.ewater.capp1是包名   创建后可见如下目录   命令行进入capp1的目录,执行命令给capp1添加安卓平台 PS:cordova支持安卓、ios等移动开发平台 完成后目录会多了   然后打开Android Studio(以下简称as),打开以下目录 PS:此android目录是刚才添加安卓平台时新建的,android目录下是一套原生安卓代码,因此能用as打开   as打开后,由于as不确定较大,因为配置,开发环境的不确定性可能会造成很多问题,在此也无法一一说明,以下只针对我遇到的问题说明   打开以下文件 分别在以下两处添加maven {url 'http://maven.aliyun.com/nexus/content/groups/public/'} PS:截图是添加后效果 PS:repositories节点代表加载依赖的远程库,由于mavenCentral(maven中央库)和jcenter等国外库通常都连不上,因此需要添加国内阿里的maven镜像,这点跟做java的maven配置类似   打开以下文件 修改成以下样子:distributionUrl=https\://services.gradle.org/distributions/gradle-2.14.1-all.zip PS...
canneljls 发布于 21小时前 阅读 1

新建cordova应用,插件开发教程系列(总目录)

以下几篇是连续的教程,代码也是连续的,包括如下章节: 新建cordova应用 https://my.oschina.net/u/1251858/blog/1799002 使用cordova把h5应用打包成apk https://my.oschina.net/u/1251858/blog/1799004 开发原生安卓cordova插件(基础) https://my.oschina.net/u/1251858/blog/1799006 开发原生安卓cordova插件(有原生界面)  https://my.oschina.net/u/1251858/blog/1799007 cordova应用使用手机调试 https://my.oschina.net/u/1251858/blog/1799009   本教程需要先安装如下软件: Android Studio node.js和npm cordova   然后要配置环境变量 JAVA_HOME,例:   ANDROID_HOME,例: ANDROID_HOME目录文件参考     path变量还要添加以下路径(都是ANDROID_HOME下面的路径)(注意是追加内容,而不是替换原来的):%ANDROID_HOME%/platform-tools;%ANDROID_HOME%/tools;...
canneljls 发布于 21小时前 阅读 1

微聊 仿微信聊天android app 开源

仿微信聊天android app s工程是php 聊天server代码 WeTalk工程是 仿微信聊天android app db.sql 是mysql数据库,php使用的     源码 https://gitee.com/simawei/wechat
styleman 发布于 21小时前 阅读 3

Hive中复杂数据类型的使用好处与坏处

  好处:由于复杂数据类型的存储数据比基本数据类型要多,在存盘上存储可以连续存储,在查询等操作时可以减少磁盘IO。   坏处:复杂数据类型可能会存在着数据的重复,而且有更大的导致数据不一致的风险。
无精疯 发布于 21小时前 阅读 3

Shell入门看我吧

shell入门的文章,对shell不太熟悉小伙伴可以看看
aron1992 发布于 3周前 阅读 2502 评论 6 点赞 9

Flutter 初尝:从 Java 无缝过渡

# 准备阶段 ## 下载 Flutter SDK 新建 Flutter 文件夹,克隆 Flutter SDK: ```bash git clone -b beta https://github.com/flutter/flutter.git ``` ## 配置 Flutter 环境 我是 Mac 系统,Flutter SDK 下载完后的路径:Users/wuxiaolong/Flutter/flutter/ 。 ### 在命令行下,进入用户目录 ```bash cd $HOME ``` ### 打开.bash_profile文件 执行命令打开文件: ```bash open -e .bash_profile ``` 打开文件后,添加 Flutter SDK 安装的路径: ```bash export PATH=${PATH}:/Users/wuxiaolong/Flutter/flutter/bin:$PATH ``` ### 更新刚配置的环境变量 ```bash source .bash_profile ``` ### 验证 终端直接输入 flutter,没有提示该命令找不到,则配置成功。 ## flutter doctor 命令行输入`flutter doctor`,安装 Futter 剩余依赖项。 ## 安装 Flutter 和 Dart 插件 启动 Android Studio,搜索 Flutter 插件并单击 install,系统提示您安装 Dart 插件,点击 Yes 安装即可。 **提示**:安装 Dart 插件可能会提示下载失败,多试几次。 ## 第一个项目 Android Studio - File - New - New Flutter Project,等待创建成功后,运行效果如下: ![](http://7q5c2h.com1.z0.glb.clou...
吴小龙同學 发布于 1个月前 阅读 3302 评论 11 点赞 3

微信团队原创分享:iOS版微信的内存监控系统技术实践

微信自15年年底上线FOOM上报,每天FOOM次数与登录用户数比例接近3%,同期crash率1%不到。而16年年初某东老大反馈微信频繁闪退,接着16年8月不少外部用户反馈微信启动不久后闪退,分析大量日志还是不能找到FOOM原因。微信急需一个有效的内存监控工具来发现问题。
JackJiang- 发布于 2个月前 阅读 2908 评论 2 点赞 4

腾讯技术分享:社交网络图片的带宽压缩技术演进之路

为了进一步降低运营带宽成本,减小用户访问流量及提升页面加载速度,社交网络 CDN运维紧跟行业图片优化趋势,创新引入WebP、SharpP、自适应分辨率、Guetzli等图像压缩技术到现网,经过三年多的多部门联合攻关,已逐渐形成一套覆盖全图片类型(JPEG、JPG、PNG、WebP、GIF)多场景的图片压缩运营体系,适用于各类型终端,每年节约外网带宽几百G。
JackJiang- 发布于 3个月前 阅读 4177 评论 7 点赞 6

App框架实现———dagger2

该框架的组成 MVP+Dagger2+RxJava+Retrofit+OkHttp+RxCache+单元测试(Junit+Mockito)
jiahongfei 发布于 4个月前 阅读 1010 评论 2

Kotlin Primer·第七章·协程库(上篇)

本篇只讲了协程库的使用。还有中篇讲协程的启动和切换实现原理,下篇核心讲解kotlin协程在JVM层的实现原理。 这可能是至今为止最详细实用的 Kotlin 协程库详解了。
kymjs张涛 发布于 5个月前 阅读 1501

Android计步模块优化(今日步数)

最近在项目中研究计步模块,主要功能记录当天步数,类似微信运动,支付宝计步,咕咚今日步数。 [本篇文章简书地址](http://www.jianshu.com/p/cfc2a200e46d)
jiahongfei 发布于 6个月前 阅读 1205 评论 5 点赞 2

React前后端同构防止重复渲染

首先解释React前后端同构、React首屏渲染的概念。然后通过这2个概念解决服务端渲染完成后浏览器端重复渲染的问题。
随风溜达的向日葵 发布于 8个月前 阅读 1820 评论 2 点赞 2

kotlin协程简单封装,助你一臂之力

简述 经过两天的学习历程,看遍了国内的经典博客,也看完了官方的文档。下面推荐大家阅读 好的文章: 开始使用Kotlin协程 官方: kotlinx.coroutines 如果英文够好,推荐看官网的,例子比较全面。 本项目源码地址 计划 学习过后,为了更进一步,特地封装一些常用API,以便其他新手学习使用。接下来将完成下面一个个计划功能 1.  顺序执行 task1,task2 2. 并发执行 task1,task2 3. 等待执行 task2 需等待 task1执行完毕后执行 4. 延迟执行 task1 需要10秒之后执行 5. 心跳执行 异步任务按指定间隔执行 Task  6. 任务执行感知生命周期,可以跟随当前activity的生命周期结束而自动结束,并可以配置是否在重新打开activity时是否要重新执行 7. 任务执行可选主线程还是子线程 8. 任务执行可以选择 需要网络或者不需要网络 9. 任务执行可以选择网络制式4G 或者wifi下执行(5.0以上特性) 10.任务可以选择在充电时执行(5.0以上特性) 11. 任务执行可以随时取消,可以取消所有当前任务 目前框架已经做到前7项计划,后续将逐渐完善。 代码演示 1. 顺序执行代码 代码 效果 顺序执行效果图 2. 并发执行 并且分别延迟1秒,3秒 代码 效果 并发效果图 3. 等待执行 代码 效果 等待效果...
zb1500427248653 发布于 8个月前 阅读 1661 点赞 1

浅谈Hybrid

Android web开发入门篇
Android小闹 发布于 9个月前 阅读 2211 评论 4 点赞 6

Android 桌面加载图标过程分析

### 桌面应用图标流程 #### 前言 本人工作上碰到这么一个需求,开发一款滤镜引擎,将桌面上所有的图标进行统一的滤镜化,这就需要了解一下整个桌面去取图标的过程,了解了整个过程,找到真正拿图标的地方,在真正取图标的地方将图片进行替换,或者滤镜化,之前分析情况,现在整理下,与大家分享。**本文所用的代码,是基于Android 5.1** #### 桌面组件介绍 ![一级页面](https://static.oschina.net/uploads/img/201707/25114347_zV1r.png "一级页面") - 一级菜单 - **WorkSpace**:他是一个ViewGroup,要想在桌面上显示东西,就得往这个ViewGroup里添加自己的View - **BubbleTextView**:他是一个TextView,上方是图标,下方是名称,在桌面上的图标都是由这个类表示 - **FolderIcon**:他也是一个ViewGroup,用来表示桌面上的文件夹图标,里面添加了缩略处理过的bitmap,他的背景图片就是文件夹的形状 - **HotSeat**: 他是个FrameLayout,是桌面下方的固定快捷区,包含了几个常用的图标,中间的AllApp按钮是固定位置,也是一个TextView ![抽屉桌面](https://static.oschina.net/uploads/img/201707/25114317_XbLg.png "抽屉桌面") - 抽屉页面 组件 - **PagedView**:他是一...
蔡小鹏 发布于 9个月前 阅读 1781 评论 8 点赞 4

关于线程,还有这些是你需要知道的!

在日常开发中,线程常常被用作为提升程序效率的重要手段。在CoorChice的这篇文章中,CoorChice介绍了线程的基本运作。
CoorChice 发布于 10个月前 阅读 4467 评论 26 点赞 18

你知道Thread线程是如何运作的吗?

我们在Android开发过程中,几乎都离不开线程。但是你对线程的了解有多少呢?它完美运&#...
CoorChice 发布于 10个月前 阅读 4850 评论 26 点赞 17

使用MediaCodec和RTMP做直播推流

本项目完全开源 项目Github地址:[AndroidInstantVideo](https://github.com/ChillingVan/AndroidInstantVideo) 码云地址:[AndroidInstantVideo](http://git.oschina.net/ChillingVan/AndroidInstantVideo) 目前开源的项目或市面上的Android直播客户端主要是用ffmpeg来实现推流的。本文将介绍使用Android原生的视频编码类MediaCodec实现直播推流。 ### 数据流及大致原理 这里所说的直播,就是将你的客户端产生的视频数据,实时发送到服务器上。服务器上的数据再实时地发送到播放客户端上。 * 以视频数据为例: **获取Camera画面** 首先是摄像头拍摄得到原始画面数据,这里原始画面数据的格式我们不用管,因为我们使用的是MediaCodec,所以我们会使用 camera.setPreviewTexture(surfaceTexture) 来利用Camera获取到的画面。 此处的原理可忽略,大致说明的话,就是Camera会把获得的画面保存为OpenGL的一个纹理,我们使用这个纹理就能使用Camera的画面。 **绘制画面** 在获得画面之后,我们要把这个画面(纹理)“画”到MediaCodec上。 如何画? MediaCodec提供一张’白纸’,也就是一个Surface,供我们把纹理画到上面。此处的API是 MediaCodec.createInputSurface() 怎么画?...
量子 发布于 10个月前 阅读 2608 评论 25 点赞 5

OC对象之旅 weak弱引用实现分析

# Runtime学习 -- `weak`应用源码学习 >   Runtime源码分析,带你了解OC实现过程。其中参考了大量的大神的代码以及文献,里面也有个人的见解,欢迎拍砖,欢迎交流。 ## 两种常见使用场景 ```Objective-C /// weak属性 @interface XX : XX @property(nonatomic,weak) Type* weakPtr; @end /// 代码块中使用 { /// 使用__weak __weak Type* weakPtr = [[SomeObject alloc] init]; } ``` 根据调试信息,发现两者的区别是: - 第一种进入到 `id objc_storeWeak(id *location, id newObj)方法` ``` /** * This function stores a new value into a __weak variable. It would * be used anywhere a __weak variable is the target of an assignment. * * @param location The address of the weak pointer itself * @param newObj The new object this weak ptr should now point to * * @return \e newObj */ id objc_storeWeak(id *location, id newObj) { return storeWeak (location, (objc_object *)newObj); } ``` - 第二种绕一个远路,先初始化 `id objc_initWeak(id *location, id newObj)` ``` Objective-C /** * Initialize a fresh weak pointer to some object l...
瞎折腾 发布于 10个月前 阅读 854

用两张图告诉你,为什么你的App会卡顿?

![Cover](http://upload-images.jianshu.io/upload_images/1869462-e45f4cf10981b323.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) # 有什么料? 从这篇文章中你能获得这些料: - 知道setContentView()之后发生了什么? - 知道Android究竟是如何在屏幕上显示我们期望的画面的? - 对Android的视图架构有整体把握。 - 学会从根源处分析画面卡顿的原因。 - 掌握如何编写一个流畅的App的技巧。 - 从源码中学习Android的细想。 - 收获两张自制图,帮助你理解Android的视图架构。 ![link](http://upload-images.jianshu.io/upload_images/1869462-59ab533d5276864e.JPG?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) # 从setContentView()说起 ``` public class AnalyzeViewFrameworkActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_analyze_view_framwork); } } ``` 上面这段代码想必Androider们大都已经不能再熟悉的更多了。但是你知道这样写了之后发生什么了吗?这个布局到底被添加到哪了?我的天,知识点来了! 可能很多同学也知...
CoorChice 发布于 11个月前 阅读 6760 评论 44 点赞 26 打赏 1

Android 的滑动分析以及各种实现

一、滑动效果的产生     滑动一个View,本质区别就是移动一个View。改变当前View所在的坐标,原理和动画相似不断改变坐标位置实现。实现View的滑动就必须监听滑动的事件,并且根据事件传入的坐标,动态且不断改变View的坐标,从而实现View跟随用户触摸的滑动而滑动。 (1)、Android的坐标系         Android中将屏幕最左上角的顶点作为Android坐标系的原点,从这个点向右是X轴正方向,从这个点向下是Y轴正方向,如下图:          系统提供了getLocationOnScreen(int location[])这样的方法来获取Android坐标系中点的位置,即该视图左上角在Android坐标系中的坐标。在触控事件中使用getRawX()、getRawY()方法所获得的坐标同样是Android坐标系中的坐标。  (2)、视图坐标系     Android中除了上面所说的这种坐标系之外,还有一个视图坐标系,它描述了子视图在父视图中的位置关系。这两种坐标系并不矛盾也不复杂,他们的作用是相互相成的。与Android坐标系类似,视图坐标系同样是以原点向右为X轴正方向,以原点向下为Y轴正方向,只不过在视图坐标系中,原点不再是Android坐标系中的屏幕最左上角,而是以父视图左上角为坐标原点,如下图:     在触控...
MrXI 发布于 1年前 阅读 1819 评论 7 点赞 3

Android基础夯实--你了解Handler有多少?

万丈高楼平地起,学习任何东西我们都离不开扎实的基础知识。本编文章通过对Handler相关知识的全面回顾,给Android开发者重新夯实基础。
Ryane 发布于 1年前 阅读 2074 评论 8 点赞 2

Service Worker:让网页无网络也能访问

想要开发一个 PWA(Progressive Web App)应用,你必须知道首先知道,Service Worker 是什么,他是怎么工作的。
kymjs张涛 发布于 1年前 阅读 2849 评论 7 点赞 2

UICollectionView详解

标准的UICollectionView包含三个部分,它们都是UIView的子类: Cells 用于展示内容的主体,对于不同的cell可以指定不同尺寸和不同的内容,这个稍后再说 Supplementary Views 追加视图 如果你对UITableView比较熟悉的话,可以理解为每个Section的Header或者Footer,用来标记每个section的view Decoration Views 装饰视图 这是每个section的背景 UICollectionViewDataSource(与数据相关) section的数量 -numberOfSectionsInCollection: 某个section里有多少个item -collectionView: numberOfItemsInSection: 对于某个位置应该显示什么样的cell -collectionView: cellForItemAtIndexPath: Supplementary View的方法(section头部视图,section尾部视图) collectionView: viewForSupplementaryElementOfKind: atIndexPath: UICollectionViewDelegate(与数据无关) 关于用户交互,UICollectionView也做了改进。每个cell现在有独立的高亮事件和选中事件的delegate,用户点击cell的时候,现在会按照以下流程向delegate进行询问: -collectionView:shouldHighlightItemAtIndexPath: 是否应该高亮? -collectionView:didHighlightItemAtIndexPath: 如果1返回结果为是,那么高亮 -c...
业界小白 发布于 1年前 阅读 1254 评论 1 点赞 1
顶部