2017-07-27 2 views
0

Une erreur s'affiche lorsque j'essaie de créer une vue SurfaceView personnalisée dans mes applications.Android Erreur lors du gonflement d'une classe à partir d'une vue personnalisée

<com.example.test.CustomSurfaceView 
    android:id="@+id/cameraPreview" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"/> 

Voici la classe:

package com.example.test; 
import android.content.Context; 
import android.hardware.Camera; 
import android.util.Log; 
import android.view.SurfaceHolder; 
import android.view.SurfaceView; 
import java.util.List; 
public class CustomSurfaceView extends SurfaceView implements SurfaceHolder.Callback { 

private static final String TAG = "CameraPreview"; 

private Context mContext; 
private SurfaceHolder mHolder; 
private Camera mCamera; 
private List<Camera.Size> mSupportedPreviewSizes; 
private Camera.Size mPreviewSize; 

public CustomSurfaceView(Context context, Context mContext) { 
    super(context); 
    this.mContext = mContext; 
} 

public CustomSurfaceView(Context context, Camera camera) { 
    super(context); 
    mContext = context; 
    mCamera = camera; 

    // supported preview sizes 
    mSupportedPreviewSizes = mCamera.getParameters().getSupportedPreviewSizes(); 
    for(Camera.Size str: mSupportedPreviewSizes) 
     Log.e(TAG, str.width + "/" + str.height); 

    // Install a SurfaceHolder.Callback so we get notified when the 
    // underlying surface is created and destroyed. 
    mHolder = getHolder(); 
    mHolder.addCallback(this); 
    // deprecated setting, but required on Android versions prior to 3.0 
    mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 
} 

public void surfaceCreated(SurfaceHolder holder) { 
    // empty. surfaceChanged will take care of stuff 
} 

public void surfaceDestroyed(SurfaceHolder holder) { 
    // empty. Take care of releasing the Camera preview in your activity. 
} 

public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) { 
    Log.e(TAG, "surfaceChanged => w=" + w + ", h=" + h); 
    // If your preview can change or rotate, take care of those events here. 
    // Make sure to stop the preview before resizing or reformatting it. 
    if (mHolder.getSurface() == null){ 
     // preview surface does not exist 
     return; 
    } 

    // stop preview before making changes 
    try { 
     mCamera.stopPreview(); 
    } catch (Exception e){ 
     // ignore: tried to stop a non-existent preview 
    } 

    // set preview size and make any resize, rotate or reformatting changes here 
    // start preview with new settings 
    try { 
     Camera.Parameters parameters = mCamera.getParameters(); 
     parameters.setPreviewSize(mPreviewSize.width, mPreviewSize.height); 
     mCamera.setParameters(parameters); 
     mCamera.setDisplayOrientation(90); 
     mCamera.setPreviewDisplay(mHolder); 
     mCamera.startPreview(); 

    } catch (Exception e){ 
     Log.d(TAG, "Error starting camera preview: " + e.getMessage()); 
    } 
} 

@Override 
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 
    final int width = resolveSize(getSuggestedMinimumWidth(), widthMeasureSpec); 
    final int height = resolveSize(getSuggestedMinimumHeight(), heightMeasureSpec); 

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

    if (mPreviewSize!=null) { 
     float ratio; 
     if(mPreviewSize.height >= mPreviewSize.width) 
      ratio = (float) mPreviewSize.height/(float) mPreviewSize.width; 
     else 
      ratio = (float) mPreviewSize.width/(float) mPreviewSize.height; 

     // One of these methods should be used, second method squishes preview slightly 
     setMeasuredDimension(width, (int) (width * ratio)); 
     //  setMeasuredDimension((int) (width * ratio), height); 
    } 
} 

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

    if (sizes == null) 
     return null; 

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

    int targetHeight = h; 

    for (Camera.Size size : sizes) { 
     double ratio = (double) size.height/size.width; 
     if (Math.abs(ratio - targetRatio) > ASPECT_TOLERANCE) 
      continue; 

     if (Math.abs(size.height - targetHeight) < minDiff) { 
      optimalSize = size; 
      minDiff = Math.abs(size.height - targetHeight); 
     } 
    } 

    if (optimalSize == null) { 
     minDiff = Double.MAX_VALUE; 
     for (Camera.Size size : sizes) { 
      if (Math.abs(size.height - targetHeight) < minDiff) { 
       optimalSize = size; 
       minDiff = Math.abs(size.height - targetHeight); 
      } 
     } 
    } 

    return optimalSize; 
} 
} 

L'erreur que je reçois:

java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.test/com.example.test.HomeActivity}: android.view.InflateException: Binary XML file line #7: Binary XML file line #7: Error inflating class com.example.test.CustomSurfaceView 

J'ai en fait une autre vue viewpager personnalisé dans le même xml, mais il fonctionne très bien. une idée de pourquoi je reçois cette erreur? J'ai en fait une autre vue de viewpager personnalisée dans le même xml, mais cela fonctionne très bien. une idée de pourquoi je reçois cette erreur?

Répondre

1

Si vous mettez une vue dans votre mise en page en utilisant une balise XML pour cela, vous devez mettre en œuvre ce constructeur:

public View(Context context, AttributeSet attrs)