android 轨迹动画SurfaceView摄像头预览拍运行轨迹,求思路!

匿名用户不能发表回复!|
每天回帖即可获得10分可用分!小技巧:
你还可以输入10000个字符
(Ctrl+Enter)
请遵守CSDN,不得违反国家法律法规。
转载文章请注明出自“CSDN(www.csdn.net)”。如是商业用途请联系原作者。Android开发:Camera初探——控制摄像头拍照_Linux编程_Linux公社-Linux系统门户网站
你好,游客
Android开发:Camera初探——控制摄像头拍照
来源:Linux社区&
作者:lissdy
实习接触的项目中需要调用系统摄像头进行拍照,通过完成这个功能点暂时初步了解了中的Camera,当然目前只是停留在使用阶段,对于Camera的深度剖析有机会也要了解一下。
通过Camera控制摄像头拍照的步骤:
1.调用Camera的open()方法打开相机。
2.调用Camera的setParameters()方法获取拍照参数。该方法返回一个Camera.Parameters对象。
3.调用Camera.Paramers对象方法设置拍照参数
4.调用Camera的setParameters,并将Camera.Paramers作为参数传入,这样即可对相机的拍照参数进行控制
5.调用Camera的startPreview()方法开始预览取景,在预览取景之前需要调用Camera的setPreViewDisplay(SurfaceHolder holder)方法设置使用哪个SurfaceView来显示取景图片。
6.调用Camera的takePicture()方法进行拍照.
7.结束程序时,调用Camera的StopPriview()结束取景预览,并调用release()方法释放资源。
运行效果:
涉及Camera使用的相关代码:
private void initCamera()&{& if (!isPreview)& {& &camera = Camera.open();& //1.调用Camera的open()方法打开相机。& }& if (camera != null && !isPreview)& {& &try& &{& & //2.调用Camera的setParameters()方法获取拍照参数。该方法返回一个Camera.Parameters对象。& & Camera.Parameters parameters = camera.getParameters();& && & //3.调用Camera.Paramers对象方法设置拍照参数& & // 设置预览照片的大小& & parameters.setPreviewSize(screenWidth, screenHeight);& & // 每秒显示4帧& & parameters.setPreviewFrameRate(4);& & // 设置图片格式& & parameters.setPictureFormat(PixelFormat.JPEG);& & // 设置JPG照片的质量& & parameters.set("jpeg-quality",85);& & //设置照片的大小& & parameters.setPictureSize(screenWidth, screenHeight);& && & & & //4.调用Camera的setParameters,并将Camera.Paramers作为参数传入,这样即可对相机的拍照参数进行控制& & camera.setParameters(parameters);& && & /**& & *& 5.调用Camera的startPreview()方法开始预览取景,在预览取景之前需要调用& & *& Camera的setPreViewDisplay(SurfaceHolder holder)方法设置使用哪个SurfaceView来显示取景图片。& & *& 通过SurfaceView显示取景画面& & */& && & camera.setPreviewDisplay(surfaceHolder);& & // 开始预览& & camera.startPreview();& & // 自动对焦& & camera.autoFocus(afcb);& &}& &catch (Exception e)& &{& & e.printStackTrace();& &}& &isPreview =& }&}
& //设置监听器,触摸屏幕即拍照& sView.setOnTouchListener(new View.OnTouchListener() {& && &public boolean onTouch(View v, MotionEvent event) {& & // TODO Auto-generated method stub& & if(event.getAction()==MotionEvent.ACTION_DOWN){& & &if (camera != null)& & &{& & & // 6.调用Camera的takePicture()方法进行拍照.& & & camera.takePicture(null, null , myjpegCallback);& & && & &}& & }& && &}& });
相关资讯 & & &
& (03/23/:55)
& (02/17/:44)
& (02/17/:53)
& (02/17/:45)
& (02/17/:52)
& (02/17/:45)
   同意评论声明
   发表
尊重网上道德,遵守中华人民共和国的各项有关法律法规
承担一切因您的行为而直接或间接导致的民事或刑事法律责任
本站管理人员有权保留或删除其管辖留言中的任意内容
本站有权在网站内转载或引用您的评论
参与本评论即表明您已经阅读并接受上述条款3被浏览1720分享邀请回答public static void setCameraDisplayOrientation (Activity activity, int cameraId, android.hardware.Camera camera) {
android.hardware.Camera.CameraInfo info = new android.hardware.Camera.CameraInfo();
android.hardware.Camera.getCameraInfo (cameraId , info);
int rotation = activity.getWindowManager ().getDefaultDisplay ().getRotation ();
int degrees = 0;
switch (rotation) {
case Surface.ROTATION_0:
degrees = 0;
case Surface.ROTATION_90:
degrees = 90;
case Surface.ROTATION_180:
degrees = 180;
case Surface.ROTATION_270:
degrees = 270;
if (info.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) {
result = (info.orientation + degrees) % 360;
result = (360 - result) % 360;
// compensate the mirror
// back-facing
result = ( info.orientation - degrees + 360) % 360;
camera.setDisplayOrientation (result);
1添加评论分享收藏感谢收起写回答sponsored links
Android开发 摄像头SurfaceView预览 背景带矩形框 实现原理:双surfaceview,顶层画矩形框,底层预览视频
&&&&&& 为了能在摄像头预览的时候,背景有个矩形框、或一些坐标、横线来标示关键位置,真让杂家费劲心思了。苦苦研究了两天,毫无进展。baidu了若干资料,大都是提出这个问题,但怎么解决的没有说,都不了了之。后来转而google,又研究了两天,终于完美解决啦!
1,网上介绍的摄像头预览,一般是用一个surfaceview,为了能让其正常预览视频,设置属性&&&&&&
&mySurfaceView.setZOrderOnTop(true);&&&&&&&&
&mySurfaceHolder = mySurfaceView.getHolder();
&mySurfaceHolder.setFormat(PixelFormat.TRANSPARENT)
我先前也是在这种思路下,看能否加画个矩形框。这篇.cn/s/blog_4egfz.html文章提到一种方法,是用一个surfaceview,然后自己定义一个继承View的画矩形框的类DrawCaptureRect,经我实践,发现还是不中。用这种思路,在摄像头未预览的时候可以看到红色矩形框,但一点击预览,矩形框就被覆盖了。
2,还有一种思路是,在预览surfaceview的callback里面,取到canvas画布,然后画。这种思路也行不通,程序直接挂掉!
3,后来我想到了framelayout,用帧布局,融合第一种方法的思路,结果还是未能解决预览的时候,视频遮挡矩形框的问题。
4,还有人提出,给surfaceview或其所在的布局文件里加一个带矩形框的图片的方法,更是行不通!说这话的人真是站着不腰疼,别说背景设成带图片的矩形框,就是背景设成有颜色的,预览的surfaceview就不显示了,被遮挡了。
&&&&&&&&&&
原来,当SurfaceHolder对象的类型设置为SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS时就只能拍照不能绘制了,这就是为什么第二种思路程序会直接挂掉的原因。为了能够预览视频的同时绘制矩形框等信息,需要用两个同样大小的SurfaceView放在一个FrameLayout里,顶层的SurfaceView设成setZOrderOnTop(true);&&&setFormat(PixelFormat.TRANSPARENT)&;预览的Surfaceview这两个属性就不用设置了。
&&&&首先在包yan.guoqi.testphoto下新建一个类SVDraw,如图:
源码如下:
package yan.guoqi.
import android.content.C
import android.graphics.C
import android.graphics.C
import android.graphics.P
import android.graphics.Paint.S
import android.graphics.PixelF
import android.util.AttributeS
import android.view.SurfaceH
import android.view.SurfaceV
import android.view.V
/*定义一个画矩形框的类*/
public class SVDraw extends SurfaceView implements SurfaceHolder.Callback{
protected SurfaceH
private int mW
private int mH
public SVDraw(Context context, AttributeSet attrs) {
super(context, attrs);
// TODO Auto-generated constructor stub
sh = getHolder();
sh.addCallback(this);
sh.setFormat(PixelFormat.TRANSPARENT);
setZOrderOnTop(true);
public void surfaceChanged(SurfaceHolder arg0, int arg1, int w, int h) {
// TODO Auto-generated method stub
public void surfaceCreated(SurfaceHolder arg0) {
// TODO Auto-generated method stub
public void surfaceDestroyed(SurfaceHolder arg0) {
// TODO Auto-generated method stub
void clearDraw()
Canvas canvas = sh.lockCanvas();
canvas.drawColor(Color.BLUE);
sh.unlockCanvasAndPost(canvas);
public void drawLine()
Canvas canvas = sh.lockCanvas();
canvas.drawColor(Color.TRANSPARENT);
Paint p = new Paint();
p.setAntiAlias(true);
p.setColor(Color.RED);
p.setStyle(Style.STROKE);
//canvas.drawPoint(100.0f, 100.0f, p);
canvas.drawLine(0,110, 500, 110, p);
canvas.drawCircle(110, 110, 10.0f, p);
sh.unlockCanvasAndPost(canvas);
类里面的方法drawLine()就是画预览视频时背景矩形的,由于我需画一条线,上面程序就是画一条线和一个圆的。需要画什么图形,就在这里改!
注意在建这个类时构造函数里一定要有
&&&&public&SVDraw(Context&context,&AttributeSet&attrs)&{&&&&&&&&&&super(context,&attrs);&&
AttributeSet&attrs这个参数,否则是不能在xml文件里正常解析的。先前提到的.cn/s/blog_4egfz.html这位就没有引用这个参数,所以后来用了
addContentView(mDraw, new LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT))&
将这个对象加到布局中去!
上面的类建好之后,在布局文件里引用他,如下:
&?xml version=&1.0& encoding=&utf-8&?&
&LinearLayout xmlns:android=&/apk/res/android&
android:layout_width=&fill_parent&
android:layout_height=&fill_parent&
android:orientation=&vertical& &
&FrameLayout
android:id=&@+id/myFramelayout&
android:layout_width=&fill_parent&
android:layout_height=&800px&
android:orientation=&vertical& &
&SurfaceView
android:id=&@+id/mySurfaceView&
android:layout_width=&fill_parent&
android:layout_height=&fill_parent&
android:gravity=&center&
android:visibility=&visible& /&
&yan.guoqi.testphoto.SVDraw
android:id=&@+id/mDraw&
android:layout_width=&fill_parent&
android:layout_height=&fill_parent& /&
&/FrameLayout&
&LinearLayout
android:id=&@+id/LinearLayout01&
android:layout_width=&wrap_content&
android:layout_height=&wrap_content&
android:layout_gravity=&center&
android:orientation=&horizontal&
android:paddingTop=&10dip& &
android:id=&@+id/btnPreview&
android:layout_width=&wrap_content&
android:layout_height=&wrap_content&
android:text=&预览&
android:textSize=&28sp& /&
android:id=&@+id/btnPhoto&
android:layout_width=&wrap_content&
android:layout_height=&wrap_content&
android:text=&拍照&
android:textSize=&28sp& /&
android:id=&@+id/btnSave&
android:layout_width=&wrap_content&
android:layout_height=&wrap_content&
android:text=&保存&
android:textSize=&28sp& /&
&/LinearLayout&
&/LinearLayout&
注意上面两个surfaceview是同样大小的,mySurfaceView是预览视频的,mDraw是用来画矩形的。
接下来就是在主Activity里引用这个mDraw。首先定义变量private SVDraw& mSVDraw =& 然后mSVDraw = (yan.guoqi.testphoto.SVDraw)findViewByIf(R.id.mDraw)。之后mSVDraw就可以用了,至于什么时候来画这个矩形,有人是在按下拍照按钮后,我选择的是在按下预览按钮后,
case R.id.btnPreview:
Toast.makeText(TestPhotoActivity.this,
&您按了预览按钮&,
Toast.LENGTH_SHORT).show();
initCamera();
mDraw.setVisibility(View.VISIBLE);
mDraw.drawLine();
让其可见,然后调用drawLine()方法就可以了!你可以随时控制让其可见或者隐藏!
将上面这些代码融合我http://blog.csdn.net/yanzi1225627/article/details/7926994文章里http://download.csdn.net/detail/yanzi8626这里的源码就可以了!即可以预览,自动聚焦,缩放标准大小,背景有矩形框!
来张图,有图有真相
反思:其实用第一种.cn/s/blog_4egfz.html这里的思路和本篇的思路合并起来,应该也是可行的,只不过一个是继承的view一个是surfaceview,将AttributeSet&attrs加上。只要处理好谁是顶层的view谁设成透明,预览视频的surfaceview设成底层,在且要在xml属性文件里设成visible就可以了。有兴趣的自己试验吧。感谢大牛http://blog.csdn.net/xinzheng_wang/article/details/7712285对后生的指点!
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& -------------------作者yanzi1225627,转载请注明
很多情况下,我们要适当的改变开发系统的样式以满足项目的需求,这个就需要我们了解一下android系统自带的样式有哪些,具体是什么作用!因为今天遇到了一个问题,写了一个自定义的软键盘,发现每一个按钮的提示框字体颜色和背景颜色一样了,什么也看不到,于是就修改了一下这个activity的主题,这样效果就出来了! 看一下图:
添加很 ...
挺复杂的画图的,刚好用到shape的方面,查了些资料.转载了下,这个高手的文章,做个收藏,如有侵权,请告之,即删除. 众所周知,在Android开发里,为了优化在各种分辨率设备上的显示效果,同一份图片素材往往要提供mdpi.hdpi.xhdpi三种(以前还有ldpi),尤其是按钮类的素材,考虑到normal.pressed.focused更是需要至少3×3= ...
http://blog.csdn.net/yanzi1225627/article/details/7926994前文已经实现了自动聚焦,但末尾遗留了一个小问题.经我研究发现,是我程序里面的自动聚焦所放的位置有问题.原来只在按下预览按钮,会执行initCamera,但当连续两次按预览后,程序就会没有入口了.也就是第二次if(myCamera!=null &a ...
Button或者ImageButton的背景设为透明或者半透明 半透明&Button android:background=&#e0000000& ... /& 透明&Button android:background=&#& ... /& 颜 色和不透明度 (alpha) 值以 ...Android摄像头:只拍摄SurfaceView预览界面特定区域内容(矩形框)---完整实现(原理:底层SurfaceView+上层绘制ImageView)
http://blog.csdn.net/yanzi1225627/article/details/8580034
最近一直在审视以前做过的东西,关于android摄像头预览,预览界面上呈现矩形框,在前文(
Android开发 摄像头SurfaceView预览 背景带矩形框 实现(原理:双surfaceview,顶层画矩形框,底层预览视频)
)----http://blog.csdn.net/yanzi1225627/article/details/7934710已经实现。
最近一直在审视以前做过的东西,关于android摄像头预览,预览界面上呈现矩形框,在前文(
)----http://blog.csdn.net/yanzi1225627/article/details/7934710已经实现。最近发现上层绘制矩形框,用surfaceview有点大材小用了。SurfaceView绘制动画更合适,只绘制个矩形框用ImageView足够了。但有些时候必须要用SurfaceView来实现。比如360手机安全卫士扫描二维码的实现应该就是通过上下两层SurfaceView实现的(见下图)。上层SurfaceView用于显示那个可以旋转的扫描示意框,底层SurfaceView预览摄像头视频。
废话不说了,稍候几天我会仿照上面360这个扫描二维码的界面做一个工程(结合PreviewCallback),公开出来。这次先谈用底层surfaceView+上层ImageView实现只拍摄矩形框中的图像。新建一个类继承ImageView,源码如下:
布局文件里与前文http://blog.csdn.net/yanzi1225627/article/details/8577756这里一样,只是在帧布局里加一个上面自定义的DrawImageView,整个布局文件示下:
在主程序文件里,onCreate()函数里设置底层SurfaceView为底层且透明(如果不设也可以,默认就是如此):
mPreviewSV.setZOrderOnTop(false);
mySurfaceHolder.setFormat(PixelFormat.TRANSPARENT);//translucent半透明 transparent透明
在主UI线程里的onCreate()函数里添加代码:
//绘制矩形的ImageView
mDrawIV = (yan.guoqi.rectphoto.DrawImageView)findViewById(R.id.drawIV);
mDrawIV.onDraw(new Canvas());
看上面的DrawImageView的函数里的onDraw,画的矩形是Rect(100, 200, 400, 500)。在onPictureTaken(byte[] data, Camera camera)函数里,先将图片旋转90度,大小成为宽×高(960×1280)。由于预览surfaceview的大小是宽×高(540×800),所以在onPictureTaken函数里将960×1280的图片缩放到540×800, 缩放相同大小后就可以用矩阵的坐标直接截取子图了。核心函数就是这两句:
//将960×1280缩放到540×800
Bitmap sizeBitmap = Bitmap.createScaledBitmap(rotaBitmap, 540, 800, true);
Bitmap rectBitmap = Bitmap.createBitmap(sizeBitmap, 100, 200, 300, 300);//截取
注意这个截取的函数参数和矩阵的坐标关系,分别是x轴 y轴起始坐标及 x轴宽度 y轴宽度。截取出来的图片大小应该是300×300. onPictureTaken()函数的源码如下:
涉及到的其他函数如saveJpeg()参见前文:
http://blog.csdn.net/yanzi1225627/article/details/8577756
重复的东西我就不发了。
效果图如下所示:
点击拍照,查看保存后的图片如下:
1,SurfaceView为啥 无论translucent半透明还是 transparent透明基本没啥区别?而且surfaceview的setAlpha函数不能用。
2,在这里surfaceview一定要在底层(默认如此),如果设成顶层会看不到红色矩形框。可以自己测试下。
3,最纠结的一点,第一副图片里的360扫描二维码的界面,底层的预览surfaceview是半透明的,底色是灰色的,只有中间的扫描矩形框是透明的,亮色。这一块究竟是怎么实现的??下午实验了n种方法愣是无济于事。我擦。。。如果有高人,希望能不吝指点下。 不过说实话,人家已经设计出来的产品界面看着就是好,不得不服阿。以后要多多模仿钻研这些成型产品的设计。
源码下载:
版权声明:本文内容由互联网用户自发贡献,本社区不拥有所有权,也不承担相关法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件至: 进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容。
用云栖社区APP,舒服~
【云栖快讯】他,一路保送,但可能不是你想象中的学霸; 他,曾是微软最年轻的技术管理者,挑战带领跨国团队; 他,后来加入阿里,成为阿里西雅图分部的第22名员工;
他,就是阿里通用计算平台负责人关涛! 云栖社区通过短视频,为你揭晓他的成长和开发计算平台的经历,以及他对未来的展望!&&
基于深度学习技术及阿里巴巴多年的海量数据支撑, 提供多样化的内容识别服务,能有效帮助用户降低违规风险。其产品包括...
阿里云移动APP解决方案,助力开发者轻松应对移动app中随时可能出现的用户数量的爆发式增长、复杂的移动安全挑战等...
通过在客户自己的数据中心内交付完整的阿里云软件堆栈,阿里云专有云帮助政企客户向混合云架构平滑演进,实现从IT时代...
为您提供简单高效、处理能力可弹性伸缩的计算服务,帮助您快速构建更稳定、安全的应用,提升运维效率,降低 IT 成本...
社区之星年度评选,投票可抽奖
Loading...}

我要回帖

更多关于 多摄像头轨迹跟踪 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信