- 博客(40)
- 收藏
- 关注
原创 RecyclerView的性能优化
通过如下方法替换直接调用notifyDataSetChanged,减少不必要的刷新, calculateDiff方法能够计算出那些Item需要刷新,那些不需要刷新。 DiffUtil.DiffResult diffResult = DiffUtil.calculateDiff(new DiffCallBack(mData, list), true);...
2020-03-09 15:39:43
389
原创 通过一个例子理解EGL和OpenGL的离屏刷新
EGL是什么?EGL 是 OpenGL ES 渲染 API 和本地窗口系统(native platform window system)之间的一个中间接口层,它主要由系统制造商实现,为了让OpenGL ES能够绘制在当前设备上,我们需要EGL作为OpenGL ES与设备的桥梁。在Android中我们要使用OpenGL那么必须先初始化EGL环境初始化EGL环境获取EGL实例egl = (...
2020-03-09 15:24:55
3939
2
原创 Activity相互启动生命周期的变化
A启动B流程如下:2020-03-18 23:48:26.720 2720-2720/com.mobilevoice.findyou I/TestActivity: A = onPause 2020-03-18 23:48:26.747 2720-2720/com.mobilevoice.findyou I/TestActivity: B = onCreate 2020-03-18 23:4...
2020-02-19 18:34:43
513
原创 Android通过openGL实现视频贴纸功能
Android通过openGL实现视频贴纸功能GLSL代码1.vertex代码,文件vertex_filter_stricker.glslattribute vec2 inputTextureCoordinate; //纹理坐标attribute vec4 position;// 顶点坐标varying vec2 textureCoordinate;//纹理坐标点变换后输出voi...
2020-01-13 18:07:02
2115
3
原创 SurfaceView相互叠加的坑
SurfaceView相互叠加的坑SurfaceView相互叠加的坑SurfaceView相互叠加的坑我们知道可以通过如下代码设置SurfaceView的层级 surfaceView.setZOrderOnTop(isOnTop) surfaceView.setZOrderMediaOverlay(isOnTop)但是在实际使用过...
2020-01-08 14:24:44
2965
2
原创 Recyclerview使用过程中遇到的坑
1.调用notifyItem**方法导致闪烁:方法一((SimpleItemAnimator)recyclerView.getItemAnimator()).setSupportsChangeAnimations(false);方法二recyclerView.getItemAnimator().setChangeDuration(0);原因由于Recycleview调用方法...
2019-12-23 15:57:00
662
原创 Android设置Dialog设置圆角
dialog设置圆角1.dialog @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); getWindow().setBackgroundDrawable(new ColorDrawable(Col...
2019-12-23 15:47:16
1441
原创 Java面试题汇总(持续更新)
Java面试题汇总(欢迎各位补充)String 相关面试题目问:String、StringBuffer、StringBuilder 的区别是什么?答:String 是字符串常量,StringBuffer 和 StringBuilder 都是字符串变量,后两者的字符内容可变,而前者创建后内容不可变;StringBuffer 是线程安全的,而 StringBuilder 是非线程安全的,线程安全...
2019-12-20 11:43:29
1745
原创 Android通过OpenGL截取视频画面
Android通过OpenGL截取视频画面截取视频图片格式转换,因为bitmap的存储格式和从OpenGL中获取到到buffer不一致,所以需要转换一下截取视频图片 private void getVideoScreenShot(int frameBuffer) { if (!isScreenShot) return; GLES20.glBindFrame...
2019-12-19 21:09:23
735
原创 RenderScript使用教程(四)实现美颜功能
通过RS实现美颜功能前言Java调用代码RenderScript代码相机美颜的原理前言最近在做一个相机APP,通过OpenGL实现了实时美颜功能,但是网上很难找到通过RS实现美颜的例子,因为相机预览通过OpenGL实现美颜后,用户点击拍照后的数据依然是原始数据,并没有美颜,所以我通过同样的算法用RS实现了一遍。有需要的同学可以参考一下Java调用代码 public static Bi...
2019-12-12 19:41:32
521
原创 Numpy使用笔记
Numpy使用笔记创建矩阵通过数组创建矩阵matrix = np.array( [2,3,4])通过函数创建矩阵arangea = np.arange(10) # 默认从0开始到10(不包括10),步长为1print(a) # 返回 [0 1 2 3 4 5 6 7 8 9]a1 = np.arange(5,10) # 从5开始到10(不包括10),步长为1print(a...
2018-10-12 17:22:02
249
原创 matplotlib使用笔记
matplotlib使用笔记matplotlib使用笔记线性图最简单的线形图自定义图标外观指定线条的外观指定轴的名称指定图的Legend绘制子图直方图显示图片matplotlib使用笔记Matplotlib 是 Python 的一个绘图库。它包含了大量的工具,你可以使用这些工具创建各种图形,包括简单的散点图,正弦曲线,甚至是三维图形。Python 科学计算社区经常使用它完成数据可视化的工作。...
2018-10-11 10:59:56
380
原创 Android屏幕常用术语
Android屏幕常用术语Px(Pixel像素)也称为图像元素,是作为图像构成的基本单元,单个像素的大小并不固定,跟随屏幕大小和像素数量的关系变化(屏幕越大,像素越低,单个像素越大,反之亦然)。所以在使用像素作为设计单位时,在不同的设备上可能会有缩放或拉伸的情况。Resolution(分辨率)是指屏幕的垂直和水平方向的像素数量,如果分辨率是 1920*1080 ,那就是垂直
2018-01-12 14:39:03
488
原创 RenderScript应用(四)实现相机模糊切换效果
使用RenderScript实现相机模糊切换效果实现原理步骤: 1.得到相机每一帧数据的回调 2.将YUV格式转换为ARGB格式 3.缩小图片 4.模糊图片 5.显示到视图中。具体实现代码renderscript相关代码YUV转换为ARGB代码如下:// Needed directive for RS to work#pragma version(1)// The java_packag
2017-08-25 14:38:54
937
原创 Swift闭包的使用
Swift闭包的使用闭包的作用1.提前准备好执行代码 2.在需要的时候执行 3.可以当参数传递 主要的应用场景就是异步,组件,视图等的回调(类似OC的Block和Java的接口回调)。闭包的定义定义 :{ 形参列表 -> 返回类型 in //实现代码 } 示例: let c1 = { (x: Int, y: Int) -> Int in
2017-08-24 19:58:37
428
原创 RenderScript使用教程(三)
Java层与 RenderScript 层参数传递在开发中时常需要将Java层数据传递到RenderScript层来实现参数的传递,例如:高斯模糊中需要我们传递模板(算子)到RenderScript层来实现模糊的功能。下面演示何传递。 RenderScript层首先定义一个变量,如下rs_allocation inAllocation;uint32_t nTempMX, nTempMY;uin
2017-07-27 16:54:50
1253
原创 Android动态加载SO文件
动态加载SO文件一般编译进APK的so文件,我们可以通过以下方式去加载SO文件(注意:例如我们的so文件是libscanner.so,那么我们加载so文件的时候去掉前面的lib和后面的.so后缀) System.loadLibrary("scanner");有时候我们希望通过下载so后然后再动态去加载,那么可以用以上方式(注意:该方式加载so文件必须是全路径,同时由于权限的原因,必须在我们app内
2017-07-18 09:38:14
1690
原创 建议使用TextureView替代SurfaceView
使用SurfaceView的坑问题描述由于工作需要,需要开发相机界面,一开始的时候使用SurfaceView,开发完成后发现存在一些问题。 一、很多手机activity页面切换都有动画(我使用测试的小米手机),发现在其他界面跳转到相机界面的时候对SurfaceView没有效果,而相机界面其他View会产生动画效果,所以看起来会很奇怪。 通过查找发现原因如下(参考博文:这里写链接内容): Sur
2017-06-29 10:03:27
5265
原创 Android ADB和shell常用命令
Android ADB和shell常用命令1.安装APK的命令,这是我们最常用的命令之一了(如果加 -r 参数,保留已设定数据,重新安装apk) 。adb install xxx.apkadb install -r xxx.apk2.查看手机屏幕当前正在显示的Activity的名称,该命令非常有用,当你想查看当前APP正在使用哪个Activity显示到屏幕上,那么你就可以使用该命令。或者你在查看一
2017-06-19 16:46:28
1379
原创 Gradle学习历程(二)
Gradle学习历程(二)— Android Studio 项目Gradle结构Android Studio Gradle的位置Android studio会把Gradle下载到C:\Users\(你的用户名).gradle\wrapper\dists。自己安装Gradle由于我们使用命令行的时候希望使用自己下载的Gradle版本,而不是使用Android studio自带的时候就需要自己下载gra
2017-06-19 15:23:26
395
原创 避免应用冷启动时候的短暂黑屏的问题
避免应用冷启动时候的短暂黑屏的问题原理因为在应用启动的时候窗口(window)先创建出来,所以当窗口显示出来的时候我们再通过onCreate方法中执行setContentView方法设置视图的时候窗口已经显示到界面上了,所以导致短暂的黑屏现象。所以为了解决这个问题我们可以预先通过xml来设置window的默认背景。实现 <style name="splash_style" parent="@a
2017-06-15 15:44:02
469
原创 使用Java实现简单的队列(queue)
使用Java实现简单的队列(queue)前言很多时候我们可以使用Java提供的queue实现队列的功能,但是当我们需要实现一些比较特殊情况下的队列的时候可能需要自己实现一个队列从而满足个性化的需求。例如我们需要实现一个由时间排列的队列,队列里的元素根据时间的大小,从小到大排列,这时候可能我们就需要自己定义一个队列了。实现public class TimeQueue { private Ele
2017-06-13 11:22:31
2979
原创 Android相机开发中遇到的坑(注意事项)
Android相机开发中遇到的坑(注意事项)相机预览界面方向的设定在默认情况下有些相机用户看到的预览界面和真实世界的情况是颠倒的,所以我们需要设定预览界面的方向,如下所示: public static int getDisplayRotation(Activity activity) { int rotation = activity.getWindowManager().ge
2017-06-08 17:52:16
1244
原创 实现自定义相机(camera的使用)
实现自定义相机(camera的使用)实现步骤1.获取一个相机对象(Camera) 2.设置相机相关的回调和参数 3.创建一个预览界面(SurfaceView)、 4.捕捉一张图片(mCamera.takePicture(null, null, mPicture);) 5.保存图片 6.释放相机对象 虽然步骤很简单,但是设计到和硬件打交道就会设计到兼容性的问题,同事Android平台下碎片
2017-05-23 17:44:11
1299
原创 Android下实现多线程断点下载
Android下实现多线程断点下载原理主要通过设置Http的请求头Range字段,然后启动多个线程让每一个线程负责一段数据的下载,然后当所有线程的数据下载完整后,那么整个文件就一下完成。在下载过程中当我们每次写入一段数据后,我们同时记录当前线程已经下载的大小,那么当程序异常退出或者用户暂停下载后,用户下次再次下载的时候可以继续从之前下载的基础上继续下载文件而不用整个文件再次下载了。 例如:http
2017-05-18 16:22:48
368
原创 RenderScript使用教程(二)
RenderScript使用教程(二)NDK中使用RenderScript编写一个rs脚本文件实现灰度转换的代码#pragma version(1)#pragma rs java_package_name(com.example.android.rs.hellocomputendk)const static float3 gMonoMult = {0.299f, 0.587f, 0.114f};
2017-05-09 10:12:08
1967
原创 RenderScript使用教程(一)
RenderScript使用教程(一)Java中使用RenderScript创建rs目录编写一个rs脚本文件// Needed directive for RS to work#pragma version(1)// Change java_package_name directive to match your Activity's package path#pragma rs java_p
2017-05-08 15:51:00
3216
2
原创 Android相关的日志输出
Android相关的日志输出Android.mk文件日志输出例:$(warning "the value of LOCAL_PATH is$(LOCAL_PATH)")Ant编译脚本日志输出例:<echo level="info">NDK_DEBUG=${ndkDebugFlag}</echo>Gradle编译脚本日志输出例:println 'hello gradle'Android native开
2017-04-27 10:59:37
409
原创 android-ndk-r14b 编译renderscript的BUG(Window平台下)
android-ndk-r14b 编译renderscript的BUG报错如下报错原因是找不到路径,其实是ndk Windows平台下的bug, error: error opening ‘D:/func_scanner_optimize_fix_pdf_bug_branch/thirdparty/scan/ScanDemoExample/app/src/main/jni/D:/func_scan
2017-04-22 11:04:43
652
原创 编译Android平台的opencv
编译Android平台的opencv编译流程第一步:安装Cmake 第二步: 编写脚本configure.bat文件cmake -G "Unix Makefiles" -DCMAKE_TOOLCHAIN_FILE=..\..\android\android.toolchain.cmake ..\..\.. -DANDROID_NDK="D:\Android\sdk\ndk-bundle" -DAN
2017-04-17 15:02:15
4301
原创 已知四个点的连线,判断是否是四边形
已知四个点的连线,判断是否是四边形分析1.假设四个点PLT,PRT,PLB,PRB,并且他们是以PLT->PRT->PRB->PLB->PLT的方式连接起来。 2.当任意两条对线的延长线的相交点不在任意两条对线线段内,那么可以判断为四边形。例如 线段PLT->PRT和线段PLB->PRB两条线段的延长线的相交点不在两条线段内则满足四边形的条件,然后再去 判断另外两条对边线。实现实现步骤 1.
2017-01-23 10:18:53
4042
1
原创 Gradle学习历程(一)
Gradle学习历程— Groovy语言Groovy介绍Groovy是一种基于JVM(Java虚拟机)的敏捷开发语言,它结合了Python、Ruby和Smalltalk的许多强大的特性,Groovy 代码能够与 Java 代码很好地结合,也能用于扩展现有代码。由于其运行在 JVM 上的特性,Groovy 可以使用其他 Java 语言编写的库。 Groovy语法既然Groovy
2017-01-19 11:06:47
476
原创 优化APP性能(一)
优化APP性能(一) —通过线程池前言我们都知道如何在Android中创建一个线程,如下: new Thread(new Runnable() { @Override public void run() { ... }).start();但是这样子创建线程有一个缺点就是当一个项目非常大,很多地方都需
2017-01-18 16:56:07
453
原创 增强APP的安全性(二)
增强APP的安全性(二) –通过混淆ProGuard的常用语法 # 指定代码的压缩级别 -optimizationpasses 5 # 是否使用大小写混合 混淆时不会产生形形色色的类名 -dontusemixedcaseclassnames # 是否混淆第三方jar -dontskipnonpubliclibraryclasses
2017-01-17 16:27:29
639
原创 只启动系统相机(排除第三方相机)
只启动系统相机(排除第三方相机)需求我们都知道启动相机可以通过如下代码实现 Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); // 指定调用相机拍照后照片的储存路径 intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(file)); c
2017-01-17 15:03:34
1501
原创 实现拉绳效果(类似UC浏览器首页效果)
实现拉绳效果(类型UC浏览器首页效果)前段时间,由于需求需要实现一个拉绳效果的首页,所以自己是实现了这样一个功能,需要的同学可以参考一下import android.animation.Animator;import android.animation.AnimatorSet;import android.animation.ObjectAnimator;import android.anim
2017-01-16 09:19:26
949
原创 增强APP的安全性(一)
增强APP的安全性前言当我们发布一款新的APP的时候,最不愿看到的是我们的成果被别人窃取,所以如何提高我们APP的安全性在开发过程中也是非常重要的。常见增强安全性的手段有很多。例如:混淆Java代码、用C/C++实现关键代码、APK加固等等。今天我介绍的是可以迅速添加到项目中的来增强APP安全的方式。通过检查APP信息来增强APP的安全性具体代码如下:package com.dong.mobiles
2017-01-14 16:04:50
1609
原创 获取前台进程包名(ForegroundProcess)
获取前台进程包名(ForegroundProcess)在之前我们可以通过下面的方式获取到前台进程的包名public String getForegroundApp(Context context) { ActivityManager mActivityManager = (ActivityManager) mContext.getSystemService(Conte
2017-01-14 15:42:54
1214
1
原创 NDK开发入门(一)
准备工作工具选择开发NDK我选择最新版的Android Studio2.2.2,主要原因是最新版已经很好的支持了c/c++的代码提示、代码调试和源代码跳转等功能,个人感觉非常好用。开始实践1.首先下载最新版Android studio并且下载ndk开发中需要的工具,如下图所示: 2.安装好三个工具后我们就可以进行开发了,首先我们新建一个项目,其中选中“Include C++ Support”,如下
2017-01-13 23:54:28
594
原创 实现 ViewPager 回弹效果
实现 ViewPager 回弹效果在开发遇到产品需要实现回弹效果,我通过继承V4中的ViewPager来实现, 具体代码如下: public class ZoomViewPager extends ScanViewPager { private float preX = 0f; private static final float RATIO = 0.6f;//摩擦系数
2017-01-13 18:05:07
2810
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人