2017-07-27 82 views
0

尝试在我的应用中创建自定义SurfaceView视图时出现错误。从自定义视图中膨胀类的Android错误

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

这里是类:

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

,我得到的错误:

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 

其实我有相同的XML内的其他自定义viewpager的观点,但它工作正常。任何想法,为什么我得到这个错误? 我实际上有相同的XML内的另一个自定义viewpager视图,但它工作正常。任何想法,为什么我得到这个错误?

回答

1

如果使用它的XML标签放在你的布局视图,则必须实现此构造函数:

public View(Context context, AttributeSet attrs)