
Android
文章平均质量分 84
jklwan
这个作者很懒,什么都没留下…
展开
-
Android Studio Chipmunk 发布
Android Studio Chipmunk(花栗鼠) 发布原创 2022-05-10 12:18:01 · 2900 阅读 · 0 评论 -
androidx中ViewPager导致的死循环绘制问题
目录简介查找原因onStop和onDestroy回调延时的原因在处理什么消息?WindowInsets总结简介最近项目升级到了androidx,突然出现了一些问题,Activity的onStop和onDestroy变得很慢,基本都在十秒了,导致一些页面表现不正常,于是来着手来解决这个问题。查找原因onStop和onDestroy回调延时的原因先看下onStop和onDestroy回调延时的原因,找到一篇文章写得很好:深入分析Android中Activity的onStop和onDestroy()回调原创 2022-01-29 18:00:00 · 1252 阅读 · 0 评论 -
Android Studio 4.1正式版发布
文章目录简介DesignMaterial Design Components updatesDevelopDatabase Inspector直接在Android Studio中运行Android模拟器Dagger Navigation SupportUse TensorFlow Lite modelsBuild & TestAndroid Emulator - Foldable Hinge Support更新Apply ChangesExport C/C++ dependencies from A原创 2020-10-15 18:56:41 · 30016 阅读 · 8 评论 -
Android Studio 4.0正式版发布
文章目录简介实例化使用实例化绘制矩形使用实例化数组小行星带简介本章对应文档如果我们想要绘制许多相同的物体,只是他们的位置或大小不同,按照之前学习的知识,正常的做法是构建一个变化矩阵数组,通过for循环进行循环绘制,当我们绘制的物体数量逐渐增加时会发现设备越来越卡。如果我们能够将数据一次性发送给GPU,然后使用一个绘制函数让OpenGL利用这些数据绘制多个物体,就会更方便了。这就是实例化(Instancing)。实例化实例化只能在OpenGL ES 3.0之后才能使用,实例化会使用到这些方法gl原创 2020-05-30 09:57:34 · 18550 阅读 · 2 评论 -
学习OpenGL ES for Android(二十五)— 实例化
文章目录简介实例化使用实例化绘制矩形使用实例化数组小行星带简介本章对应文档如果我们想要绘制许多相同的物体,只是他们的位置或大小不同,按照之前学习的知识,正常的做法是构建一个变化矩阵数组,通过for循环进行循环绘制,当我们绘制的物体数量逐渐增加时会发现设备越来越卡。如果我们能够将数据一次性发送给GPU,然后使用一个绘制函数让OpenGL利用这些数据绘制多个物体,就会更方便了。这就是实例化(In...原创 2020-03-11 15:53:27 · 718 阅读 · 0 评论 -
学习OpenGL ES for Android(二十四)— 几何着色器
文章目录简介在本章之前还有两章:高级数据和高级GLSL,都是比较理论的知识,有兴趣的话可以自己学习。简介几何着色器(Geometry Shader)是一个可选功能,他介于在顶点和片段着色器之间,接收一组顶点数据,可以对数据进行处理,而且可以根据数据生成不止一个图形,假如你想绘制四个顶点,按照以前的方式,需要for循环四次,每次都顶点数据进行处理,最后传入顶点着色器中。而集合着色器就做了这样一...原创 2020-03-06 14:52:28 · 1372 阅读 · 0 评论 -
Android Studio 3.6 正式发布
经历众多的测试版本后,谷歌终于发布了Android Studio 3.6的正式版本,这是Project Marble结束之后的第一个版本,增加了一些小功能,完善了现有的功能,解决了功能上的问题,改善了性能。可以通过下载地址https://developer.android.com/studio#downloads下载,或者使用AS中的Help菜单下的Check for Updates进行应用内升级...原创 2020-02-26 18:02:48 · 3731 阅读 · 0 评论 -
学习OpenGL ES for Android(二十三)— 立方体贴图
我们前面学过纹理贴图,我们可以用6个2D纹理的纹理构建成立方体,而立方体贴图本身就是包含6个2D纹理的纹理,它优势在于可以通过一个方向向量来进行索引/采样。只要在立方体贴图的中心点,就能使用立方体的实际位置向量来对立方体贴图进行采样。创建立方体贴图与2D纹理区别不大,创建立方体贴图同样是创建纹理,只是我们的glBindTexture的方法的参数要变为GLES20.GL_TEXTURE_CU...原创 2020-01-16 20:40:59 · 1575 阅读 · 0 评论 -
学习OpenGL ES for Android(二十二)— 帧缓冲
我们学过的颜色缓冲,深度缓冲已经模板缓冲结合起来就叫帧缓冲。默认系统会定义一个帧缓冲(在移动端就是EGL创建的),而且我们还可以创建自定义的帧缓冲来替代系统创建的。大概的步骤如下:创建一个帧缓冲并绑定; 正常绘制我们的图像(此时绘制的图像会绘制到自定义的帧缓冲上); 重新绑定到系统帧缓冲上; 绘制我们自定义帧缓冲的内容(此时我们可以对帧缓冲的内容进行各种处理以此实现各种效果)。创建帧缓...原创 2020-01-14 20:24:55 · 1097 阅读 · 0 评论 -
学习OpenGL ES for Android(二十一)— 面剔除
首先我们绘制一个立方体,想象一下能看到几个面。一般情况下我们最多能看到三个面,极端的情况我们甚至只能看到一个面,这时候如果不绘制看不到的面,是不是非常节省资源,忽略掉看不到的面就叫面剔除。那么怎么判断一个面是否面向观察点呢,在OpenGL中用了这样一个技巧:分析顶点数据的环绕顺序(Winding Order)。环绕顺序绘制三角形时用到了三个顶点,这三个顶点的顺序就是我们提到的环绕顺序。三个...原创 2020-01-09 19:53:59 · 540 阅读 · 0 评论 -
学习OpenGL ES for Android(二十)— 混合
在之前使用物体时没考虑过透明的情况,而混合就是除了物体透明度的一种方式。在处理物体透明时一般有两种方式,一种是直接丢弃掉透明度达到一定程度的部分;另外一种就是混合。例如一扇窗户如果是全透明的我们看到的物体就是窗口后的物体;如果它是半透明的有色玻璃时,看到的就是玻璃和窗口后物体的叠加。之前我们使用纹理的颜色都是纹理的rgb颜色,没有用到最后一个alpha(也就是透明度),alpha的范围是0到1,1...原创 2020-01-08 16:46:08 · 793 阅读 · 0 评论 -
学习OpenGL ES for Android(十九)— 模板测试
模板测试的文档https://learnopengl-cn.github.io/04%20Advanced%20OpenGL/02%20Stencil%20testing/,和深度测试类似,它也会丢弃片段。启用模板测试的代码GLES20.glEnable(GLES20.GL_STENCIL_TEST);注意:在Android中,只使用这句是无法启用模板测试的,还需要使用下面代码配置GLS...原创 2020-01-07 17:21:45 · 621 阅读 · 0 评论 -
学习OpenGL ES for Android(十八)— 深度测试
从这章开始学习高级OpenGL的内容。关于深度测试的理论知识,请参考https://learnopengl-cn.github.io/04%20Advanced%20OpenGL/01%20Depth%20testing/文档详细阅读,感觉文档讲得已经非常清楚了,这里就不再复制一遍了。启用深度测试GLES20.glEnable(GLES20.GL_DEPTH_TEST);每次渲染时还...原创 2020-01-06 20:22:34 · 431 阅读 · 0 评论 -
学习OpenGL ES for Android(十七)— 模型纹理
模型加载最后的一课,就是使用贴图,不再使用纯色显示物体。纹理的信息也是和材料一样存放在mtl文件中,格式也是类似的,只是一些信息以map开头的,我们先下载https://free3d.com/3d-model/crocus-flower-v1--75899.html这个模型的文件,找到mtl文件,同样根据https://en.m.wikipedia.org/wiki/Wavefront_.obj_...原创 2020-01-05 22:08:19 · 442 阅读 · 0 评论 -
学习OpenGL ES for Android(十六)— 模型材料
上一章我们简单学习了.obj模型文件的读取和使用,这章我们学习材料文件(.mtl)的读取和使用,.mtl文件是和.obj文件息息相关的。材料文件可能定义一种或多种材料,我们找一个简单带材料的模型:https://free3d.com/3d-model/-x96-slider-doorblack-v1--87538.html,打开其中的mtl看下文件格式,同样我们参考https://en.m.wik...原创 2020-01-04 18:11:45 · 412 阅读 · 0 评论 -
学习OpenGL ES for Android(十五)— 模型结构
在之前的文章中都是我们使用代码绘制的图形图像,而如果我们想要使用别人设计的模型时就需要使用到模型加载。和桌面不同的是,Android上的模型加载库推荐使用jPCT-AE,官网http://www.jpct.net/jpct-ae/,可以直接下载并参考文档学习使用。当3D大师们使用Blender、3DS Max或者Maya等软件制作模型后,可以导出例如.blend,.x3d,.obj等等各种类型的文...原创 2020-01-03 18:02:41 · 533 阅读 · 0 评论 -
学习OpenGL ES for Android(十四)— 多光源
在学习过光照,材质,投光物之后,现在我们把这些效果结合起来。我们显示这样的效果:在阳光照射下,有几个点光源,同时有一个聚光灯,此时在不同位置的物体被光照的效果。要定义多个光源,那么就需要定义不同的结构体,同时我们分开来不同的光照计算,使代码更清晰,GLSL定义方法和C相似,不过需要先声明,然后再定义,如下void calc(); //声明一个函数void calc() //定...原创 2020-01-02 15:06:52 · 351 阅读 · 0 评论 -
学习OpenGL ES for Android(十三)— 投光物
在之前的章节学习的光源都是一个点,虽然效果不错,和现实世界的光源还有一定的差距。将光投射(Cast)到物体的光源叫做投光物(Light Caster),这里我们学习几种比较常见的光源:定向光(Directional Light),点光源(Point Light)还有聚光(Spotlight)。定向光当光源非常远时,来自光源的每条光线就会近似于互相平行,而且光源强度相同。当我们使用一个假设光...原创 2020-01-02 09:31:00 · 286 阅读 · 0 评论 -
学习OpenGL ES for Android(十二)— 光照贴图
在之前文章中,我们模拟了物体的独特的光照特效,但是在一个面上所有点的效果都是一样的,显然和现实情况还有差距。在现实世界中,大部分物体的表面都是有不同材质的,对光的反应也不相同。在光照场景中,通常有漫反射和镜面光贴图(Map)两种方式,来精确控制物体的漫反射分量和镜面光分量以模拟现实世界的物体。漫反射贴图现在我们使用纹理来代替前面的纯色实现立方体的面,然后显示光照的效果。我们使用下面这样一幅...原创 2019-12-28 17:31:45 · 321 阅读 · 0 评论 -
学习OpenGL ES for Android(十一)— 材质
现实世界的物体各种各样,不同物体会对光产生不同的反应。陶瓷,铁片之类的物体会比墙壁,木柜的反射更强。想要模拟现实世界的光照效果就要了解物体对光线的反应效果。在我们的着色器代码中,我们定义一个结构体:Material,来表示材质。在上一节中,我们指定了一个物体和光的颜色,以及结合环境光和镜面强度分量,来定义物体的视觉输出。当描述一个物体的时候,我们可以用这三个分量来定义一个材质颜色(Material...原创 2019-12-27 17:20:15 · 320 阅读 · 0 评论 -
学习OpenGL ES for Android(十)—冯氏光照
想要模拟真实世界的光照效果是比较困难的,我们使用一种叫做冯氏光照模型(Phong Lighting Model)的模型来实现近似的效果。冯氏光照模型的主要结构由3个分量组成:环境(Ambient)、漫反射(Diffuse)和镜面(Specular)光照。下面这张图展示了这些光照分量看起来的样子:环境光照(Ambient Lighting):即使在黑暗的情况下,世界上通常也仍然有一些光亮(月...原创 2019-12-23 21:27:46 · 274 阅读 · 0 评论 -
学习OpenGL ES for Android(九)—简单光照
从这篇开始学习光照相关的知识,可以先阅读文档https://learnopengl-cn.github.io/02%20Lighting/01%20Colors/,了解光照的相关概念。光照至少需要一个光源和一个物体才能显示出的效果,那么我们就需要定义光源和物体的顶点位置和颜色,参考我们实现立方体的文章添加立方体并设置颜色,设置光源的颜色是白色,设置物体本来的颜色是橘色,那么光源照射之后的颜色就...原创 2019-12-20 14:49:21 · 612 阅读 · 0 评论 -
学习OpenGL ES for Android(八)
纹理不但可以和颜色叠加,纹理和纹理也可以叠加。纹理叠加时需要设置透明度,我们看下公式mix (x,y, a):返回x和y的线形叠加。a的范围0-1,结果= x*(1-a) + y * a根据上篇文章的着色器代码,修改gl_FragColor为两个纹理的叠加 vertexShaderCode = "uniform mat4 uMVP...原创 2019-12-17 23:51:46 · 274 阅读 · 0 评论 -
学习OpenGL ES for Android(七)
上篇我们简单的学习了纹理的显示,这篇我们先把图片等比显示,然后使纹理和颜色叠加显示。如果图片是正方形,直接使用缩放或投影即可,但是如果非正方形则需要计算图片的宽高比,然后和显示的宽高比一起计算得到真正的缩放,计算公式:比例=显示宽/显示高/(图片宽/图片高)。随后设置观察点,计算 @Override public void onSurfaceChanged(GL10 gl,...原创 2019-12-16 17:01:36 · 332 阅读 · 0 评论 -
学习OpenGL ES for Android(六)
前几篇主要学习的点线面的绘制,变换和投影的实现,绘制的都是颜色,如果想要绘制图片的话就需要使用纹理。一些相关的方法如下glGenTextures( int n, int[] textures, int offset ):生成n个纹理的index。其中n是就是数量,数组来保存这些index,offset是偏移量。glBindTexture( int target, int texture ...原创 2019-12-14 00:03:07 · 315 阅读 · 0 评论 -
学习OpenGL ES for Android(五)
上篇我们学习了对平面的变换,这篇我们将要学习对立体图形的变换。立体图形也可以称为3D图形,立体图形是由平面图形组合而来的,我先看下一个立方体的结构一个立方体有8个顶点,6个面,可以用12个三角形组合而成。我们可以使用36个(或24个)顶点的数据和glDrawArrays的方式来绘制,但是这样照成了浪费,有许多顶点都是可以复用的,所以我们使用8个顶点的数据和glDrawElements的方式...原创 2019-12-12 20:17:26 · 376 阅读 · 0 评论 -
学习OpenGL ES for Android(四)
在学习图形变换之前,可以先参考文档https://learnopengl-cn.github.io/01%20Getting%20started/07%20Transformations/学习基本概念。我们之前的绘制的都是静态的图像,如果我们使用改变顶点坐标的方式来让图像变换起来是非常麻烦的,而且会消耗更多的处理时间和性能。我们可以使用一个或多个矩阵(Matrix)对象可以更好的变换(Transf...原创 2019-12-11 17:39:48 · 733 阅读 · 0 评论 -
学习OpenGL ES for Android(三)
上篇我们看到绘制点和线,在平面上,点和线组成了面,我们先看绘制三角形。glDrawArrays的mode参数除了点和线,还有三角,是这三个:GL_TRIANGLE,GL_TRIANGLE_STRIP和GL_TRIANGLE_FAN。他们的绘制规则如下图所示,GL_TRIANGLE:每三个顶点绘制为三角形,如果不足三个则不绘制,绘制的三角形个数是:顶点数/3GL_TRIANGLE_ST...原创 2019-12-10 17:17:37 · 815 阅读 · 0 评论 -
学习OpenGL ES for Android(二)
本章将学习OpenGL ES中点和线的绘制,在绘制之前需要先了解这些:坐标系统;着色器;GLSL(OpenGL ES Shading Language),OpenGL ES着色语言;坐标系统和android布局的坐标不同,OpenGL是一个右手坐标系。简单来说,就是正x轴在你的右手边,正y轴朝上,而正z轴是朝向后方的。想象你的屏幕处于三个轴的中心,则正z轴穿过你的屏幕朝向你。坐标系画起来如...原创 2019-12-09 19:21:54 · 1130 阅读 · 0 评论 -
学习OpenGL ES for Android(一)
OpenGL是用于渲染2D、3D矢量图形的跨语言、跨平台的应用程序编程接口(API),而在嵌入式和移动平台的版本是OpenGL ES。Android最初就支持OpenGL ES的1.0版本,到现在已经支持到最新的3.2版本,下面的支持变化图当然这个版本支持不是绝对的,还有看硬件是否支持,例如genymotion模拟器只有OpenGL ES 2.0版本,如果你使用了高版本的API会导致崩溃。...原创 2019-12-07 17:42:07 · 1418 阅读 · 1 评论 -
Android Studio添加自定义Template
在使用Android Studio的过程中,你会发现很多常用的快捷生成代码提示工具,例如在java代码中输入fori,按下Tab,就会自动生成一段for循环代码,非常方便。如下所示for (int i = 0; i <; i++) { }其实这就是Android Studio中自带的模板功能,还有很多,例如foreach(for each循环),fbc(f...原创 2019-11-03 22:47:28 · 930 阅读 · 0 评论 -
Android Studio tools attributes
1原创 2019-11-02 23:50:18 · 1690 阅读 · 0 评论 -
Android Fragments新功能
在刚刚过去Android Dev Summit 2019中,提到很多项目,如依旧大力推广的Kotlin,还有Jetpack Compose,CameraX,Room等新功能。其中也提到了android fragments,发布了androidx.fragment-1.2.0-rc01。fragment一直是开发中非常常用的工具,在以前的版本中由于生命周期的问题一直被诟病,虽然现在已经经过很多优...原创 2019-10-29 23:32:40 · 8344 阅读 · 0 评论 -
初探ViewBinding
视图访问的方式有常用的findViewById,ButterKnife等多种方式,这些方式的各方面对比如下如上图所示,在简明、编译安全和编译速度上都各有优势,那么有没有一种方式可以一石"三"鸟呢。谷歌在Android Studio 3.6 Canary 11版本中正式推出视图绑定(View Binding),来看下使用方法,首先需要使用AS 3.6 Canary 11之上的版本,这...原创 2019-10-27 16:40:04 · 16499 阅读 · 5 评论 -
实现RecyclerView侧滑菜单
RecyclerView默认可以使用ItemTouchHelper实现各种动作,但是如果需要实现类似qq的侧滑显示菜单的效果则需要自定义实现,主要实现方式就是自定义RecyclerView,重写dispatchTouchEvent,onTouchEvent事件。实现步骤,1.在dispatchTouchEvent中,ACTION_DOWN事件:(1)如果点击的不是已经打开的item则关...原创 2019-08-18 13:39:50 · 1110 阅读 · 0 评论 -
Android Studio 3.5新特性
在今天(美国时间8月20日)的早些时候,Android Studio(以下简称为AS) 3.5正式版终于发布了,从第一个bate版本发布到正式版本,历时三个半月。AS一直以来被开发者吐槽,因此谷歌也放慢了版本的变化,对测试版本进行大力度的优化,提高了稳定性。从3.3版本开始,谷歌启动了名为Project Marble的计划,意为谷歌团队致力于使集成开发环境(IDE)的基本功能和流程变得坚如磐石...原创 2019-08-21 23:34:04 · 14049 阅读 · 4 评论 -
Gradle5.1新增的配置选项
在Android Studio升级到3.4.0版本后,如果使用了Plugin3.4.0的版本则Gradle版本需要升级到5.1.1+,关于Plugin和Gradle版本的对应关系可以参考官方链接https://developer.android.com/studio/releases/gradle-plugin#updating-gradle在Gradle5.1之后,maven配置新增了两...原创 2019-08-12 23:38:18 · 2131 阅读 · 0 评论 -
使用Toast的注意项
在Android中Toast的使用频率是很高的,一是系统自带,二是使用方便,三是可以跨页面显示。但是在使用中还是需要注意一些情况,否则可能导致崩溃。在子线程中使用子线程中使用Toast是可以的,但是需要先调用Looper.prepare(),然后再show Toast。子线程Toast参考代码。new Thread() { @Override public voi...原创 2019-07-27 22:11:49 · 1143 阅读 · 0 评论 -
Android多语言设置
如果Android应用需要做本地化,都要用到多语言来适配,例如手机设置成英文后,App内文字变成英文。App提供资源可以参考官方文档https://developer.android.com/guide/topics/resources/providing-resources#AlternativeResources,App提供各种适配的资源,包括但不限定于:语言和区域,屏幕尺寸,屏幕像素密度...原创 2019-08-04 21:28:35 · 4193 阅读 · 0 评论 -
正确使用RecyclerView分割线
RecyclerView是很强大的控件,基本可以替代ListView和GridView。但是RecyclerView没有封装一些listview的功能,例如分割线,item点击事件等等,需要自己实现。item点击事件在ViewHolder中设置Click事件就行了。实现分割线功能,则需要使用addItemDecoration添加一个自定义的分割线。我使用的RecyclerView的版本是26....原创 2019-07-17 16:11:31 · 3081 阅读 · 0 评论