我已经编写了使用Custom Camera的代码,为此我使用的是SurfaceView,现在我想知道如果我需要实现Zoom IN和OUT功能,我从未使用过这种应用程序.

我的代码,我用来创建自定义相机,见下文:

MainActivity.java:-

public class MainActivity extends Activity {

    private SurfaceView preview=null;   
    private SurfaceHolder previewHolder=null;   
    public Camera camera ;    
    private boolean inPreview=false;   
    ImageButton btnCapture;


    @SuppressWarnings("deprecation")
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);     

            preview=(SurfaceView)findViewById(R.id.surface);     
            previewHolder=preview.getHolder();    
            previewHolder.addCallback(surfaceCallback);    
            previewHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 
            previewHolder.setFixedSize(getwindow().getwindowManager()     
                    .getDefaultdisplay().getWidth(),getwindow().getwindowManager() 
                    .getDefaultdisplay().getHeight()); 

      btnCapture = (ImageButton) findViewById(R.id.btnCapture);

      btnCapture.setonClickListener(new View.OnClickListener() {
          @Override
          public void onClick(View v) {
           Toast.makeText(getApplicationContext(),"Capture Image(s)",Toast.LENGTH_LONG).show();           
          }
      });
    }

    @Override
    public void onResume() {  
        super.onResume();   
        camera=Camera.open(); 
    }  

    @Override   
    public void onPause() {  
        super.onPause();  
        if (inPreview) {  
            camera.stopPreview();   }   
        camera.release();   
        camera=null;   
        inPreview=false;         
    }   


    private Camera.Size getBestPreviewSize(int width,int height,Camera.Parameters parameters){   
        Camera.Size result=null;   
        for (Camera.Size size : parameters.getSupportedPreviewSizes()) 
        {   
            if (size.width<=width && size.height<=height)
            {
                if (result==null) {  
                    result=size;   
                }   else {  
                    int resultArea=result.width*result.height; 
                    int newArea=size.width*size.height;  
                    if (newArea>resultArea) {   
                        result=size;   
                    }  
                }   
            }   
        }   
        return(result);   
    }

    SurfaceHolder.Callback surfaceCallback=new SurfaceHolder.Callback(){

        public void surfaceCreated(SurfaceHolder holder) {     
            try {        
                camera.setPreviewdisplay(previewHolder); 
            }   catch (Throwable t) {   
                Log.e("PreviewDemo-surfaceCallback","Exception in setPreviewdisplay()",t);
                Toast.makeText(MainActivity.this,t.getMessage(),Toast.LENGTH_LONG).show();       
            }     
        }      

        public void surfaceChanged(SurfaceHolder holder,int format,int width,int height) {
            Camera.Parameters parameters=camera.getParameters();       
            Camera.Size size=getBestPreviewSize(width,height,parameters);       
            if (size!=null) {      
                parameters.setPreviewSize(size.width,size.height);
                camera.setParameters(parameters);       
                camera.startPreview();       
                inPreview=true;       
            }     
        }

        public void surfaceDestroyed(SurfaceHolder holder) {

        }   
    };       
}

activity_main.xml中: –

<RelativeLayout 
   xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:background="@drawable/splash_background" >

    <android.view.SurfaceView   
        android:id="@+id/surface"  
        android:layout_width="fill_parent"  
        android:layout_height="fill_parent" />

    <ImageButton
        android:id="@+id/btnCapture"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_centerHorizontal="true"
        android:background="@drawable/capture"
        android:contentDescription="@string/app_name" />

    </RelativeLayout>

解决方法

下面是缩放功能的示例代码.请尝试它是否可以帮助您:
public class DemoActivity extends Activity {

private FrameLayout pCameraLayout = null; // this layout contains surfaceview
private ZoomControls zoomControls ;
Camera mCamera=null;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // Todo Auto-generated method stub
        super.onCreate(savedInstanceState);

        enableZoom();
    }   

    private void enableZoom() {
        zoomControls = new ZoomControls(this);
        zoomControls.setIsZoominenabled(true);
        zoomControls.setIsZoomOutEnabled(true);
        zoomControls.setonZoomInClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                // Todo Auto-generated method stub
                zoomCamera(false);

            }
        });
        zoomControls.setonZoomOutClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                // Todo Auto-generated method stub

                zoomCamera(true);
            }
        });
        pCameraLayout.addView(zoomControls);
    }

    /** 
     * Enables zoom feature in native camera .  Called from listener of the view 
     * used for zoom in  and zoom out.
     * 
     * 
     * @param zoomInorOut  "false" for zoom in and "true" for zoom out
     */
    public void zoomCamera(boolean zoomInorOut) {
        if(mCamera!=null) {
            Parameters parameter = mCamera.getParameters();

            if(parameter.isZoomSupported()) {
                int MAX_ZOOM = parameter.getMaxZoom();
                int currnetZoom = parameter.getZoom();
                    if(zoomInorOut && (currnetZoom <MAX_ZOOM && currnetZoom >=0)) {
                        parameter.setZoom(++currnetZoom);
                    }
                    else if(!zoomInorOut && (currnetZoom <=MAX_ZOOM && currnetZoom >0)) {
                    parameter.setZoom(--currnetZoom);
                    }
            }
            else
                Toast.makeText(context,"Zoom Not Avaliable",Toast.LENGTH_LONG).show();

            mCamera.setParameters(parameter);
        }
    }

