2014-04-17 43 views
4

我发现自己需要帮助。Android:我需要圆形相机预览。如何实现它?

我想开发这个简单的应用程序,拍照(哇,现在是原创!)。一切安好。我唯一需要的是有一个CIRCULAR CAMERA PREVIEW。

我有我的camerapreview类(它扩展了surfaceview)放置在一个框架布局,这是我的相机预览基本上。众所周知,这是矩形的。由于我有更大的应用程序计划,因此我需要将相机预览设置为循环(因此,例如,某人可以拍摄某人的脸部图像,并且可以在附近绘制一些图形)。

现在,我不知道如何继续。我尝试了不同的事情,用xml创建一个形状,并将其设置为我的框架布局的背景,但那不起作用。

花了几个小时在谷歌的解决方案,我决定,我不得不放弃,来到这里。

所以,如果有人知道任何事,请告诉我们:)我希望我已经清楚了,如果需要的话,请不要犹豫,要求澄清。

回答

1

您可以在相机预览上覆盖ImageView。将SurfaceViewImageView都置于FrameLayout之内match_parent并且图像必须位于最上方。 设置为中间有透明圆圈的黑色图像。

+0

没有工作,但有更多的我需要做的,我需要一些其他的解决方案。由于活动的背景颜色会根据用户的选择而改变,图像的矩形将保持为白色,因此不适合我的用途。也许我应该首先解释这一点,毫无疑问,你的解决方案工作得很好。 – user3494305

+1

如果您需要更改颜色或形状,您可以编写自定义的'View'并实现'onDraw'方法来绘制所需的形状。 –

+0

是的,我所做的是创建一个类实现surfaceview的绘图,我试图覆盖onDraw(Canvas c)。我只是在相机上画一个文本,但是我得到一个黑色的背景,我应该实际上看到我的相机预览。 在我的活动:帧= //获取我的框架布局参考 平局=新的绘图(本)//我的绘画课上的摄像头预览 camerapreview =新Camerapreview之上(这一点,照相机)绘制//我的相机预览类 frame.addView(camerapreview); frame.addView(draw); 通过这样做,我得到了黑色背景上的文字。 – user3494305

2

简单的方法:

1)不设置表面用于priview

2)赶上原始数据

3)转换成位图并进行circle

4)示出了(用于离。在imegeview上)

只适用于样品:

public class CameraRoundPriview extends ImageView { 
private Camera camera; 
private Bitmap bitmap = null; 
private int mPreviewWidth, mPreviewHeight; 
boolean mCameraOn = false; 

public CameraRoundPriview(Context context, AttributeSet attrs) { 
     super(context, attrs); 
} 

private Bitmap getclip() { 
    //clip 
    Bitmap output = Bitmap.createBitmap(bitmap.getHeight(), 
             bitmap.getHeight(), 
             Config.ARGB_8888); 
    Canvas canvas = new Canvas(output);  
    final int color = 0xff424242; 
    final Paint paint = new Paint(); 
    final Rect rect = new Rect(0, 0, bitmap.getHeight(), 
            bitmap.getHeight()); 

    paint.setAntiAlias(true); 
    canvas.drawARGB(0, 0, 0, 0); 
    canvas.drawCircle(bitmap.getHeight()/2, 
         bitmap.getHeight()/2, 
         bitmap.getHeight()/2, paint); 
    paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN)); 
    canvas.drawBitmap(bitmap, rect, rect, paint); 

    //rotate 
     android.hardware.Camera.CameraInfo info = new android.hardware.Camera.CameraInfo(); 
     android.hardware.Camera.getCameraInfo(getCameraID(), info); 
     int rotation = activity.getWindowManager().getDefaultDisplay().getRotation(); 
     int degrees = 0; 
     switch (rotation) { 
      case Surface.ROTATION_0: 
       degrees = 0; 
       break; 
      case Surface.ROTATION_90: 
       degrees = 90; 
       break; 
      case Surface.ROTATION_180: 
       degrees = 180; 
       break; 
      case Surface.ROTATION_270: 
       degrees = 270; 
       break; 
     } 

    int result = degrees; 
    if (android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.LOLLIPOP){ 
      if (info.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) { 
       result = (info.orientation + degrees) % 360; 
       result = (360 - result) % 360; // compensate the mirror 
      } else { // back-facing 
       result = (info.orientation - degrees + 360) % 360; 
      } 
    } 
    Matrix matrix = new Matrix(); 
    matrix.postRotate(result); 
    Bitmap scaledBitmap = Bitmap.createScaledBitmap(output,output.getWidth(),output.getHeight(),true); 
    Bitmap rotatedBitmap = Bitmap.createBitmap(scaledBitmap , 0, 0, scaledBitmap.getWidth(), scaledBitmap .getHeight(), matrix, true); 

    return rotatedBitmap; 
} 

private void showImage(){ 
    if ((bitmap != null)){ 
     this.setImageBitmap(getclip()); 
    } 
} 

public boolean onClickCamera(){ 
    if (mCameraOn){ 
     mCameraOn = false; 
     cameraStop(); 
    }else{ 
     mCameraOn = true; 
     cameraStart(); 
    } 
    return mCameraOn; 
} 

private void cameraStop(){ 
    if (camera == null) return; 
    camera.setPreviewCallback(null); 
    camera.release(); 
    camera = null; 
} 

private int getCameraID(){ 
    // specify camera id 
    return 0; 
} 

private void cameraStart(){ 
     Camera camera = Camera.open(getCameraID()); 
     final Camera.Size previewSize = camera.getParameters().getPreviewSize(); 
     mPreviewWidth     = previewSize.width; 
     mPreviewHeight     = previewSize.height; 

     try { 
     camera.setPreviewCallback(new PreviewCallback() { 
     public void onPreviewFrame(byte[] data, Camera camera_call) { 
     ByteArrayOutputStream outstr = new ByteArrayOutputStream(); 
     Rect rect = new Rect(0, 0, mPreviewWidth, mPreviewHeight); 
     YuvImage yuvimage=new YuvImage(data,ImageFormat.NV21,mPreviewWidth,mPreviewHeight,null); 
     yuvimage.compressToJpeg(rect, 50, outstr); 
     bitmap = BitmapFactory.decodeByteArray(outstr.toByteArray(), 0, outstr.size()); 
     showImage(); 
     camera_call.addCallbackBuffer(data); 
     } 
     }); 
     } catch (Exception e) {} 
     camera.startPreview(); 

     this.camera=camera; 
} 
} 
+0

谢谢你的工作很好 – Golnar