自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(28)
  • 收藏
  • 关注

原创 相机预览使用帧缓存对象(FBO)

在原先的相机应用中对相机预览处理是通过 OPENGL 直接读取 OES Texture 数据进行滤镜和显示,这样做的缺点是效率低, 由于 OES Texture 是外部纹理,直接读取的话会增加了GPU取数据的时间,若进行一些运算密集的算法例如高斯滤波,每次都会到外部纹理取数据,这样则会造成明显的卡顿; 解决办法是利用帧缓存把外部纹理渲染到关联的二维纹理,再对二维纹理进行处理,这样显示的效率才会高

2017-10-12 09:55:31 1433 2

原创 opengles 纹理对象&纹理单元

在使用纹理的时候,有个疑问就是这些方法为什么就可以创建纹理并使用它们,这里来探讨下; 下面来看看一般使用二维纹理的步骤:// 生成纹理int[] textureHandle = new int[1];GLES20.glGenTextures(1, textureHandle, 0);int TextureID = textureHandle[0];GLES20.glBindTexture(G

2017-08-17 09:51:11 2082

原创 Camera app 分析(四)预览与滤镜

Camera 预览有多种方式,如: 第一种方案 :SurfaceView + SurfaceHolder; 第二种方案 :GlSurfaceView + SurfaceTexture; 第三种方案 :TextureView + SurfaceTexture;这3种显示的方法对比可以参考以下对比: http://blog.csdn.net/jinzhuojun/article/detai

2017-08-09 09:46:26 658

原创 android 渲染机制简介

android 的渲染机制由以下部分组成: app (应用层绘制到缓存区) SurfaceFlinger (把缓存区数据渲染到屏幕) SharedClient (匿名共享内存)其中 SurfaceFlinger 服务运行在Android系统的System进程中,它负责管理Android系统的帧缓冲区(Frame Buffer),Android应用程序为了能够将自己的UI绘制在系统的帧缓冲区上,

2017-07-20 21:36:50 558

原创 自定义 view 一 (measure)

想要画出自定义的 view 必须先计算出它的宽高,宽高确定后才能进行后续的步骤,measure 分为 viewgroup 和 view 的 measure, viewgroup 其实也是继承于 view, 相比于 view ,它多了测量子 view 的步骤;首先我们需要知道 MeasureSpec 这个东西是干嘛的,它保存了两个数据,measureMode 和 measureSizemeasureM

2017-07-20 11:19:20 251

原创 多进程导致 Application 多次执行的问题研究

在项目中我们有时会用到多进程,需要在 AndroidManifest 里进行声明 : <activity android:name=".RemoteActivity" android:process=":remote"/>启动这个 Activity 后,你的应用就有了两个进程,这时就有问题了,Application 类的生命周期也调用了两

2017-07-13 16:55:49 1273

原创 okHttp3 线程池

