开发工具、设计工具、网站收集
原型设计工具(免费) http://www.mockupplus.com/download 注册地址:http://www.mockplus.cn/referral?r=rxjuhv 火狐开发者版本 https://www.mozilla.org/en-US/firefox/developer/
原型设计工具(免费) http://www.mockupplus.com/download 注册地址:http://www.mockplus.cn/referral?r=rxjuhv 火狐开发者版本 https://www.mozilla.org/en-US/firefox/developer/
Alias /aa/ “D:/PHP_WorkSpace/” <Directory “D:/PHP_WorkSpace/”> Options Indexes FollowSymLinks MultiViews AllowOverride all Order allow,deny Allow from all wamp自带的phpmyadmin的别名配置 Alias /phpmyadmin “E:/wamp/apps/phpmyadmin4.0.4/” # to give access to phpmyadmin from outside # replace the lines # Order Deny,Allow # Deny from all # Allow from 127.0.0.1 # by # Order Allow,Deny # Allow from all <Directory “E:/wamp/apps/phpmyadmin4.0.4/”> Options Indexes FollowSymLinks ExecCGI AllowOverride all Order Deny,Allow Deny from all Allow from 127.0.0.1 Allow from ::1 Allow from localhost ...
1. Volley简介 我们平时在开发Android应用的时候不可避免地都需要用到网络技术,而多数情况下应用程序都会使用HTTP协议来发送和接收网络数据。Android系统中主要提供了两种方式来进行HTTP通信,HttpURLConnection和HttpClient,几乎在任何项目的代码中我们都能看到这两个类的身影,使用率非常高。 不过HttpURLConnection和HttpClient的用法还是稍微有些复杂的,如果不进行适当封装的话,很容易就会写出不少重复代码。于是乎,一些Android网络通信框架也就应运而生,比如说AsyncHttpClient,它把HTTP所有的通信细节全部封装在了内部,我们只需要简单调用几行代码就可以完成通信操作了。再比如Universal-Image-Loader,它使得在界面上显示网络图片的操作变得极度简单,开发者不用关心如何从网络上获取图片,也不用关心开启线程、回收图片资源等细节,Universal-Image-Loader已经把一切都做好了。 Android开发团队也是意识到了有必要将HTTP的通信操作再进行简单化,于是在2013年Google I/O大会上推出了一个新的网络通信框架——Volley。Volley可是说是把AsyncHttpClient和Universal-Image-Loader的优点集于了一身,既可以像AsyncHttpClient一样非常简单地进行HTTP通信,也可以像Universal-Image-Loader一样轻松加载网络上的图片。除了简单易用之外,Volley在性能方面也进行了大幅度的调整,它的设计目标就是非常适合去进行数据量不大,但通信频繁的网络操作,而对于大数据量的网络操作,比如说下载文件等,Volley的表现就会非常糟糕。 下图所示的这些应用都是属于数据量不大,但网络通信频繁的,因此非常适合使用Volley。 2. 下载Volley 介绍了这么多理论的东西,下面我们就准备开始进行实战了,首先需要将Volley的jar包准备好,如果你的电脑上装有Git,可以使用如下命令下载Volley的源码: **[plain]** [view plain](http://blog.csdn.net/guolin_blog/article/details/17482095#)[copy](http://blog.csdn.net/guolin_blog/article/details/17482095#)[](https://code.csdn.net/snippets/284210)[](https://code.csdn.net/snippets/284210/fork) <div style="color: #000000;"> </div> </div> - <span style="color: black;">git clone https://android.googlesource.com/platform/frameworks/volley </span> 下载完成后将它导入到你的Eclipse工程里,然后再导出一个jar包就可以了。如果你的电脑上没有Git,那么也可以直接使用我导出好的jar包,下载地址是:http://www.kwstu.com/ResourcesView/kwstu_201441183330928 。 新建一个Android项目,将volley.jar文件复制到libs目录下,这样准备工作就算是做好了。 3. StringRequest的用法 前面已经说过,Volley的用法非常简单,那么我们就从最基本的HTTP通信开始学习吧,即发起一条HTTP请求,然后接收HTTP响应。首先需要获取到一个RequestQueue对象,可以调用如下方法获取到: **[java]** [view plain](http://blog.csdn.net/guolin_blog/article/details/17482095#)[copy](http://blog.csdn.net/guolin_blog/article/details/17482095#)[](https://code.csdn.net/snippets/284210)[](https://code.csdn.net/snippets/284210/fork) <div style="color: #000000;"> </div> </div> - <span style="color: black;">RequestQueue mQueue = Volley.newRequestQueue(context); </span> 注意这里拿到的RequestQueue是一个请求队列对象,它可以缓存所有的HTTP请求,然后按照一定的算法并发地发出这些请求。RequestQueue内部的设计就是非常合适高并发的,因此我们不必为每一次HTTP请求都创建一个RequestQueue对象,这是非常浪费资源的,基本上在每一个需要和网络交互的Activity中创建一个RequestQueue对象就足够了。 接下来为了要发出一条HTTP请求,我们还需要创建一个StringRequest对象,如下所示: **[java]** [view plain](http://blog.csdn.net/guolin_blog/article/details/17482095#)[copy](http://blog.csdn.net/guolin_blog/article/details/17482095#)[](https://code.csdn.net/snippets/284210)[](https://code.csdn.net/snippets/284210/fork) <div style="color: #000000;"> </div> </div> - <span style="color: black;">StringRequest stringRequest = <span class="keyword" style="font-weight: bold; color: #006699;">new</span> StringRequest(<span class="string" style="color: blue;">“http://www.baidu.com”</span>, </span> - <span class="keyword" style="font-weight: bold; color: #006699;">new</span> Response.Listener<String>() { - <span style="color: black;"> <span class="annotation" style="color: #646464;">@Override</span> </span> - <span class="keyword" style="font-weight: bold; color: #006699;">public</span> <span class="keyword" style="font-weight: bold; color: #006699;">void</span> onResponse(String response) { - <span style="color: black;"> Log.d(<span class="string" style="color: blue;">“TAG”</span>, response); </span> - } - <span style="color: black;"> }, <span class="keyword" style="font-weight: bold; color: #006699;">new</span> Response.ErrorListener() { </span> - <span class="annotation" style="color: #646464;">@Override</span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: #006699;">public</span> <span class="keyword" style="font-weight: bold; color: #006699;">void</span> onErrorResponse(VolleyError error) { </span> - Log.e(<span class="string" style="color: blue;">“TAG”</span>, error.getMessage(), error); - <span style="color: black;"> } </span> - }); 可以看到,这里new出了一个StringRequest对象,StringRequest的构造函数需要传入三个参数,第一个参数就是目标服务器的URL地址,第二个参数是服务器响应成功的回调,第三个参数是服务器响应失败的回调。其中,目标服务器地址我们填写的是百度的首页,然后在响应成功的回调里打印出服务器返回的内容,在响应失败的回调里打印出失败的详细信息。 ...
向自己的应用中添加第三方库是一件需要谨慎而行的事情,因为也许在不久的将来,这些库可能会停止开发,那么到时,当使用这些库遇到问题,却没了任何支持,会是一件很悲催的事情。所以,这里向大家介绍的是,在iOS应用开发中最常使用,而又有信心会继续开发和支持很长一段时间的第三方库,希望能够对你的开发工作有所帮助。 1. CocoaPods 是不是已经厌烦了将各种库拖拽到Xcode项目中?那么,CocoaPods的出现就帮你解决了这一问题。CocoaPods是Objective-C项目中最有名的类库管理工具,可以解决库与库之间的依赖关系,下载库的源码,供我们开发使用。最重要的是,大多的开源类库都支持它。所以,有了CocoaPods,你就可以很轻松地对项目进行扩展。 2. Crashlytics Crashlytics是一款用于检测你开发的应用,何时在客户端设备上崩溃,并能找出其崩溃原因以及帮助开发者修复应用的工具。Crashlytics既免费又方便使用,另外,还内置一些基础的分析功能,让你无需总要依赖其他独立的分析工具。 3. AFNetworking/Alamofire AFNetworking和之前文章中提到的Alamofire一样,是一个网络库,不同的是,Alamofire是用于Swift中,而AFNetworking则是为Objective-C准备的。AFNetworking是建立在Foundation URL Loading System之上,拥有一个精心设计的模块化架构,以及功能丰富的API,使用起来很是方便。 4. Google Analytics、Mixpanel、Localytics 通常情况下,当需要分析用户使用应用的各方面数据时,会在Google Analytics、Mixpanel和Localytics之间权衡。Google Analytics可以用来跟踪和统计应用程序,如访问数、停留时间、跳出率等;Mixpanel则是为大家提供公式化和分类类报告,从而给出详细的数据分析;而Localytics提供的是实时地分析服务,帮助开发者更好的理解用户。至于选择哪一个,可以根据自己的需求来判定。 5. Urban Airship 当需要向应用中添加推送通知时,Urban Airship会是一个不错的选择,不过这个是在它还是免费的时候。所以,当你是在为自己或是小的客户端构建应用时,你可以使用Parse和Mixpanel来取代Urban Airship。不过如果是为那些有能力出钱的大客户开发应用的话,Urban Airship还是首选。 6. New Relic New Relic的移动应用监控能够很好地跟踪应用的性能问题,而无需等到应用崩溃后,再去检查问题的来源。让用户从多角度、实时地发现应用的错误,并对此进行处理。 7. ZBar ZBar是一个开源的软件套件,实现了识别和读取来自各种资源的条形码,比如视频流、图像文件等。它支持众多主流的条码,其中包括EAN-13/UPC-A、UPC-E、EAN-8、Code 128、Code 39、Interleaved 2 of 5和QR Code。 8. Core Plot Core Plot是一个开源的2D绘图框架,具有高度可定制性,和Apple的技术紧密的整合,比如 Core Animation、Core Data 和 Cocoa Bindings。 可以绘制柱状图、折线图、饼图等多种图形,提供Mac OS X和iOS下的组件库,基本可以满足你大部分的绘图需求。
首先简单谈下快速排序的特点,时间复杂度O(nLog n),最差时间复杂度O(n^2),平均时间O(nLog n).因为用到了函数栈,空间复杂度为O(lg n),最差为O(n).是一种不稳定的排序方法。基本思想是分治法,这位大大的http://blog.csdn.net/morewindows/article/details/6684558 讲的非常清楚了,分治法+挖坑法,我就不多说了。就是以某个数为参照,使得左边的都小于他,右边的数都大于他。然后对他的左右两个区间采取同样的方法进行递归。 就其整体实现而言,有两大种思路,一是双边扫描,二是单边扫描。下面分别来上程序: 一、双边扫描 双边扫描是谭浩强书中的方法,个人觉得比下面的单边扫描更好理解,也是博文里采用的方法。下面看程序: **[cpp]** [view plain](http://blog.csdn.net/yanzi1225627/article/details/36045001#)[copy](http://blog.csdn.net/yanzi1225627/article/details/36045001#)[print](http://blog.csdn.net/yanzi1225627/article/details/36045001#)[?](http://blog.csdn.net/yanzi1225627/article/details/36045001#)[](https://code.csdn.net/snippets/412329)[](https://code.csdn.net/snippets/412329/fork) <div> </div> </div> - <span style="color: black;"><span style=<span class="string" style="color: red;">“font-family:Comic Sans MS;font-size:18px;”</span>><span class="keyword" style="font-weight: bold; color: blue;">void</span> quickSort1(<span class="datatypes" style="font-weight: bold; color: #2e8b57;">int</span>* x, <span class="datatypes" style="font-weight: bold; color: #2e8b57;">int</span> l, <span class="datatypes" style="font-weight: bold; color: #2e8b57;">int</span> r){ </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">if</span>(l < r){ </span> - <span style="color: black;"> <span class="datatypes" style="font-weight: bold; color: #2e8b57;">int</span> i = l, j = r, key = x[l]; </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">while</span>(i < j){ </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">while</span>( i < j && x[j] >= key){ </span> - <span style="color: black;"> j–; </span> - <span style="color: black;"> } </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">if</span>(i < j){ </span> - <span style="color: black;"> x[i++] = x[j]; </span> - <span style="color: black;"> } </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">while</span>(i < j && x[i] <= key){ </span> - <span style="color: black;"> i++; </span> - <span style="color: black;"> } </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">if</span>(i < j){ </span> - <span style="color: black;"> x[j–] = x[i]; </span> - <span style="color: black;"> } </span> - <span style="color: black;"> } </span> - <span style="color: black;"> cout<<<span class="string" style="color: red;">“i = “</span> <<i<<<span class="string" style="color: red;">” j = “</span><<j<<endl; </span> - <span style="color: black;"> x[i] = key; </span> - <span style="color: black;"> quickSort1(x, l, i-1); </span> - <span style="color: black;"> quickSort1(x, i+1, r); </span> - <span style="color: black;"> } </span> - <span style="color: black;"> </span> - <span style="color: black;">}</span> </span> 双边扫描非常直观,首先进到程序里判断是否l<r,当满足条件才进去。这也是用递归的一个必要条件,一定要让函数有尽头,有边界。然后进入大while循环,接着进入小while循环,先从右边找,只要满足数字大于key就一直让j往左移。直到第一个不满足条件的,就是第一个小于key的数跳出while循环,将它放在左边挖的“坑”上。同时让坑的索引+1,接着从左边开始扫描,找到第一个大于key的数,再将它填到右边的坑上。右边的坑索引-1,接着再从右边扫描。直到最后跳出大while循环,此时i = j。也就是完成了一次快速排序的扫描。之后将最初的key放到x[i],其实放到x[j]也是一样的。因为i等于j么,此时!然后进行递归,对区间[l, i – 1], [i+1, r]进行同样的操作。 ...
GLSurfaceView是OpenGL中的一个类,也是可以预览Camera的,而且在预览Camera上有其独到之处。独到之处在哪?当使用Surfaceview无能为力、痛不欲生时就只有使用GLSurfaceView了,它能够真正做到让Camera的数据和显示分离,所以搞明白了这个,像Camera只开预览不显示这都是小菜,妥妥的。Android4.0的自带Camera源码是用SurfaceView预览的,但到了4.2就换成了GLSurfaceView来预览。如今到了4.4又用了自家的TextureView,所以从中可以窥探出新增TextureView的用意。 虽说Android4.2的Camera源码是用GLSurfaceView预览的,但是进行了大量的封装又封装的,由于是OpenGL小白,真是看的不知所云。俺滴要求不高,只想弄个可拍照的摸清GLSurfaceView在预览Camera上的使用流程。经过一番百度一无所获,后来翻出去Google一大圈也没发现可用的。倒是很多人都在用GLSurfaceView和Surfaceview同时预览Camera,Surfaceview用来预览数据,在上面又铺了一层GLSurfaceView绘制一些信息。无奈自己摸索,整出来的是能拍照也能得到数据,但是界面上不是一块白板就是一块黑板啥都不显示。后来在stackoverflow终于找到了一个可用的链接,哈哈,苍天啊,终于柳暗花明了!参考此链接,自己又改改摸索了一天才彻底搞定。之所以费这么多时间是不明白OpenGL ES2.0的绘制基本流程,跟简单的OpenGL的绘制还是稍有区别。下面上源码: 一、CameraGLSurfaceView.java 此类继承GLSurfaceView,并实现了两个接口 **[java]** [view plain](http://blog.csdn.net/yanzi1225627/article/details/33339965#)[copy](http://blog.csdn.net/yanzi1225627/article/details/33339965#)[print](http://blog.csdn.net/yanzi1225627/article/details/33339965#)[?](http://blog.csdn.net/yanzi1225627/article/details/33339965#)[](https://code.csdn.net/snippets/402612)[](https://code.csdn.net/snippets/402612/fork) <div> </div> </div> - <span style="color: black;"><span style=<span class="string" style="color: red;">“font-family:Comic Sans MS;font-size:18px;”</span>><span class="keyword" style="font-weight: bold; color: blue;">package</span> org.yanzi.camera.preview; </span> - <span style="color: black;"> </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: blue;">import</span> javax.microedition.khronos.egl.EGLConfig; </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: blue;">import</span> javax.microedition.khronos.opengles.GL10; </span> - <span style="color: black;"> </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: blue;">import</span> org.yanzi.camera.CameraInterface; </span> - <span style="color: black;"> </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: blue;">import</span> android.content.Context; </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: blue;">import</span> android.graphics.SurfaceTexture; </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: blue;">import</span> android.opengl.GLES11Ext; </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: blue;">import</span> android.opengl.GLES20; </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: blue;">import</span> android.opengl.GLSurfaceView; </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: blue;">import</span> android.opengl.GLSurfaceView.Renderer; </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: blue;">import</span> android.util.AttributeSet; </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: blue;">import</span> android.util.Log; </span> - <span style="color: black;"> </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: blue;">public</span> <span class="keyword" style="font-weight: bold; color: blue;">class</span> CameraGLSurfaceView <span class="keyword" style="font-weight: bold; color: blue;">extends</span> GLSurfaceView <span class="keyword" style="font-weight: bold; color: blue;">implements</span> Renderer, SurfaceTexture.OnFrameAvailableListener { </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">private</span> <span class="keyword" style="font-weight: bold; color: blue;">static</span> <span class="keyword" style="font-weight: bold; color: blue;">final</span> String TAG = <span class="string" style="color: red;">“yanzi”</span>; </span> - <span style="color: black;"> Context mContext; </span> - <span style="color: black;"> SurfaceTexture mSurface; </span> - <span style="color: black;"> DirectDrawer mDirectDrawer; </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">public</span> CameraGLSurfaceView(Context context, AttributeSet attrs) { </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">super</span>(context, attrs); </span> - <span style="color: black;"> <span class="comment" style="color: #008200;">// TODO Auto-generated constructor stub</span> </span> - <span style="color: black;"> mContext = context; </span> - <span style="color: black;"> setEGLContextClientVersion(<span class="number" style="color: #c00000;">2</span>); </span> - <span style="color: black;"> setRenderer(<span class="keyword" style="font-weight: bold; color: blue;">this</span>); </span> - <span style="color: black;"> setRenderMode(RENDERMODE_WHEN_DIRTY); </span> - <span style="color: black;"> } </span> - <span style="color: black;"> <span class="annotation" style="color: #646464;">@Override</span> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">public</span> <span class="keyword" style="font-weight: bold; color: blue;">void</span> onSurfaceCreated(GL10 gl, EGLConfig config) { </span> - <span style="color: black;"> <span class="comment" style="color: #008200;">// TODO Auto-generated method stub</span> </span> - <span style="color: black;"> Log.i(TAG, <span class="string" style="color: red;">“onSurfaceCreated…”</span>); </span> - <span style="color: black;"> mTextureID = createTextureID(); </span> - <span style="color: black;"> mSurface = <span class="keyword" style="font-weight: bold; color: blue;">new</span> SurfaceTexture(mTextureID); </span> - <span style="color: black;"> mSurface.setOnFrameAvailableListener(<span class="keyword" style="font-weight: bold; color: blue;">this</span>); </span> - <span style="color: black;"> mDirectDrawer = <span class="keyword" style="font-weight: bold; color: blue;">new</span> DirectDrawer(mTextureID); </span> - <span style="color: black;"> CameraInterface.getInstance().doOpenCamera(<span class="keyword" style="font-weight: bold; color: blue;">null</span>); </span> - <span style="color: black;"> </span> - <span style="color: black;"> } </span> - <span style="color: black;"> <span class="annotation" style="color: #646464;">@Override</span> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">public</span> <span class="keyword" style="font-weight: bold; color: blue;">void</span> onSurfaceChanged(GL10 gl, <span class="keyword" style="font-weight: bold; color: blue;">int</span> width, <span class="keyword" style="font-weight: bold; color: blue;">int</span> height) { </span> - <span style="color: black;"> <span class="comment" style="color: #008200;">// TODO Auto-generated method stub</span> </span> - <span style="color: black;"> Log.i(TAG, <span class="string" style="color: red;">“onSurfaceChanged…”</span>); </span> - <span style="color: black;"> GLES20.glViewport(<span class="number" style="color: #c00000;"></span>, <span class="number" style="color: #c00000;"></span>, width, height); </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">if</span>(!CameraInterface.getInstance().isPreviewing()){ </span> - <span style="color: black;"> CameraInterface.getInstance().doStartPreview(mSurface, <span class="number" style="color: #c00000;">1</span>.33f); </span> - <span style="color: black;"> } </span> - <span style="color: black;"> </span> - <span style="color: black;"> </span> - <span style="color: black;"> } </span> - <span style="color: black;"> <span class="annotation" style="color: #646464;">@Override</span> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">public</span> <span class="keyword" style="font-weight: bold; color: blue;">void</span> onDrawFrame(GL10 gl) { </span> - <span style="color: black;"> <span class="comment" style="color: #008200;">// TODO Auto-generated method stub</span> </span> - <span style="color: black;"> Log.i(TAG, <span class="string" style="color: red;">“onDrawFrame…”</span>); </span> - <span style="color: black;"> GLES20.glClearColor(<span class="number" style="color: #c00000;">1</span>.0f, <span class="number" style="color: #c00000;">1</span>.0f, <span class="number" style="color: #c00000;">1</span>.0f, <span class="number" style="color: #c00000;">1</span>.0f); </span> - <span style="color: black;"> GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT | GLES20.GL_DEPTH_BUFFER_BIT); </span> - <span style="color: black;"> mSurface.updateTexImage(); </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">float</span>[] mtx = <span class="keyword" style="font-weight: bold; color: blue;">new</span> <span class="keyword" style="font-weight: bold; color: blue;">float</span>[<span class="number" style="color: #c00000;">16</span>]; </span> - <span style="color: black;"> mSurface.getTransformMatrix(mtx); </span> - <span style="color: black;"> mDirectDrawer.draw(mtx); </span> - <span style="color: black;"> } </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="annotation" style="color: #646464;">@Override</span> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">public</span> <span class="keyword" style="font-weight: bold; color: blue;">void</span> onPause() { </span> - <span style="color: black;"> <span class="comment" style="color: #008200;">// TODO Auto-generated method stub</span> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">super</span>.onPause(); </span> - <span style="color: black;"> CameraInterface.getInstance().doStopCamera(); </span> - <span style="color: black;"> } </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">private</span> <span class="keyword" style="font-weight: bold; color: blue;">int</span> createTextureID() </span> - <span style="color: black;"> { </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">int</span>[] texture = <span class="keyword" style="font-weight: bold; color: blue;">new</span> <span class="keyword" style="font-weight: bold; color: blue;">int</span>[<span class="number" style="color: #c00000;">1</span>]; </span> - <span style="color: black;"> </span> - <span style="color: black;"> GLES20.glGenTextures(<span class="number" style="color: #c00000;">1</span>, texture, <span class="number" style="color: #c00000;"></span>); </span> - <span style="color: black;"> GLES20.glBindTexture(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, texture[<span class="number" style="color: #c00000;"></span>]); </span> - <span style="color: black;"> GLES20.glTexParameterf(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, </span> - <span style="color: black;"> GL10.GL_TEXTURE_MIN_FILTER,GL10.GL_LINEAR); </span> - <span style="color: black;"> GLES20.glTexParameterf(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, </span> - <span style="color: black;"> GL10.GL_TEXTURE_MAG_FILTER, GL10.GL_LINEAR); </span> - <span style="color: black;"> GLES20.glTexParameteri(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, </span> - <span style="color: black;"> GL10.GL_TEXTURE_WRAP_S, GL10.GL_CLAMP_TO_EDGE); </span> - <span style="color: black;"> GLES20.glTexParameteri(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, </span> - <span style="color: black;"> GL10.GL_TEXTURE_WRAP_T, GL10.GL_CLAMP_TO_EDGE); </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">return</span> texture[<span class="number" style="color: #c00000;"></span>]; </span> - <span style="color: black;"> } </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">public</span> SurfaceTexture _getSurfaceTexture(){ </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">return</span> mSurface; </span> - <span style="color: black;"> } </span> - <span style="color: black;"> <span class="annotation" style="color: #646464;">@Override</span> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">public</span> <span class="keyword" style="font-weight: bold; color: blue;">void</span> onFrameAvailable(SurfaceTexture surfaceTexture) { </span> - <span style="color: black;"> <span class="comment" style="color: #008200;">// TODO Auto-generated method stub</span> </span> - <span style="color: black;"> Log.i(TAG, <span class="string" style="color: red;">“onFrameAvailable…”</span>); </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">this</span>.requestRender(); </span> - <span style="color: black;"> } </span> - <span style="color: black;"> </span> - <span style="color: black;">} </span> - <span style="color: black;"></span> </span> 关于这个类进行简单说明: ...
杂家前文曾写过一篇关于只拍摄特定区域图片的demo,只是比较简陋,在坐标的换算上不是很严谨,而且没有完成预览界面四周暗中间亮的效果,深以为憾,今天把这个补齐了。 在上代码之前首先交代下,这里面存在着换算的两种模式。第一种,是以屏幕上的矩形区域为基准进行换算。举个例子,屏幕中间一个 矩形框为100dip*100dip.这里一定要使用dip为单位,否则在不同的手机上屏幕呈现的矩形框大小不一样。先将这个dip换算成px,然后根据屏幕的宽和高的像素计算出矩形区域,传给Surfaceview上铺的一层View,这里叫MaskView(蒙板),让MaskView进行绘制。然后拍照时,通过屏幕矩形框的大小和屏幕的大小与最终拍摄图片的PictureSize进行换算,得到图片里的矩形区域图片,然后截取保存。第二种模式是,预先知道想要的图片的长宽,如我就是想截400*400(单位为px)大小的图片。那就以此为基准,换算出屏幕上呈现的Rect的长宽,然后让MaskView绘制。究竟用哪一种模式,按需选择。本文以第一种模式示例。下面上代码: 在杂家的前文基础上进行封装,首先封装一个MaskView,用来绘制四周暗中间亮的效果,或者你可以加一个滚动条,这都不是事。 一、MaskView.java **[java]** [view plain](http://blog.csdn.net/yanzi1225627/article/details/34931759#)[copy](http://blog.csdn.net/yanzi1225627/article/details/34931759#)[print](http://blog.csdn.net/yanzi1225627/article/details/34931759#)[?](http://blog.csdn.net/yanzi1225627/article/details/34931759#)[](https://code.csdn.net/snippets/407657)[](https://code.csdn.net/snippets/407657/fork) <div> </div> </div> - <span style="color: black;"><span style=<span class="string" style="color: red;">“font-family:Comic Sans MS;font-size:18px;”</span>><span class="keyword" style="font-weight: bold; color: blue;">package</span> org.yanzi.ui; </span> - <span style="color: black;"> </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: blue;">import</span> org.yanzi.util.DisplayUtil; </span> - <span style="color: black;"> </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: blue;">import</span> android.content.Context; </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: blue;">import</span> android.graphics.Canvas; </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: blue;">import</span> android.graphics.Color; </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: blue;">import</span> android.graphics.Paint; </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: blue;">import</span> android.graphics.Paint.Style; </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: blue;">import</span> android.graphics.Point; </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: blue;">import</span> android.graphics.Rect; </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: blue;">import</span> android.util.AttributeSet; </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: blue;">import</span> android.util.Log; </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: blue;">import</span> android.widget.ImageView; </span> - <span style="color: black;"> </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: blue;">public</span> <span class="keyword" style="font-weight: bold; color: blue;">class</span> MaskView <span class="keyword" style="font-weight: bold; color: blue;">extends</span> ImageView { </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">private</span> <span class="keyword" style="font-weight: bold; color: blue;">static</span> <span class="keyword" style="font-weight: bold; color: blue;">final</span> String TAG = <span class="string" style="color: red;">“YanZi”</span>; </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">private</span> Paint mLinePaint; </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">private</span> Paint mAreaPaint; </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">private</span> Rect mCenterRect = <span class="keyword" style="font-weight: bold; color: blue;">null</span>; </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">private</span> Context mContext; </span> - <span style="color: black;"> </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">public</span> MaskView(Context context, AttributeSet attrs) { </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">super</span>(context, attrs); </span> - <span style="color: black;"> <span class="comment" style="color: #008200;">// TODO Auto-generated constructor stub</span> </span> - <span style="color: black;"> initPaint(); </span> - <span style="color: black;"> mContext = context; </span> - <span style="color: black;"> Point p = DisplayUtil.getScreenMetrics(mContext); </span> - <span style="color: black;"> widthScreen = p.x; </span> - <span style="color: black;"> heightScreen = p.y; </span> - <span style="color: black;"> } </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">private</span> <span class="keyword" style="font-weight: bold; color: blue;">void</span> initPaint(){ </span> - <span style="color: black;"> <span class="comment" style="color: #008200;">//绘制中间透明区域矩形边界的Paint</span> </span> - <span style="color: black;"> mLinePaint = <span class="keyword" style="font-weight: bold; color: blue;">new</span> Paint(Paint.ANTI_ALIAS_FLAG); </span> - <span style="color: black;"> mLinePaint.setColor(Color.BLUE); </span> - <span style="color: black;"> mLinePaint.setStyle(Style.STROKE); </span> - <span style="color: black;"> mLinePaint.setStrokeWidth(5f); </span> - <span style="color: black;"> mLinePaint.setAlpha(<span class="number" style="color: #c00000;">30</span>); </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="comment" style="color: #008200;">//绘制四周阴影区域</span> </span> - <span style="color: black;"> mAreaPaint = <span class="keyword" style="font-weight: bold; color: blue;">new</span> Paint(Paint.ANTI_ALIAS_FLAG); </span> - <span style="color: black;"> mAreaPaint.setColor(Color.GRAY); </span> - <span style="color: black;"> mAreaPaint.setStyle(Style.FILL); </span> - <span style="color: black;"> mAreaPaint.setAlpha(<span class="number" style="color: #c00000;">180</span>); </span> - <span style="color: black;"> </span> - <span style="color: black;"> </span> - <span style="color: black;"> </span> - <span style="color: black;"> } </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">public</span> <span class="keyword" style="font-weight: bold; color: blue;">void</span> setCenterRect(Rect r){ </span> - <span style="color: black;"> Log.i(TAG, <span class="string" style="color: red;">“setCenterRect…”</span>); </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">this</span>.mCenterRect = r; </span> - <span style="color: black;"> postInvalidate(); </span> - <span style="color: black;"> } </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">public</span> <span class="keyword" style="font-weight: bold; color: blue;">void</span> clearCenterRect(Rect r){ </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">this</span>.mCenterRect = <span class="keyword" style="font-weight: bold; color: blue;">null</span>; </span> - <span style="color: black;"> } </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">int</span> widthScreen, heightScreen; </span> - <span style="color: black;"> <span class="annotation" style="color: #646464;">@Override</span> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">protected</span> <span class="keyword" style="font-weight: bold; color: blue;">void</span> onDraw(Canvas canvas) { </span> - <span style="color: black;"> <span class="comment" style="color: #008200;">// TODO Auto-generated method stub</span> </span> - <span style="color: black;"> Log.i(TAG, <span class="string" style="color: red;">“onDraw…”</span>); </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">if</span>(mCenterRect == <span class="keyword" style="font-weight: bold; color: blue;">null</span>) </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">return</span>; </span> - <span style="color: black;"> <span class="comment" style="color: #008200;">//绘制四周阴影区域</span> </span> - <span style="color: black;"> canvas.drawRect(<span class="number" style="color: #c00000;"></span>, <span class="number" style="color: #c00000;"></span>, widthScreen, mCenterRect.top, mAreaPaint); </span> - <span style="color: black;"> canvas.drawRect(<span class="number" style="color: #c00000;"></span>, mCenterRect.bottom + <span class="number" style="color: #c00000;">1</span>, widthScreen, heightScreen, mAreaPaint); </span> - <span style="color: black;"> canvas.drawRect(<span class="number" style="color: #c00000;"></span>, mCenterRect.top, mCenterRect.left – <span class="number" style="color: #c00000;">1</span>, mCenterRect.bottom + <span class="number" style="color: #c00000;">1</span>, mAreaPaint); </span> - <span style="color: black;"> canvas.drawRect(mCenterRect.right + <span class="number" style="color: #c00000;">1</span>, mCenterRect.top, widthScreen, mCenterRect.bottom + <span class="number" style="color: #c00000;">1</span>, mAreaPaint); </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="comment" style="color: #008200;">//绘制目标透明区域</span> </span> - <span style="color: black;"> canvas.drawRect(mCenterRect, mLinePaint); </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">super</span>.onDraw(canvas); </span> - <span style="color: black;"> } </span> - <span style="color: black;"> </span> - <span style="color: black;"> </span> - <span style="color: black;"> </span> - <span style="color: black;">} </span> - <span style="color: black;"></span> </span> 说明如下: ...
xUtils简介 xUtils 包含了很多实用的android工具。 xUtils 最初源于Afinal框架,进行了大量重构,使得xUtils支持大文件上传,更全面的http请求协议支持(10种谓词),拥有更加灵活的ORM,更多的事件注解支持且不受混淆影响… xUitls最低兼容android 2.2 (api level 8) 目前xUtils主要有四大模块: DbUtils模块: - android中的orm框架,一行代码就可以进行增删改查; - 支持事务,默认关闭; - 可通过注解自定义表名,列名,外键,唯一性约束,NOT NULL约束,CHECK约束等(需要混淆的时候请注解表名和列名); - 支持绑定外键,保存实体时外键关联实体自动保存或更新; - 自动加载外键关联实体,支持延时加载; - 支持链式表达查询,更直观的查询语义,参考下面的介绍或sample中的例子。 ViewUtils模块: - android中的ioc框架,完全注解方式就可以进行UI,资源和事件绑定; - 新的事件绑定方式,使用混淆工具混淆后仍可正常工作; - 目前支持常用的20种事件绑定,参见ViewCommonEventListener类和包com.lidroid.xutils.view.annotation.event。 HttpUtils模块: - 支持同步,异步方式的请求; - 支持大文件上传,上传大文件不会oom; - 支持GET,POST,PUT,MOVE,COPY,DELETE,HEAD,OPTIONS,TRACE,CONNECT请求; - 下载支持301/302重定向,支持设置是否根据Content-Disposition重命名下载的文件; - 返回文本内容的请求(默认只启用了GET请求)支持缓存,可设置默认过期时间和针对当前请求的过期时间。 BitmapUtils模块: - 加载bitmap的时候无需考虑bitmap加载过程中出现的oom和android容器快速滑动时候出现的图片错位等现象; - 支持加载网络图片和本地图片; - 内存管理使用lru算法,更好的管理bitmap内存; - 可配置线程加载线程数量,缓存大小,缓存路径,加载显示动画等… 使用xUtils快速开发框架需要有以下权限: ``` <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> ``` 混淆时注意事项: 添加Android默认混淆配置${sdk.dir}/tools/proguard/proguard-android.txt 不要混淆xUtils中的注解类型,添加混淆配置:-keep class * extends java.lang.annotation.Annotation { *; } 对使用DbUtils模块持久化的实体类不要混淆,或者注解所有表和列名称@Table(name=”xxx”),@Id(column=”xxx”),@Column(column=”xxx”),@Foreign(column=”xxx”,foreign=”xxx”);
ThinkAndroid是包含Android mvc和简易sqlite orm以及ioc模块,它封装了Android httpclitent中的http模块, 具有快速构建文件缓存功能,无需考虑什么格式的文件,都可以非常轻松的实现缓存,它实现了图片缓存,在android中 加载的图片的时候oom的问题和快速滑动的时候图片加载位置错位等问题都可以轻易的解决掉。他还包括了一个手机开发中 经常应用的实用工具类,如日志管理,配置文件管理,android下载器模块,网络切换检测等等工具。 ThinkAndroid的开发宗旨是简洁,快速的进行Android应用程序的开发 目前ThinkAndroid主要有以下模块: MVC模块:实现视图与模型的分离。 ioc模块:android中的ioc模块,完全注解方式就可以进行UI绑定、res中的资源的读取、以及对象的初始化。 数据库模块:android中的orm框架,使用了线程池对sqlite进行操作。 http模块:通过httpclient进行封装http数据请求,支持异步及同步方式加载。 缓存模块:通过简单的配置及设计可以很好的实现缓存,对缓存可以随意的配置 图片缓存模块:imageview加载图片的时候无需考虑图片加载过程中出现的oom和android容器快速滑动时候出现的图片错位等现象。 配置器模块:可以对简易的实现配对配置的操作,目前配置文件可以支持Preference、Properties对配置进行存取。 日志打印模块:可以较快的轻易的是实现日志打印,支持日志打印的扩展,目前支持对sdcard写入本地打印、以及控制台打印 下载器模块:可以简单的实现多线程下载、后台下载、断点续传、对下载进行控制、如开始、暂停、删除等等。 网络状态检测模块:当网络状态改变时,对其进行检测。 github项目地址:https://github.com/white-cat/ThinkAndroid 其他框架 一.框架如下几种: 1.Roboguice 2.Spring for Android 3.afinal 4.xUtils 二.Roboguice说明 项目地址:https://github.com/roboguice/roboguice 要依赖三个包,加起来接近800K比较大; 控件和service都可以用IOC注入; 事件不能绑定 activity要继承RoboActivity 三.Spring for Android说明 四.afinal说明 - 项目地址:[https://github.com/yangfuhai/afinal](https://github.com/yangfuhai/afinal) - 依赖包只有152k - 页面控件可以注入,service不可注入 - 事件能绑定 - 提供sqlite,http,图片工具类 - activity要继承FinalActivity 五.xUtils说明 - 项目地址:[https://github.com/wyouflf/xUtils](https://github.com/wyouflf/xUtils) - 依赖包有274k,项目比较活跃 - 页面控件可以注入,service不可注入 - 事件能绑定 - 提供sqlite,http,图片工具类 - activity不要继承,但要侵入代码 - 是afinal项目改进而来,支持大数据上传 ion 项目地址:https://github.com/koush/ion
在看android基础的时候,关于网络操作一般都会介绍HttpClient以及HttpConnection这两个包。前者是apache的开源库,后者是android自带的api。既然提到了他们,都二者进行一个比较,谷歌在官方文档已经说明了,建议在2.3以及以上版本使用HttpConnection。具体原因呢,是因为对2.1和2.2版本,HttpURLConnection有那么几个Bug,所以建议用Apache的HTTP Client;之后的版本,建议用HttpURLConnection。Apache的HTTP Client比较强大,拥有庞大而灵活的API,这个实现很稳定,并且Bug很少。然而,也就是因为太庞大了,以至于很难在保证兼容性的情况下改进它,故android 开发团队不应该维护该库而是转投更为轻量级的httpurlconnection。 当我们开发企业级应用的时候,一般都会选择使用已经封装好的http框架。开源的比较流行的有: 1、volley 2、android-async-http 3、retrofit 4、okhttp 5、androidquery 6、AndroidAsync 等。他们各有优劣,不同的框架有不同的效率,在使用的时候可以因地制宜地测试,根据效果来选择使用哪个,之前个人则比较喜欢用android-async-http,。如今Google推出了官方的针对Android平台上的网络通信库volley,能使网络通信更快,更简单,更健壮,Volley在提供了高性能网络通讯功能的同时,对网络图片加载也提供了良好的支持,完全可以满足简单REST客户端的需求, 我们没有理由不跟上时代的潮流。另外,但volley的扩展性很强,可以根据需要定制你自己的网络请求。所以,最后推荐还是使用volley进行开发,当然其他几个库也是非常具有学习以及参考意义的,可以将他们的精髓之处汲取到volley框架的拓展开发之中,做出自己理想的http通讯框架。 推荐博客: http://instructure.github.io/blog/2013/12/09/volley-vs-retrofit/ http://blog.csdn.net/t12x3456/article/details/9221611 http://blog.csdn.net/guolin_blog/article/details/12452307