自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(52)
  • 资源 (1)
  • 收藏
  • 关注

原创 [Unity] 关于 ComputeShader中ThreadGroup和numthreads的理解

今天遇到一个神奇的现象,我设置了一个100 * 100的 texture,然后使用 ComputeShader 让它填充一些颜色,结果却有一个黑边。代码如下所示:_renderTexture = new RenderTexture(100, 100, 24); _renderTexture.enableRandomWrite = true;_renderTexture.Create(); shader.Dispatch(0, _renderTexture.width

2021-05-06 23:43:43 1389 10

原创 [IOS Metal]使用METAL自定义CIFilter导致vertex function找不到的问题

通常使用 CIFilter 可以对图像做一些处理,如果有些效果我们不满意,我们需要自己去实现的话,是可以通过写 metal 来自定义 CIFilter,和 fragment shader 类似,处理对象都是一个像素点。如何使用 metal shader 自定义 CIFilter 网上的教程有很多,我这里还是赘述一下。第一步:创建一个.metal文件,定义 filter。记住自己的方法名,后面需要用到。第二步:继承 CIFilter 定义出一个子类,通过加载 default.metallib 找到对应的

2021-04-22 15:12:45 362 1

原创 [IOS] 自定义View绘制UIImage出现锯齿如何解决

我需要制作一个快速更新 UIImage 的功能,一开始使用 UIImageView 来显示图片,所以需要频繁的调用 UIImageView.image = newImage 方法来更新图片。代码看起来像这样。func onSomethingChanged() { myUIImageView.image = newImage}这样更新图片非常的卡顿,操作和画面响应有一定的滞后,体验不好,因此考虑自己做一个 UIView 来绘制图片,看看是否可以解决。于是自己自定义了一个 View,继承 UI

2021-03-31 11:29:56 543

原创 [IOS] 如何快速的将数组每个元素设置成0?

常规做法当然是遍历。var arr = [1, 2, 3, ...]for i in arr.indices { arr[i] = 0}常规做法没有问题,但是有时候太慢了,我们需要更快的方法。幸运的是,IOS 提供了 vDSP 框架。可以在里面找到 Vector Clear and Fill Functions 好家伙,这不就是我们所需要的吗?func vDSP_vfilli(UnsafePointer<Int32>, UnsafeMutablePointer<Int

2021-03-23 18:07:20 416

原创 [IOS] 监听音量变化、监听音量按键及隐藏系统音量UI

监听音量变化似乎并没有一种正式的方式可以监听并覆盖掉系统音量按钮的行为。我们可以使用的是一个对系统音量变化的事件监听。只需要按如下代码添加上监听即可。func someInit() { NotificationCenter.default.addObserver(self, selector: #selector(onVolumnChanged), name: Notification.Name(rawValue: "AVSystemController_SystemVolum

2021-03-12 20:54:25 828

原创 [IOS] 为什么 UIPanGestureRecognizer 不起作用?

如果你设置的 UIPanGestureRecognizer 不起作用,可能是因为 UIPanGestureRecognizer 初始化方式不对。如下面代码所示,如果你在成员变量里面初始化,并且指定 target 为 self,这会导致 onPan 方法无法被调用。class YourView: UIView { var uiPan = UIPanGestureRecognizer(target: self, action: #selector(onPan)) init() {

2021-02-05 09:51:42 530 1

原创 [IOS Metal] 运行错误 IOAF code 怎么办?

当 Shader 有错误的时候,Xcode 的输出窗口会在每一帧都输出 IOAF code 之类的错误, 表示一个数字,比如 IOAF code 4、IOAF code 11 等等。此时 Xcode 没有给出其他的任何信息,导致我们无法去定位问题。解决的办法也很简单,点击 Edit Scheme,在 Diagnostics 子tab中,最底下有一个 Shader Validation,将其勾选上。重新运行即可。我遇到这个问题的时候是 IOAF code 4。勾选上 Shader Validation

2021-02-02 10:39:44 913 1

原创 Kotlin协程教程(3):操控协程

在之前的文章中,已经讲了如何启动协程、协程的作用域是如何组织和工作的以及各种协程构造器(builder)的特性。本篇将讲解对协程的各种操作,包括挂起、取消、超时、切换上下文等。挂起fun main() { runBlocking(Dispatchers.Default) { for (i in 0 .. 10) { println("aaaa...

2019-08-29 19:59:38 265

原创 Kotlin协程教程(2):协程作用域与各种builder们

作用域与上下文协程作用域本质是一个接口,既然是一个接口,那么它就可以被某个类去实现(implement),实现它的那个类,也就具备了一些能力。class MyClass: CoroutineScope { // MyClass就具备了CoroutineScope的一些能力}那么它具备了哪些能力呢?当然是启动协程的能力和停止协程的能力。除了runBlocking有一些特殊外,la...

2019-08-29 19:57:17 513

原创 Kotlin协程教程(1):启动

协程协程简单的来说,就是用户态的线程。emmm,还是不明白对吧,那想象一个这样的场景,如果在一个单核的机器上有两个线程需要执行,因为一次只能执行一个线程里面的代码,那么就会出现线程切换的情况,一会需要执行一下线程A,一会需要执行一下线程B,线程切换会带来一些开销。假设两个线程,交替执行,如下图所示线程会因为Thread.sleep方法而进入阻塞状态(就是什么也不会执行),这样多浪费资源啊...

2019-08-27 20:53:16 499

原创 volatile的作用及正确的使用模式

volatile先从基础的知识说起吧,这样也有个来龙去脉。我们都知道,程序运行后,程序的数据都会被从磁盘加载到内存里面(主存)而当局部的指令被执行的时候,内存中的数据会被加载到更加靠近CPU的各级缓存,以及寄存器中。当一个多线程程序执行在一个多核心的机器上时,就会出现真正的并行情况,每个线程都独立的运行在一个CPU上,每个CPU都有属于自己独立的周边缓存。那么此时,一个变量被两个线程...

2019-08-24 14:46:26 263

原创 多线程编程:wait, notify, join, yield都有啥用?

多线程在开发知识中是一个很重要的部分,然而实际生产中却很少遇到真正需要自己去处理多线程编程里的那些复杂细节和问题,因为很多时候,都有一套“架构”或者一些“框架”帮大部分业务程序员隐藏了多线程的细节,大多时候只需要简单的实现各种业务逻辑即可。今天来理一理wait, notify, join, yield这四个方法的作用。这4个方法,其中wait, notify都是Object的方法,join是T...

2019-08-10 14:10:26 319

原创 线程有哪些状态?每个状态是什么意思?又是如何切换的?

线程大家都有在使用,但是有时候也仅仅是使用,对它的一些行为还不是特别的了解,今天就来和大家谈谈线程的状态这个内容。首先线程有哪些状态呢?这个问题,我们可以从Java的源代码中找到的答案,先简单粗暴,直接贴上代码,看看线程的状态有哪些:看完了,大家也知道了,线程有6个状态。这6个状态分别是:New, Runnable, Blocked, Waiting, Timed_Waiting, Te...

2019-08-06 00:46:35 5482 1

原创 坑!IDEA如何将依赖的模块导入Jar包

如果想将依赖的库在导出jar的时候也可以用到,那么直接从右边的【Available Elements】中拖到左边是没用的。对着右边的东西点右键,有两个菜单1【Put into Output Root】2【Extract into Output Root】从右往左拖,其实是就执行了【1】。然并卵。你需要执行的是【2】执行【2】之后,你就会发现左边都是有个Extracted xxxxx,这...

2019-04-25 23:30:49 1860

原创 坑!人民币符号¥为什么有时候一根横线,有时候两根横线?

在开发过程中遇到了这个问题,界面上需要显示一个人民币符号¥,但别的同事开发的界面,总是显示两根横线,而我开发的界面,有些机器上是两根,有些机器上是一根。emmmm…然后我仔细观察了一下,发现,同事和我用的是两个不一样的字符。¥ FFE5¥A5虽然看起来很相似,但这是两个不一样的字符。一个是全角(fullwidth),另一个是半角(halfwidth)。>¥<>...

2019-04-25 23:29:56 13608

原创 SparseArray:解析与实现

介绍Android提供了SparseArray,这也是一种KV形式的数据结构,提供了类似于Map的功能。但是实现方法却和HashMap不一样。它与Map相比,可以说是各有千秋。优点占用内存空间小,没有额外的Entry对象没有Auto-Boxing缺点不支持任意类型的Key,只支持数字类型(int,long)数据条数特别多的时候,效率会低于HashMap,因为它是基于二分查找去找...

2019-01-17 01:26:33 400

原创 WeakReference, SoftReference, ReferenceQueue学习与实验

Java中有四种引用类型,分别是Strong, Soft, Weak, PhantomStrong ref:强引用,被引用的对象在gc的时候不会被回收。我们先来理解一下这句话是什么意思。先上一小段代码int num = 100;Object ref = new Object();上面两行代码,第一行声明了一个整型变量,它是放在程序栈上的。它是放在程序栈上的。这又是啥意思呢?我们...

2018-11-29 23:16:58 880

原创 快速排序

思路快速排序将数组A通过原地交换的方法将数组分成两个区域,一个区域的所有元素都小于等于p,另一个区域所有元素都大于等于p。然后再递归的处理这两个区域。如上图所示:1.选取6作为基准,将小于等于6的数都移动到它的左侧,大于等于6的都移动它的右侧。那么6的index就固定了,它不会在变了。2.对左边的子部分,做同样的操作,选取一个数作为基准。同样对右的子部分也做一样的处理。3.重复上面的操...

2018-11-25 19:40:25 215

原创 插入排序:思路与实现

插入排序的思想插入排序算法是一个比较简单好理解的算法。直接的例子就是玩扑克的时候,想象一下,分牌的时候,大家轮流的从一组牌中抽取最上面的一张,然后将它以某种顺序插入到我们的左手中。比如,我们想要从小到大排列我们的扑克牌。那么第一次,抽到了2,我们的左手还没有任何牌,直接放到左手上。左手:[2]第二次,我们抽到了9,由于已经存在2了,因此,我们将9放在2的右边。左手:[2, 9]第三...

2018-11-12 23:46:40 858

原创 一些常用的算法操作,方法与技巧

找列表的中点可以使用快慢指针,一个指针步进1,另一个指针步进2。可用于数组或者链表。对于数组[1, 2, 3, 4]i1 = 0; // 每次步进1i2 = 0; // 每次步进2// 第一次i1 = 1;i2 = 2;if (i2 &amp;amp;gt;= arr.length - 1) // 检查i2是否到达尾部,或者超过尾部// 第二次i1 = 2;i2 = 4;if (i...

2018-11-11 17:22:45 848

原创 反编译apk的步骤

1.先要获取目标应用安装包(.apk)文件1.1. 在rom中找1.2. 通过adb pull从/system/app/目录找搞出来1.3. 在网上搜,看看有没有xxx.apk的下载2.反编译apk工具与准备2.1. 需要/system/framework/里面的东西,直接adb pull出来2.2. 需要7za (这里面有个oat2dex附件里面有这个 http://forum.xd...

2018-11-10 10:53:09 552

原创 RecycleView中自定义View,宽度如何match parent

官方文档教我们,用RecyclerView的时候,创建View要这样。@Overridepublic BaseViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View v = null; v = LayoutInflater.from(parent.getContext()).inflate(R.layout....

2018-11-09 21:57:09 611

原创 Java小细节:List可以add(null)吗?

在写代码的时候,有时候遇到for循环,写到下面的时候有一点犹豫。List&lt;Data&gt; dataList = ...;for (Data d : dataList) { if (d != null) { // 我需要这个判断吗? // ... }}遍历的时候,是否需要对每个元素判空?换句话说,List是否可以允许add null。然后我实验了一...

2018-11-09 21:55:26 18826

原创 堆排序:思路与实现

学习了一下堆排序的思想,分享一下我的理解。首先介绍一些概念。堆(heap),最大堆(max heap),最小堆(min heap)堆是一种特别的树状结构,普通的树结构,没有对子节点也特别的规定,但堆是一颗完全的树,除了最底层,上面的每一层都是满的。如果一个堆中所有的节点,它有用子节点的话,并且这个节点大于它的子节点,那么这个堆就是最大堆。如果一个堆中所有的节点,它有用子节点的话,并且这个...

2018-11-09 21:46:08 287

原创 Android中线程间通信原理分析:Looper,MessageQueue,Handler

自问自答的两个问题在我们去讨论Handler,Looper,MessageQueue的关系之前,我们需要先问两个问题:1.这一套东西搞出来是为了解决什么问题呢?2.如果让我们来解决这个问题该怎么做?以上者两个问题,是我最近总结出来的,在我们学习了解一个新的技术之前,最好是先能回答这两个问题,这样你才能对你正在学习的东西有更深刻的认识。第一个问题:google的程序员们搞出这一套东西是为了解决什么问题

2016-03-16 12:52:26 890 1

原创 计算机中的数与数据

在现实生活中,我们会用纸和笔来记录数据,比如在之前智能手机还没有普及的年代,还有相当一部分人适用小本本来记录电话号码,显然电话号码作为一种数据,记录在纸上。那么在计算中是如何记录数据,表达信息的呢?计算机使用一序列的位(bit)来记录数据,一个位中存储着一个二进制数字,什么是二进制呢?二进制简单来说就是逢二进位的一种进制,人类最常用,最直观的一直使用着十进制,可用的

2016-02-27 00:08:53 2196

原创 贝塞尔曲线的实现

前言贝塞尔曲线(Bezier Curve)是一种与n个点相关的平滑曲线,其中贝塞尔曲线会经过第一个点和最后一个点。在Adobe Photoshop中,可以使用钢笔工具来创建贝塞尔曲线。上个动图来表现下: 个人觉得这个玩意挺有意思,就自己在Android上实现了一下,我实现的效果如下图所示: 原理原理什么的,我认为这张图足以诠释一切。图片来自wiki百科。 找到动图中所

2015-10-28 23:55:08 2093

原创 LZW编码的学习与实现

Preface看了一天,感觉终于搞明白了一点(代码终于写对了),编码过程大四的时候学过一点点,按部就班的按照步骤来做就行了,解码过程貌似课堂上老师没讲,自己看wiki上的讲解和example搞懂了。LZW全称Lempel–Ziv–Welch,就是这个三个人搞出来的。LZW的工作思路,考虑一段数据,abcabcabc,对于这样的一段数据,如果不做任何处理和压缩,假设每个字符用一个字节来表

2015-10-20 20:21:03 27029 22

原创 进制及其转换

为什么计算机使用二进制计算机是用二进制作为指令、数据存储的。之所以使用二进制,是因为构造计算机的电子元器件能比较方便的模拟1和0两个信号。比如我们要存储一个数字,我们称它为number,用十进制表示为521(五百二十一),而用二进制表示为1000001001,如果此时需要你来设计一个东西,来存储这些数据,应该怎么做呢?对于十进制的数,521,因为每一位上可能出现的数字是0-9十个不同的符号,那么我们

2015-08-30 20:26:31 1482

原创 给四条线段,判断是否是矩形

今天又做了一个题目,这个感觉比昨天的复杂一些,代码量都多了一些。题目是这样的,要求输入一系列点坐标,一共输入16个整型,两个两个一对,就是8个坐标,再两个两个一对,就是4条线段,判断这4条线段,是否围成一个矩形。想了下,大概分为如下几个步骤来做: 1. 获取输入,组织数据结构,怎么存储这些点,这些线段。 2. 然后就是怎么判断矩形。怎么判断矩形?我又分为下面几个步骤来考虑: 1. 先判断四条线

2015-06-11 20:25:00 3630

原创 Trie树

tags:算法今天在hiro上做了一个题目,要求输入一个字符串,在一个词典中找到以这个字符串开头的字符串有多少个。比如,词典里有abc,ab,adf三个单词,那么以a开头的单词有3个,以ab开头的单词有2个,以ad开头的单词有1个,以abcdefg开头的单词有0个。 就是这样一个规则。题目中还提示了一个Trie树的概念,然后我去学习了Trie树是长啥样的,搞明白了之后就用C++来写这个题目,C++

2015-06-09 15:21:42 493

原创 Android动画原理分析

最近在Android上做了一些动画效果,网上查了一些资料,有各种各样的使用方式,于是乘热打铁,想具体分析一下动画是如何实现的,Animation, Animator都有哪些区别等等。首先说Animation(android.view.animation.Animation)对象。无论是用纯java代码构建Animation对象,还是通过xml文件定义Animation,其实最终的结果都是

2015-05-31 10:17:07 1434 2

原创 实现LinearLayout(垂直布局,Gravity内容排布)

首先上Gravity的代码,Android原版的Gravity搞得挺复杂的,太高端了。但基本思路是使用位运算来做常量,我就自己消化了一些,按自己的思路来实现。先上代码,在做分析。 1 package kross.android.widget; 2 3 /** 4 * 重力属性,控制容器内子控件的排布方式 5 * @author kross(krossford@fo

2015-05-31 10:17:02 3645

原创 Android UI测量、布局、绘制过程探究

在上一篇博客《Android中Activity启动过程探究》中,已经从ActivityThread.main()开始,一路摸索到ViewRootImpl.performTraversals()了。本篇就来探究UI的绘制过程。 performTraversals()方法非常长,其中关键性的三个步骤是依次调用了performMeasure(), performLayout(), perform

2015-05-31 10:16:59 642

原创 Android中Activity启动过程探究

首先追溯到Activity的启动,随便启动一个自己写的demo项目,使用DDMS进行debug标记,然后在Debug中把主线程暂停,可以看到调用栈。如下图所示:于是我们先看android.app.ActivityThread的main()方法。android.app.ActivityThread.main()main()方法中对一个Looper对象进行初始化,形成一个消息循环,那么

2015-05-31 10:16:57 616 1

原创 实现Java中的ArrayList

最近深受轮子哥影响,觉得造一些轮子应该会对自己的技术功底有一定的帮助,就决定先从简单的容器开始实现。废话不多说,就先实现一个Java中的ArrayList。ArrayList是我们在Java中使用非常多的一个类,它是顺序表的数组实现,LinkedList是顺序表的链式实现(自己编的名字,懂就好哈),还有个Vector,它与ArrayList比较像,区别是它是线程安全的。顺序表应该都有相同的

2015-05-31 10:16:54 482

原创 Thread的start和run的区别

最近看到一个题目,代码如下: public static void main(String args[]) { Thread t = new Thread() { public void run() { pong(); } };

2014-03-27 18:57:04 654

原创 Android事件分派机制

最近一直在学习Android里面的事件分派机制,感觉很奇妙,看了很多博客和分析,才在脑子里形成了一个模糊的概念,对事件分派有了一定的认识。于是,我画了一个图来简单明了的表述Android中事件的分派机制:看了这个图,说起来就简单了。假设一个视图结构如左上角所示,最外面的父控件是一个ViewGroup A,内一层是ViewGroup B,最最里面的控件是View C。 当用户

2014-03-27 18:56:58 432

原创 Android自定义XML属性以及遇到的命名空间的问题

转载请注明出处:http://www.cnblogs.com/kross/p/3458068.html 最近在做一些UI,很蠢很蠢的重复写了很多代码,比如一个自定义的UI Tab,由一个ImageView和一个TextView构成,如果不自定义属性的话,就需要单独new出几个Tab,然后分别给它们设置Drawable和Text。如果能使用XML属性的话,就直接在XML文件中就可以给Tab设

2014-03-27 18:56:56 578 1

原创 使用线程实现视图平滑滚动

最近一直想做下拉刷新的效果,琢磨了好久,才走到通过onTouch方法把整个视图往下拉的步骤,接下来就是能拉下来,松开手要能滑回去啊。网上看了好久,没有找到详细的下拉刷新的例子,只有自己慢慢琢磨了。昨天和今天,研究了两天,下拉之后回滚回去的效果终于今天做出来了!开心。现在来分享下我的实现方法和一些心得体会吧。我看了网上一个大神的例子,发现是在onTouch里面使用View的scrollTo(in

2014-03-27 18:56:52 1279

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除