先来做一个简单的网络请求Request request = new Request.Builder() .url("http://www.baidu.com") .build(); client.newCall(request).enqueue(new Callback() { @Override

2017-07-01 13:58:01 8723

原创 java 线程间的状态转换

线程间的状态转换: 新建(new):新创建了一个线程对象。可运行(runnable):线程对象创建后,其他线程(比如main线程)调用了该对象的start()方法。该状态的线程位于可运行线程池中,等待被线程调度选中,获取cpu 的使用权 。运行(running):可运行状态(runnable)的线程获得了cpu 时间片(timeslice) ,执行程序代码。阻塞(block):阻塞状态是指线

2017-06-30 21:50:50 181

原创 java 动态代理

之前写过静态代理 代理模式 ,现在来说说动态代理,传统的静态代理模式需要为每一个需要代理的类写一个代理类,如果需要代理的类有几百个就需要写几百个代理类,为了更优雅地实现代理模式,JDK提供了动态代理方式,可以简单理解为JVM可以在运行时帮我们动态生成一系列的代理类,这样我们就不需要手写每一个静态的代理类了。同样,我们需要先定义一个接口public interface IBuyHouse { a

2017-06-29 21:58:23 173

原创 理解AtomicBoolean

在多线程并发的环境下,我们假如有一个初始化的操作,如果处理不当会造成初始化多次,如:private static class WorkerThread implements Runnable { private static boolean initialized = false; public void run() { if (!initialized) {

2017-06-25 22:47:38 343

转载 Java中Volatile关键字详解

Java中Volatile关键字详解 阅读目录 一、基本概念 二、Volatile原理 一、基本概念 先补充一下概念:Java 内存模型中的可见性、原子性和有序性。可见性:  可见性是一种复杂的属性,因为可见性中的错误总是会违背我们的直觉。通常,我们无法确保执行读操作的线程能适时地看到其他线程写入的值,有时甚至是根本不可能的事情。为了确保多个线程之间对内存写入操作的可见性,必须使用同步机制

2017-06-25 11:57:45 362

原创 多线程情况下单例的写法

静态内部类public class Singleton { private Singleton() {} private static class SingletonInstance { private static final Singleton INSTANCE = new Singleton(); } public static Singleton g

2017-06-25 11:53:17 249

原创 Camera app 分析(三)拍照流程

拍照过程: 首先来看下拍照按键的点击按钮事件:ShutterButton.java protected void drawableStateChanged() { super.drawableStateChanged(); final boolean pressed = isPressed(); if (pressed != mOldPress

2017-06-23 14:56:16 726

原创 Camera app 分析(二)打开相机和预览过程

预览相机必须要开启相机,来看下这个开启的流程;PhotoModule.java // 在 PhotoModule 初始化的时候开启打开相机线程 public void init(CameraActivity activity, View parent) { if (mOpenCameraThread == null) { mOpenCameraT

2017-06-23 09:57:41 1192

原创 Camera app 分析(一)

由于参与了 Camera 项目的开发工作,所以需要对原项目代码需要有个详细的了解,在这里先从app的入口做一个整体的分析,让日后的新需求的添加和bug修复有一个比较好的基础。在这里以高通修改的Camera app (SnapdragonCamera ) 做为研究的对象 。研究一款应用应该从这款应用的 AndroidManifest.xml文件开始,以下简略了部分代码: <application

2017-06-16 18:20:37 1630

原创 opengles着色语言中的限定符

在顶点着色器和片元着色器中我们都要使用的着色器语言,我们先来看下常用的限定符:attribute :仅仅可以在顶点着色器中被访问。attribute 是在随着每一个顶点不同而会发生变动的输入值,例如顶点的位置和纹理坐标等。数据中有多少个顶点,管线就调用多少次顶点着色器,每次将顶点的各个属性数据传递给顶点着色器中对应的 attribute 变量;因此,顶点着色器每次执行将完成对一个顶点各项属性数据的处

2017-06-13 23:48:31 357

原创 opengles的渲染管线

了解渲染管线的流程对我们学习opengles是有帮助的,下面一起来看看GPU到底是怎么渲染图像的吧; 为了提高渲染的效率,省去绘制每一帧图像时顶点数据的IO麻烦,我们可以把基本数据不变的顶点在初始化阶段将顶点数据经过基本处理后送入顶点缓冲对象。在顶点着色器是一个可编程的处理单元,功能为执行顶点的变换、光照、材质的应用与计算等顶点的相关操作。图元装配主要有两个任务:一个是图元组装,另一个是图元处理

2017-06-10 23:57:49 581

原创 opengles(五) 纹理映射

为了获取更加真实、酷炫的3d物体,就需要用到纹理映射,就相当在前面我们画的形状前再贴一张皮肤上去,下面来看下怎么实现。首先我们需要知道一张纹理图也是有自己的坐标, 二维纹理的坐标分为 S 轴和 T 轴,左上角坐标为(0, 0)点,最大为1个单位长度,所以长度的取值范围为 0 到 1,在这里说明下,不管纹理的长宽大小如何,它的取值范围都是从 0 到 1,所以假如纹理的高为255,宽为128,他们的取值

2017-06-08 10:53:00 403

原创 Android触摸事件传递机制

自定义view时经常会碰见触摸事件传递方面的问题,所以需要清楚里面的机制才能处理好相关的问题。Android里一次完整的事件传递主要有三个阶段,分别是分发(dispatch)、拦截(intercept)和消费;其中activity里有:dispatchTouchEvent 和 onTouchEvent; viewGroup里有:dispatchTouchEvent、onInterceptTouch

2017-06-04 14:13:18 229

原创 opengles(四)让图像动起来

之前画的三角型是无法与用户交互的,为了使交互过程变得更好玩,我们需要监听触摸事件,让图像跟随我们的触摸一起动起来。首先,我们需要重写触摸事件 onTouchEvent ,并且我们想在触摸发生变化时才进行渲染,所以设置渲染模式为 RENDERMODE_WHEN_DIRTY ,在 onTouchEvent 调用 requestRender 来渲染。private final float TOUCH_SC

2017-05-29 11:10:21 644

原创 返回结果的HTTP状态码

返回状态码第一位为响应类别,后两位无分类 200 表示从客户端发来的请求在服务器被正常处理了;204 表示从客户端发来的请求在服务器被正常处理了,但在返回的响应报文中不含实体的主体部分;一般是在只需要客户端往服务器端发送消息,而对客户端不需要发送新信息内容的情况下使用;206 表示客户端进行了范围请求,而服务器成功执行了这部分的 GET请求;301 永久重定向,表明请求的资源被分配了新的URI,

2017-05-26 22:12:18 210

原创 HTTP报文内的HTTP信息

报文的定义:用于HTTP协议的信息被称为HTTP报文;报文由报文首部和报文主体构成,中间由 CR+LF(回车+换行) 分割开来; 由于报文的传输可以通过编码提升传输效率,所以需要了解下报文(message)与实体(entity)的区别 可以看出在一般情况下报文主体和实体主体是一致的,但在传输中进行编码操作时,实体主体的内容发生变化,才导致它和报文主体产生差异。在发送一些较大的内容时,我们可以对报

2017-05-23 22:07:38 331

原创 opengles(二)画个三角型

首先我们需要知道opengles在屏幕上的坐标,即中间坐标点是x=0,y=0; x轴往右是正,往左是负,y轴往上是正,往下是负,且x, y的范围都是-1到1;所以我们先定义坐标数组,顺序是逆时针方向:private static final float[] TRIANGLE_VERTEX_COORD = {0, 0.5f, -0.5f, -0.5f,

2017-05-21 16:24:15 360

原创 简单的http协议

HTTP是一种不保存状态,即无状态协议。所以如果你想要记录用户登录状态,你必须保存用户的状态,Cookies就是用来管理状态的,它在请求和响应报文中写入Cookie信息来控制客户端的状态,过程如下:客户端发送HTTP请求;服务器生成Cookie并在响应中添加Cookie(在报文内有一个叫做Set-Cookie的首部字段信息)后返回;客户端保存Cookie;客户端在请求中添加Cookie后发送

2017-05-19 23:11:29 396

原创 代理模式

代理模式在代码也会经常要用到,形象的比喻下代理模式,就像你要买房,由于你不熟悉当地的房产,所以需要找房产中介帮你忙,在这里你就相当于是委托对象,房产中介相当于代理类帮你去做你想要做的事。使用场景:当无法或者不想直接访问某个对象时可以通过一个代理对象来间接访问。我们看下代码方面是如何实现的,首先我们需要定义一个接口,这个接口由委托类和代理类一起实现;接口:public interface IBuyHo

2017-05-18 10:32:25 171

原创 opengles(一) hello world

由于项目的要求,需要用到opengles,所以记录下学习心得,在这里先写个opengles 2.0 for android 的 hello world 吧。在android中需要使用GlSurfaceView来显示opengles,所以我们先继承GlSurfaceView来创建一个MyGlSurfaceView。public class MyGlSurfaceView extends GLSurfa

2017-05-17 23:21:25 467

原创 Activity的启动流程

很多做应用的开发者其实并不了解Activity的启动流程,但经常面试的时候面试官又喜欢问一些framework层相关的问题,并且在实际开发中可以帮你定位问题的原因,所以在这里就学习下Activity启动流程吧。 这里结合网上的资料和自己的理解画了一幅图: 从图中大概的看出分为4个部分:Launcher(或者是其它进程的activity), AMS(ActivityManagerServi

2017-05-17 16:41:53 478

原创 了解Web及网络基础

在面试中经常会问一些关于TCP/IP和HTTP/HTTPS相关的问题,在工作中虽然可以用okhttp之类的库,但是必须要有基础才能把库的实现了解清楚,才能更好的处理网络问题。所以在这系列的博文中记录下学习的内容。网络通信是需要一个统一的规则的,这样才可以在不同硬件、操作系统之间通信,这个规则称为协议。**各种协议集合统称为TCP/IP**。TCP/IP协议族里重要的一点就是分层,可以分为4层:应用

2017-05-16 21:13:52 240

空空如也

空空如也

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

TA关注的人

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