android – SurfaceView使用自定义相机缩放IN和OUT功能的更多相关文章

  1. android – 从自定义SurfaceView获取位图

    我在一个扩展表面视图并实现runnable的类中有这个代码我能够使用该类基本上允许您使用不同的颜色等绘制到画布.我正在尝试获得一种方法,允许我在绘制图像后保存图像,这是方法.无论我做什么,我只是得到一个黑色的图像,没有任何东西.有任何想法吗?

  2. Android在相机预览上绘制

    如何在不分层SurfaceView的情况下执行此操作?解决方法你不能在具有Type.PUSH_BUFFERS的SurfaceView上进行locK和绘图.您必须在Z方向上创建原始视图上方的另一个视图,并在该视图中的SurfaceView上绘制.因此,在main.xml中,在FrameLayout中的原始视图下创建一个自定义视图.在活动视图中创建和处理SurfaceView.将此视图添加到相机预览显示中.通过SurfaceHolder启动自定义视图.在此视图中可以在画布上锁定和绘制.

  3. Android Surfaceview线程和内存泄漏

    我在android中创建一个游戏,我注意到游戏有内存泄漏.我设法将内存泄漏隔离到一个较小的应用程序,以便我可以看到很好的尝试和解决,如何解决它.该应用程序使用一个surfaceview作为其视图,并附加一个线程,以便完成所有绘图到屏幕.当我开始一个新活动并关闭我当前正在使用的活动时,会发生内存泄漏.当我在我的测试应用程序上执行内存转储时,我可以看到这一点,因为它只是打开并关闭一个活动(活动a–>活

  4. android – 在SurfaceView加载Camera Preview时显示我的布局

    我在BG线程中创建Cameraview的解决方案解决了无响应问题.但未能在SurfaceView中显示Camera输出.解决方案是从xml中删除SurfaceView.这将立即启动您的活动.加载新的“活动”布局后,可以以编程方式将新的SurfaceView添加到屏幕上.当然,这也需要时间,但您的UI会快速切换到新活动,并且您可以在SurfaceView和Camera加载时显示加载程序!

  5. android – 设置Surface View的背景颜色

    我想将表面视图的背景颜色设置为我的相机表面视图.我使用this来实现相同的功能.但这个例子并不完整.任何人都可以帮助我一些其他有用的链接.谢谢解决方法有一个解决方法来做到这一点.>为surfaceview添加父视图组,将背景颜色设置为此视图组而不是surfaceview;>为SurfaceView实例添加以下内容;现在你得到你想要的背景颜色,而surfaceview是tanslucent.

  6. Media Recorder在Android摄像头启动失败

    我正在制作视频录制应用程序,我想在其中显示预览,当用户点击录制按钮时,它开始录制,当用户点击停止按钮时,它停止录制.我在我的表面上进行了视频预览,但是当我按下开始按钮时,它会出现错误“MEDIA.RECORDER.START(NativeMEthod)”.这是我的代码请帮帮我们.}记录是解决方法我发现这个解决方案和它的工作正常,我解决了这个问题:)对于2.3android:只是改变:至:

  7. android – surfaceView.getHolder没有返回SurfaceHolder

    我正在尝试编写使用相机的应用程序.在尝试获取我最终传递给启动摄像头的surfaceCreated()的surfaceHolder时,我得到一个NullPointerException.getHolder()返回NULL时有什么情况吗?谢谢.解决方法开始一个新的答案,希望更清楚.同样,我认为根本问题是你在onCreate和onResume上做的事情的数量.我认为您遇到的根本问题是视图/活动生命周期的

  8. android – SurfaceView使用自定义相机缩放IN和OUT功能

    我已经编写了使用CustomCamera的代码,为此我使用的是SurfaceView,现在我想知道如果我需要实现ZoomIN和OUT功能,我从未使用过这种应用程序.我的代码,我用来创建自定义相机,见下文:MainActivity.java:-activity_main.xml中:–解决方法下面是缩放功能的示例代码.请尝试它是否可以帮助您:

  9. android – TextureView中的抗锯齿

    我尝试使用SurfaceView和TextureView播放相同的视频,并注意到使用TextureView渲染的图像比使用SurfaceView更具别名.这是什么原因?有没有办法配置TextureView的渲染看起来更好?TextureView的用法如下:而对于SurfaceView:解决方法好吧,似乎在TextureView上应用缩放就可以实现我正在寻找的“平滑”效果.这听起来像是一个奇怪的黑客……但它确实有效.挖掘改变渲染方面的缩放比例会很有趣……

  10. android – Gradient在SurfaceView中显示为带状,但在普通视图中看起来非常流畅

    崔佛解决方法最后通过将其添加到SurfaceView的构造函数中找到了解决方案:

