2012-05-06 2 views
1

Я хотел бы сделать приложение, которое имеет 2 действия. Первый из них - это CameraPreview из демонстраций api, которые по умолчанию имеют меню опций. Я добавил к нему вторую кнопку, которая запускает второе действие, что такое ImageSwitcher. Я хочу вернуть выбранную фотографию перед просмотром с указанной шириной и высотой.Как поставить изображение перед камерой Предварительный просмотр

Этот блок отлично подходит для получения и появляются фотографии в методе OnCreate равнины активности, но я не знаю, как сделать это с CameraPreview:

setContentView(R.layout.picturelay);      
int theID = getIntent().getExtras().getInt("the_image_id"); 
ImageView i = (ImageView) findViewById(R.id.cameralay); 
i.setImageResource(theID); 

Моей начальной активность:

public class CameraPreview extends Activity { 
     private 
     Preview mPreview; 
     Camera mCamera;  
     int numberOfCameras; 
     int cameraCurrentlyLocked; 
     String uzenet; 
     // The first rear facing camera 
     int defaultCameraId; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     // Hide the window title. 
     requestWindowFeature(Window.FEATURE_NO_TITLE); 
     getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);         

     // Create a RelativeLayout container that will hold a SurfaceView, 
     // and set it as the content of our activity. 
     mPreview = new Preview(this); 

     setContentView(mPreview);    

     try { 

      int theID = getIntent().getExtras().getInt("the_image_id"); 
      ImageView i = (ImageView) findViewById(R.id.cameralay); 
     i.setImageResource(theID);  

     } catch (Exception e){ 

      Toast.makeText(this, e.getMessage(), Toast.LENGTH_LONG); 

     } 



     // Find the total number of cameras available 
     numberOfCameras = Camera.getNumberOfCameras(); 

     // Find the ID of the default camera 
     CameraInfo cameraInfo = new CameraInfo(); 
      for (int i = 0; i < numberOfCameras; i++) { 
       Camera.getCameraInfo(i, cameraInfo); 
       if (cameraInfo.facing == CameraInfo.CAMERA_FACING_BACK) { 
        defaultCameraId = i; 
       } 
      } 
    } 




    @Override 
    protected void onResume() { 
     super.onResume(); 

     // Open the default i.e. the first rear facing camera.   
     mCamera = Camera.open(); 
     cameraCurrentlyLocked = defaultCameraId; 
     mPreview.setCamera(mCamera); 

    } 

    @Override 
    protected void onPause() { 
     super.onPause(); 

     // Because the Camera object is a shared resource, it's very 
     // important to release it when the activity is paused. 
     if (mCamera != null) { 
      mPreview.setCamera(null); 
      mCamera.release(); 
      mCamera = null; 
     } 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 

     // Inflate our menu which can gather user input for switching camera 
     MenuInflater inflater = getMenuInflater(); 
     inflater.inflate(R.menu.camera_menu, menu); 
     return true; 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     // Handle item selection 
     switch (item.getItemId()) { 
     case R.id.switch_cam: 
      // check for availability of multiple cameras 
      if (numberOfCameras == 1) { 
       AlertDialog.Builder builder = new AlertDialog.Builder(this); 
       builder.setMessage(this.getString(R.string.camera_alert)) 
         .setNeutralButton("Close", null); 
       AlertDialog alert = builder.create(); 
       alert.show(); 
       return true; 
      } 


      // OK, we have multiple cameras. 
      // Release this camera -> cameraCurrentlyLocked 
      if (mCamera != null) { 
       mCamera.stopPreview(); 
       mPreview.setCamera(null); 
       mCamera.release(); 
       mCamera = null; 
      } 

      // Acquire the next camera and request Preview to reconfigure 
      // parameters. 
      mCamera = Camera 
        .open((cameraCurrentlyLocked + 1) % numberOfCameras); 
      cameraCurrentlyLocked = (cameraCurrentlyLocked + 1) 
        % numberOfCameras; 
      mPreview.switchCamera(mCamera); 

      // Start the preview 
      mCamera.startPreview(); 
      return true;     

     case R.id.get_picture: 

      Intent intent2 = new Intent(CameraPreview.this, ImageSwitcher1.class); 
      //startActivityForResult(intent, 0); 
      startActivity(intent2); 
      return true;  

     } 
     return super.onOptionsItemSelected(item); 
    } 
    } 


    class Preview extends ViewGroup implements SurfaceHolder.Callback { 
     private final String TAG = "Preview"; 

     SurfaceView mSurfaceView; 
     SurfaceHolder mHolder; 
     Size mPreviewSize; 
     List<Size> mSupportedPreviewSizes; 
     Camera mCamera; 



    Preview(Context context) { 
     super(context);     

     mSurfaceView = new SurfaceView(context); 
     addView(mSurfaceView); 

     // Install a SurfaceHolder.Callback so we get notified when the 
     // underlying surface is created and destroyed. 
     mHolder = mSurfaceView.getHolder(); 
     mHolder.addCallback(this); 
     mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);   
    } 

    public void setCamera(Camera camera) { 
     mCamera = camera; 
     if (mCamera != null) { 
      mSupportedPreviewSizes = mCamera.getParameters().getSupportedPreviewSizes(); 
      requestLayout();    
     } 
    } 

    public void switchCamera(Camera camera) { 
     setCamera(camera); 
     try { 
      camera.setPreviewDisplay(mHolder); 
     } catch (IOException exception) { 
      Log.e(TAG, "IOException caused by setPreviewDisplay()", exception); 
     } 
     Camera.Parameters parameters = camera.getParameters(); 
     parameters.setPreviewSize(mPreviewSize.width, mPreviewSize.height); 
     requestLayout(); 

     camera.setParameters(parameters); 
    } 

    @Override 
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 
     // We purposely disregard child measurements because act as a 
     // wrapper to a SurfaceView that centers the camera preview instead 
     // of stretching it. 
     final int width = resolveSize(getSuggestedMinimumWidth(), widthMeasureSpec); 
     final int height = resolveSize(getSuggestedMinimumHeight(), heightMeasureSpec); 
     setMeasuredDimension(width, height); 

     if (mSupportedPreviewSizes != null) { 
      mPreviewSize = getOptimalPreviewSize(mSupportedPreviewSizes, width, height); 
     }   
    } 

    @Override 
    protected void onLayout(boolean changed, int l, int t, int r, int b) { 
     if (changed && getChildCount() > 0) { 
      final View child = getChildAt(0); 

      final int width = r - l; 
      final int height = b - t; 

      int previewWidth = width; 
      int previewHeight = height; 
      if (mPreviewSize != null) { 
       previewWidth = mPreviewSize.width; 
       previewHeight = mPreviewSize.height; 
      } 

      // Center the child SurfaceView within the parent. 
      if (width * previewHeight > height * previewWidth) { 
       final int scaledChildWidth = previewWidth * height/previewHeight; 
       child.layout((width - scaledChildWidth)/2, 0, 
         (width + scaledChildWidth)/2, height); 
      } else { 
       final int scaledChildHeight = previewHeight * width/previewWidth; 
       child.layout(0, (height - scaledChildHeight)/2, 
         width, (height + scaledChildHeight)/2); 
      } 
     } 
    } 

    public void surfaceCreated(SurfaceHolder holder) { 
     // The Surface has been created, acquire the camera and tell it where 
     // to draw. 
     try { 
      if (mCamera != null) { 
       mCamera.setPreviewDisplay(holder); 
      } 
     } catch (IOException exception) { 
      Log.e(TAG, "IOException caused by setPreviewDisplay()", exception); 
     }   
    } 

    public void surfaceDestroyed(SurfaceHolder holder) { 
     // Surface will be destroyed when we return, so stop the preview. 
     if (mCamera != null) { 
      mCamera.stopPreview(); 
     } 
    } 


    private Size getOptimalPreviewSize(List<Size> sizes, int w, int h) { 
     final double ASPECT_TOLERANCE = 0.1; 
     double targetRatio = (double) w/h; 
     if (sizes == null) return null; 

     Size optimalSize = null; 
     double minDiff = Double.MAX_VALUE; 

     int targetHeight = h; 

     // Try to find an size match aspect ratio and size 
     for (Size size : sizes) { 
      double ratio = (double) size.width/size.height; 
      if (Math.abs(ratio - targetRatio) > ASPECT_TOLERANCE) continue; 
      if (Math.abs(size.height - targetHeight) < minDiff) { 
       optimalSize = size; 
       minDiff = Math.abs(size.height - targetHeight); 
      } 
     } 

     // Cannot find the one match the aspect ratio, ignore the requirement 
     if (optimalSize == null) { 
      minDiff = Double.MAX_VALUE; 
      for (Size size : sizes) { 
       if (Math.abs(size.height - targetHeight) < minDiff) { 
        optimalSize = size; 
        minDiff = Math.abs(size.height - targetHeight); 
       } 
      } 
     } 
     return optimalSize; 
    } 

    public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) { 
     // Now that the size is known, set up the camera parameters and begin 
     // the preview. 
     Camera.Parameters parameters = mCamera.getParameters(); 
     parameters.setPreviewSize(mPreviewSize.width, mPreviewSize.height); 
     requestLayout();   

     mCamera.setParameters(parameters); 
     mCamera.startPreview();   

    } 


} 

