View在主线程中对画面进行,而SurfaceView通常会在一个子线程中进行页面的刷新 View在绘图时没有使用双缓冲机制,而SurfaceView在底层实现了双缓冲机制 总之,如果你的自定义View...在自定义的SurfaceView的构造方法中,需要对SurfaceView进行初始化。...---- 使用SurfaceView 通过SurfaceHolder对象的lockCanvas()方法,就可以获取当前的Canvas绘图对象。...最后的样子: ? ---- 绘图板 通过Path对象记录手指滑动的路径来进行绘图,在SurfaceView的onTouchEvent()中记录Path路径。...,因此我们可以在子线程中,进行Sleep操作,以便尽可能的节约系统资源。
在android中应用相机功能,一般有两种:一种是直接调用系统相机,一种自己写的相机。...第二种: (1)首先我们要自己创建一个照相界面,必须考虑用什么控件显示照相机中的预览效果,显然android已经帮我们做好了选择,那就是SurfaceView 控制SurfaceView需要一个surfaceHolder...,他是系统提供的一个用来设置SurfaceView的一个对象,可以通过surfaceView.getHolder()这个方法来获得....那么这是就需要在那个参数中的jpeg的 方法里面进行处理了,那个方法的data参数,就是相片的数据。...,但是我们在程序上,也可以做一些处理, 向上面的那些,因为我直接把surfaceView当做整体布局,就可能出现屏幕被拉开了,不是很好看,所以这时,就可以不要把 surfaceView弄成整体布局,
mHolder.addCallback(this); // 为SurfaceView添加状态监听 p = new Paint(); // 创建一个画笔对象...自定义一个方法,在画布上画一个圆 */ public void Draw() { mCanvas = mHolder.lockCanvas(); // 获得画布对象...(SurfaceHolder holder) { t = new Thread(this); // 创建一个线程对象 flag = true; // 把线程运行的标识设置成...true t.start(); // 启动线程 } /** * 当SurfaceView的视图发生改变的时候,调用此函数 */...SurfaceHolder holder)方法, 还实现了onTouchEvent(MotionEvent event),onKeyDown(int keyCode, KeyEvent event)方法来,详细的在代码里已注释
getMenuInflater().inflate(R.menu.main, menu); return true; } /** * surfaceview的实例,用来处理贴图问题 *...首先是声明一个继承SurfaceView并且实现SurfaceHolder.CallBack的子类 class MyView extends SurfaceView implements SurfaceHolder.Callback...在子类中获得一个用于控制suerfce对象的surfaceHolder对象 holder = SurfaceView.getHodler(); holder.addCallback() 3....在surfaceCreated方法中调用处理绘图线程,并将holder对象传递给绘图线程 4....绘图线程中处理步骤: //首先获得canvas对象 Canvas c = holder.lockCanvas(); c.store(); ... ...
这时候,日志中可能会出现安全异常,比如SecurityException,提示没有CAMERA权限。因此,可以建议在日志中检查权限相关的错误,并确保所有必要的权限都已正确声明。...(),而是搞不懂为什么同样的代码在SurfaceView里能跑通,在按钮点击事件里就报错。...布局层次过深:SurfaceView 嵌套在多层布局中,可能导致在某些设备上初始化延迟或失败。...权限与特性声明的日志验证 在 AndroidManifest.xml 中声明权限和特性后,建议在代码中动态验证权限是否被授予,避免因权限未声明或用户拒绝导致功能异常: // 在Activity的onCreate...我的血泪教训也总结成了几条供大家参考: 永远不要相信“一步到位”:在onCreate里找到SurfaceView的引用就够了,别急着碰它的Holder。
: Surface 画布可以在 SurfaceView 的 SurfaceHolder 中获取 //绘制图像的 SurfaceView SurfaceView surfaceView; //在 SurfaceView...surfaceHolder.getSurface() ; ② 将 Surface 对象传递到 Native 层 : 在 SurfaceHolder.Callback 接口的 surfaceChanged...Surface 画布 : 这里的 Surface 画布从 SurfaceView 中获得 , SurfaceHolder.Callback 的监听方法中获取 SurfaceHolder 及 Surface...实现 Surface 传递方法 : 在 Native 层实现 Java 中定义的方法 ; extern "C" JNIEXPORT void JNICALL Java_kim_hsl_ffmpeg_Player_native...ANativeWindow 创建 : 在 Native 层实现 Java 中定义的本地方法 native_set_surface ( ) , 在该方法中传入了 Surface 对象作为参数 ; 在该 Native
文章目录 一、自定义 View 组件 ( Kotlin ) 二、自定义 SurfaceView 组件 ( Kotlin ) 自定义组件构造函数统一在 constructor(context: Context..., defStyleAttr: Int) 构造函数中实现 , 在 constructor(context: Context?) , constructor(context: Context?...构造函数中 , 都基于三个参数的构造函数 ; 一、自定义 View 组件 ( Kotlin ) ---- package kim.hsl.aa.view import android.content.Context...{ super.onDraw(canvas) // 绘制核心方法 } } 二、自定义 SurfaceView 组件 ( Kotlin ) ---- package...android.content.Context import android.graphics.* import android.os.Build import android.util.AttributeSet import android.view.SurfaceHolder
SurfaceView使用 首先创建一个SurfaceViewSign类,继承SurfaceView类,继承 SurfaceHolder.Callback和Runnable接口,代码如下: import...import android.graphics.Path; import android.util.AttributeSet; import android.view.MotionEvent; import android.view.SurfaceHolder...; import android.view.SurfaceView; public class SurfaceViewSign extends SurfaceView implements SurfaceHolder.Callback...} } } } private void draw() { try{ //锁定画布并返回画布对象...,并且获取到了签名的图片,类型是bitmap。
SurfaceView 与 View 树的关系 SurfaceView 在布局上存在于 View 树中,但其内容实际上是在独立的 Surface 上进行绘制的。...这使得它与普通的 View 有很大的不同: 普通 View 的绘制一般是在 UI 线程上进行的,而 SurfaceView 的绘制可以在独立的线程上进行。...SurfaceView 在渲染时,实际的绘制表面位于自己的独立层上,这层与 View 树的其他部分是分离的。...在 surfaceCreated() 方法中启动了一个线程,该线程在独立的表面上绘制一个移动的矩形。 5....性能优化:在高性能场景中,注意优化绘制代码,避免在绘制方法中执行耗时操作。
surfaceView.getHolder().setKeepScreenOn(true); 3、现在看“开始录制”监听事件 ----3.1 创建MediaRecorder对象...这样图像就是正常显示了,这里设置的是观看保存后的视频的角度 recorder.setOrientationHint(90); ----3.4 设置文件存储路径,这里简陋了,实际开发中需要判断是否有外部存储...android.media.MediaRecorder; 5 import android.os.Bundle; 6 import android.os.Environment; 7 import android.view.SurfaceHolder...isRunning){ 57 try { 58 //创建MediaRecorder对象 59 recorder...,用于给刚接触MediaRecorder音频录制的coder学习,存在一些Bug和不足,各位coder可以继续拓展 不足: 1、只有当点击“开始录制”的时候SurfaceView组件才可以看到摄像头拍摄的预览
图像数据可以在接口中的onPictureTaken方法中获得,通常我们只关心最后一个的JPG图像数据,所以前面的接口参数可以直接传null。...预览视图SurfaceView/预览持有者SurfaceHolder SurfaceView是Android中的一种特殊视图,它拥有独立的绘图表面,即它不与其宿主页面共享同一个绘图表面。...由于拥有独立的绘图表面,因此SurfaceView的界面就可以在一个独立的线程中进行绘制,我们称之为渲染线程。因为它不占用主线程资源,所以一方面可以实现复杂而高效的UI,另一方面也会及时响应用户输入。...: 获取预览视图的对象。...该方法用于关联SurfaceView和SurfaceHolder,它与Camera.setPreviewDisplay最终联合完成SurfaceView与Camera的关联,即摄像头的画面展示在预览界面上
R.layout.activity_main); 27 28 mCamera = getCameraInstance(); 29 30 // 创建预览类,并与Camera关联,最后添加到界面布局中...java.io.IOException; import android.content.Context; import android.hardware.Camera; import android.util.Log; import android.view.SurfaceHolder...; import android.view.SurfaceView; /** * 定义一个预览类 */ public class CameraPreview extends SurfaceView...,而是等待屏幕的渲染引擎将内容推送到界面 在Android3.0之后弃用 mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS)...,第一次显示到界面的时候也会被调用 if (mHolder.getSurface() == null){ // 如果Surface为空,不继续操作
,到时候加载的时候把我们的SurfaceView直接add进来。...在图中的红线处我们按ALT+ENTER,把其要加载重写的方法加入进来 ?...然后我们先修改构造函数,在构造函数中获取的SurfaceHolder,并在其中加入回调和基本的参数设置,如下图 ?...而刚才生成的三个方法中,我们要在SurfaceCreated中加入开户摄像机的方法,在SurfaceDestroyed加入关闭摄像机的方法 ? 开启摄像机 ? ? 关闭摄像机 ?...当然在Android6.0中呢还要加入Camera的权限申请 void requestPermission(){ final int REQUEST_CODE = 1;
这个方法有多个重载版本,适应于不同的情况,既可以对使用文件路径作为参数,也可以使用描述文件位置的Uri作为参数 prepare() 在开始播放之前调用这个方法完成媒体文件的准备工作 start() 开始播放媒体文件文件...* setDisplay方法接收的是一个SurfaceHolder * 对象所以先要得到我们布局文件中的...* SurfaceView的SurfaceHolder对象,之后 * 设置长和宽,最后设置视频输出源 */...因为模拟器中没有媒体文件,所以用的真机进行的测试,单击“开始”按钮: ? 单击“暂停”按钮: ? 单击“停止”按钮之后又变成了第一幅图。...接下来在媒体文件路径输入控件EditText中输入一个视频的绝对路径: ? 成功的播放出来了视频!
setCamera : 设置摄像头对象 setPreviewDisplay : 设置预览界面。...第一个参数是左声道,第二个参数是右声道,取值在0-1之间。 setAudioStreamType : 设置音频流的类型。...import android.util.AttributeSet; import android.util.Log; import android.view.LayoutInflater; import android.view.SurfaceHolder...) findViewById(R.id.surfaceview); mProgressBar = (ProgressBar) findViewById(R.id.progressBar)...android.media.MediaPlayer.OnCompletionListener; import android.os.Bundle; import android.util.Log; import android.view.SurfaceHolder
,在Android中极其的简单,因为它是Android封装的一个方法,这个能不简单么。。。。。。...只不过它隐藏的比较深,它隐藏于Path类中,方法如下: android.graphics.Path.quadTo(float x1, float y1, float x2, float y2) Since...; 熟悉方法后,下面就来实现: SurfaceView框架不多讲,看过我博客的都应该知道的; 直接看MySurfaceView类,此类继承SurfaceView ,是游戏的主视图 这里为了更清晰的讲解:...这里部分代码先不贴出来了,最后会整体贴出,当然源码也是免费在最后提供~ 首先是定义相关的成员变量: // 贝赛尔曲线成员变量(起始点,控制(操作点),终止点,3点坐标) private int startX...这里我简单的统一的讲操作点设置成用户触屏点的x,y的一半,呵呵偷懒了~嘻嘻~ 我把贝赛尔的操作点写在了逻辑logic()函数中,不断的执行,并且每次利用nextInt函数得到随机的操作点,主要为了让其曲线不断的变化从而形成一个震动的曲线运动轨迹
RGB ARGB 32 应用程序在启动时系统为它创建一个进程,系统为每个进程创建dalvik虚拟机(模拟器设置的VM Heap),当图片的大小大于虚拟机的堆内存空间时,就内存溢出(内存泄露);...解决办法:缩放图片加载到内存 步骤: 1、获得设备屏幕的分辨率; 2、得到原图的分辨率; 3、通过比较得到一个合适的比例值; 4、按照比例值缩放图片 5、把图片显示在imageview 缩放图片并加载到内存中...iv.setImageBitmap(bm); } } 在内存中创建原图的副本(重点) 步骤: 1、得到原图; 2、创建一个空白的纸张,参考原图; 3、创建一个画板,参考空白纸张...(重点) surfaceview表面视图 双缓冲区:使用两个线程协调工作; surfaceview 重量级空间,当画面可见时,双缓冲器被创建,占用较高的cpu和内存资源。...1 引入vitamio框架 以library形式引入 2 在布局中定义VideoView <io.vov.vitamio.widget.VideoView android:id="@+id
; import android.os.Bundle; import android.util.SparseIntArray; import android.view.Surface; import android.view.SurfaceHolder...mSurfaceHolder; private Button btnStartStop; private boolean isRecording = false;//标记是否已经在录制...format, int width, int height) { // 将holder,这个holder为开始在onCreate...Override public void surfaceCreated(SurfaceHolder holder) { // 将holder,这个holder为开始在onCreate...public void surfaceDestroyed(SurfaceHolder holder) { // surfaceDestroyed的时候同时对象设置为null
, SurfaceView 相当与 Surface 的窗口, 只有在 SurfaceView 窗口区域内的才是可见的, 其它没有在窗口正下方的内容不可见; -- Surface 与 SurfaceView...SurfaceView 使用流程 (1) 在布局文件中使用 SurfaceView 组件 布局文件 : 在布局文件中使用 SurfaceView /> 组件; -- 示例 : SurfaceView...获取 SurfaceView : 使用 findViewById() 方法从布局文件中获取 SurfaceView 组件对象; surface_view = (SurfaceView) findViewById...从 SurfaceView 组件对象中获取 SurfaceHolder : 调用 SurfaceView 对象的 getHolder() 即可获取 SurfaceHolder 对象; surface_holder...AutoCompleteTextView 组件 组件特性 : 可以设置一个适配器, 适配器中维护一组字符串, 当输入一部份字符后, 能 自动将符合条件的提示出来; -- 示例 : (1) 在布局文件中定义组件
前言 通过前面几篇,利用SurfaceView显示Camera的图像已经没什么问题了,接下来我们就要打磨一下细节,主要就是手机旋转的问题,考虑到我们会用横屏和竖屏的不同的情况。...原来的代码中我们也只是解决了默认竖屏的问题 在StartCamera中,设置了直接旋转90度(不过我们改为SurfaceTexture这样显示后,这个没什么用了) ?...然后在构造函数中获取到当前windowmanager。 ?...Camera,在surfaceDestoryed中加入了关闭Camera,而surfaceChanged中什么也没写,这次这个方法就被我们用到了。...生成的图像后加入角度旋转 最后在我们nv21ToBitmap中的旋转角度改为我们已经定义的retatedegree ?