随机推荐

  1. bluetooth-lowenergy – Altbeacon库无法在Android 5.0上运行

    昨天我在Nexus4上获得了Android5.0的更新,并且altbeacon库停止了检测信标.似乎在监视和测距时,didEnterRegion和didRangeBeaconsInRegion都没有被调用.即使RadiusNetworks的Locate应用程序现在表现不同,一旦检测到信标的值,它们就不再得到更新,并且通常看起来好像信标超出了范围.我注意到的一点是,现在在logcat中出现以下行“B

  2. android – react-native动态更改响应者

    我正在使用react-native进行Android开发.我有一个视图,如果用户长按,我想显示一个可以拖动的动画视图.我可以使用PanResponder实现这一点,它工作正常.但我想要做的是当用户长按时,用户应该能够继续相同的触摸/按下并拖动新显示的Animated.View.如果您熟悉Google云端硬盘应用,则它具有类似的功能.当用户长按列表中的任何项目时,它会显示可拖动的项目.用户可以直接拖

  3. android – 是否有可能通过使用与最初使用的证书不同的证书对其进行签名来发布更新的应用程序

    是否可以通过使用与最初使用的证书不同的证书进行签名来发布Android应用程序的更新?我知道当我们尝试将这样的构建上传到市场时,它通常会给出错误消息.但有没有任何出路,比如将其标记为主要版本,指定市场中的某个地方?解决方法不,你不能这样做.证书是一种工具,可确保您是首次上传应用程序的人.所以总是备份密钥库!

  4. 如何检测Android中是否存在麦克风?

    ..所以我想在让用户访问语音输入功能之前检测麦克风是否存在.如何检测设备上是否有麦克风.谢谢.解决方法AndroidAPI参考:hasSystemFeature

  5. Android – 调用GONE然后VISIBLE使视图显示在错误的位置

    我有两个视图,A和B,视图A在视图B上方.当我以编程方式将视图A设置为GONE时,它将消失,并且它正下方的视图将转到视图A的位置.但是,当我再次将相同的视图设置为VISIBLE时,它会在视图B上显示.我不希望这样.我希望视图B回到原来的位置,这是我认为会发生的事情.我怎样才能做到这一点?编辑–代码}这里是XML:解决方法您可以尝试将两个视图放在RelativeLayout中并相对于彼此设置它们的位置.

  6. android – 获得一首歌的流派

    我如何阅读与歌曲相关的流派?我可以读这首歌,但是如何抓住这首歌的流派,它存放在哪里?解决方法检查此代码:

  7. android – 使用textShadow折叠工具栏

    我有一个折叠工具栏的问题,在展开状态我想在文本下面有一个模糊的阴影,我使用这段代码:用:我可以更改textColor,它可以工作,但阴影不起作用.我为阴影尝试了很多不同的值.是否可以为折叠文本投射阴影?

  8. android – 重用arm共享库

    我已经建立了armarm共享库.我有兴趣重用一个函数.我想调用该函数并获得返回值.有可能做这样的事吗?我没有任何头文件.我试过这个Android.mk,我把libtest.so放在/jni和/libs/armeabi,/lib/armeabi中.此时我的cpp文件编译,但现在是什么?我从objdump知道它的名字编辑:我试图用这个android.mk从hello-jni示例中添加prebuild库:它工作,但libtest.so相同的代码显示以下错误(启动时)libtest.so存在于libhello-j

  9. android – 为NumberPicker捕获键盘’Done’

    我有一个AlertDialog只有一些文本,一个NumberPicker,一个OK和一个取消.(我知道,这个对话框还没有做它应该保留暂停和恢复状态的事情.)我想在软键盘或其他IME上执行“完成”操作来关闭对话框,就像按下了“OK”一样,因为只有一个小部件可以编辑.看起来处理IME“Done”的最佳方法通常是在TextView上使用setonEditorActionListener.但我没有任何Te

  10. android – 想要在调用WebChromeClient#onCreateWindow时知道目标URL

    当我点击一个带有target=“_blank”属性的超链接时,会调用WebChromeClient#onCreateWindow,但我找不到新的窗口将打开的新方法?主页url是我唯一能知道的东西?我想根据目标网址更改应用行为.任何帮助表示赞赏,谢谢!

返回
顶部