Вторая активность:

public class ImageSwitcher1 extends Activity implements 
     AdapterView.OnItemSelectedListener, ViewSwitcher.ViewFactory { 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     requestWindowFeature(Window.FEATURE_NO_TITLE); 

     setContentView(R.layout.image_switcher_1); 

     mSwitcher = (ImageSwitcher) findViewById(R.id.switcher); 
     mSwitcher.setFactory(this); 
     mSwitcher.setInAnimation(AnimationUtils.loadAnimation(this, 
       android.R.anim.fade_in)); 
     mSwitcher.setOutAnimation(AnimationUtils.loadAnimation(this, 
       android.R.anim.fade_out)); 

     Gallery g = (Gallery) findViewById(R.id.gallery); 
     g.setAdapter(new ImageAdapter(this)); 
     g.setOnItemSelectedListener(this); 

     g.setOnItemClickListener(new OnItemClickListener() { 
      public void onItemClick(AdapterView parent, View v, int position, long id) { 


       Intent intent = new Intent(ImageSwitcher1.this, CameraPreview.class); 
       intent.putExtra("the_image_id", mImageIds[position]);   

       startActivity(intent); 

       finish(); 
      } 
     }); 
    } 

    public void onItemSelected(AdapterView parent, View v, int position, long id) { 
     mSwitcher.setImageResource(mImageIds[position]); 
    } 

    public void onNothingSelected(AdapterView parent) { 
    } 

    public View makeView() { 
     ImageView i = new ImageView(this); 
     i.setBackgroundColor(0xFF000000); 
     i.setScaleType(ImageView.ScaleType.FIT_CENTER); 
     i.setLayoutParams(new ImageSwitcher.LayoutParams(LayoutParams.MATCH_PARENT, 
       LayoutParams.MATCH_PARENT)); 
     return i; 
    } 

    private ImageSwitcher mSwitcher; 

    public class ImageAdapter extends BaseAdapter { 
     public ImageAdapter(Context c) { 
      mContext = c; 
     } 

     public int getCount() { 
      return mThumbIds.length; 
     } 

     public Object getItem(int position) { 
      return position; 
     } 

     public long getItemId(int position) { 
      return position; 
     } 

     public View getView(int position, View convertView, ViewGroup parent) { 
      ImageView i = new ImageView(mContext); 

      i.setImageResource(mThumbIds[position]); 
      i.setAdjustViewBounds(true); 
      i.setLayoutParams(new Gallery.LayoutParams(
        LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)); 
      i.setBackgroundResource(R.drawable.picture_frame); 
      return i; 
     } 

     private Context mContext; 

    } 

    private Integer[] mThumbIds = { 
      R.drawable.1, R.drawable.2, 
      R.drawable.3, R.drawable.4, 
      R.drawable.5, R.drawable.6, 
      R.drawable.7, R.drawable.8, 
      R.drawable.9 
      }; 

    private Integer[] mImageIds = { 
     R.drawable.1, R.drawable.2, 
      R.drawable.3, R.drawable.4, 
      R.drawable.5, R.drawable.6, 
      R.drawable.7, R.drawable.8, 
      R.drawable.9 
      }; 

} 

Спасибо за ваши ответы!

ответ

1

У меня было решение с другой функцией Preview. Поэтому я вижу выбранный фронт изображения предварительного просмотра камеры. Это используется предварительная активность:

public class PreviewDemo extends Activity { 
    private SurfaceView preview=null; 
    private SurfaceHolder previewHolder=null; 
    private Camera camera=null; 
    private boolean inPreview=false; 
    private boolean cameraConfigured=false; 
    private Context context; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    setContentView(R.layout.main); 

    preview=(SurfaceView)findViewById(R.id.preview); 
    previewHolder=preview.getHolder(); 
    previewHolder.addCallback(surfaceCallback); 
    previewHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);    

    try { 
     int theID = getIntent().getExtras().getInt("the_image_id"); 
     ImageView i = (ImageView) findViewById(R.id.cameralay); 
     i.setImageResource(theID);  

    } catch (Exception e){ 

    Toast.makeText(this, e.getMessage(), Toast.LENGTH_LONG); 

    } 

    } 

    @Override 
    public void onResume() { 
    super.onResume(); 

    camera=Camera.open(); 
    startPreview(); 
    } 

    @Override 
    public void onPause() { 
    if (inPreview) { 
     camera.stopPreview(); 
    } 

    camera.release(); 
    camera=null; 
    inPreview=false; 

    super.onPause(); 
    } 

    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); 
    } 

    private void initPreview(int width, int height) { 
    if (camera!=null && previewHolder.getSurface()!=null) { 
     try { 
     camera.setPreviewDisplay(previewHolder); 
     } 
     catch (Throwable t) { 
     Log.e("PreviewDemo-surfaceCallback", 
       "Exception in setPreviewDisplay()", t); 
     Toast 
      .makeText(PreviewDemo.this, t.getMessage(), Toast.LENGTH_LONG) 
      .show(); 
     } 

     if (!cameraConfigured) { 
     Camera.Parameters parameters=camera.getParameters(); 
     Camera.Size size=getBestPreviewSize(width, height, 
              parameters); 

     if (size!=null) { 
      parameters.setPreviewSize(size.width, size.height); 
      camera.setParameters(parameters); 
      cameraConfigured=true; 
     } 
     } 
    } 
    } 

    private void startPreview() { 
    if (cameraConfigured && camera!=null) { 
     camera.startPreview(); 
     inPreview=true; 
    } 
    } 

    SurfaceHolder.Callback surfaceCallback=new SurfaceHolder.Callback() { 
    public void surfaceCreated(SurfaceHolder holder) { 
     // no-op -- wait until surfaceChanged() 
    } 

    public void surfaceChanged(SurfaceHolder holder, 
           int format, int width, 
           int height) { 
     initPreview(width, height); 
     startPreview(); 
    } 

    public void surfaceDestroyed(SurfaceHolder holder) { 
     // no-op 
    } 
    }; 

    public boolean onCreateOptionsMenu(Menu menu) { 

     // Inflate our menu which can gather user input for switching camera 
     MenuInflater inflater = getMenuInflater(); 
     inflater.inflate(R.menu.camera_menu2, menu); 
     return true; 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     // Handle item selection 
     switch (item.getItemId()) { 

     case R.id.take_photo: 
      //code of taking a photo will be here... 

     return true; 

     } 
     return super.onOptionsItemSelected(item); 
    } 
} 

И мой файл макет, который содержит вид поверхности и вид изображения:

<?xml version="1.0" encoding="utf-8"?> 

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

<android.view.SurfaceView xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/preview" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 
</android.view.SurfaceView>   
<ImageView 
     android:id="@+id/cameralay" 
     android:layout_width="150dp" 
     android:layout_height="150dp" 
     android:layout_centerHorizontal="true" 
     android:layout_centerVertical="true" 
     android:contentDescription="@+id/app_name"> 
</ImageView> 
</RelativeLayout> 
+0

Но я не могу сделать фотографию с выбранным изображением. Если я сделаю снимок, я вижу только просмотр в созданном файле фотографии. – rozmarable

Смежные вопросы