【问题标题】:Android: How to create a custom camera preview widget?Android:如何创建自定义相机预览小部件?
【发布时间】:2009-06-04 14:58:10
【问题描述】:

我正在尝试开发用于相机预览的自定义小部件。我想用相机预览填充屏幕并在其上绘制一些按钮。

我尝试通过以下方式创建自定义小部件:

import java.io.IOException;

import android.content.Context;
import android.hardware.Camera;
import android.view.SurfaceHolder;
import android.view.SurfaceView;

class CapturePreview extends SurfaceView implements SurfaceHolder.Callback {
    SurfaceHolder mHolder;
    Camera mCamera;

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

public void surfaceCreated(SurfaceHolder holder) {
    // The Surface has been created, acquire the camera and tell it where
    // to draw.
    mCamera = Camera.open();
    try {
       mCamera.setPreviewDisplay(holder);
    } catch (IOException exception) {
        mCamera.release();
        mCamera = null;
        // TODO: add more exception handling logic here
    }
}

public void surfaceDestroyed(SurfaceHolder holder) {
    // Surface will be destroyed when we return, so stop the preview.
    // Because the CameraDevice object is not a shared resource, it's very
    // important to release it when the activity is paused.
    mCamera.stopPreview();
    mCamera = null;
}

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(w, h);
    mCamera.setParameters(parameters);
    mCamera.startPreview();
}

}

并修改main.xml文件如下:

<RelativeLayout android:layout_width="fill_parent" 
android:layout_height="fill_parent" 
xmlns:android="http://schemas.android.com/apk/res/android" 
android:id="@+id/RelativeLayout">
<dev.video.client.CapturePreview android:id="@+id/capturePreview" android:layout_width="wrap_content" android:layout_height="wrap_content"/>
</RelativeLayout>

在 Activity 类中,我尝试通过以下方式绑定小部件:

private CapturePreview mPreview;

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setFullscreen();

    setContentView(R.layout.main);

    this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

    //mPreview = new CapturePreview(this);
    //setContentView(mPreview);

    mPreview = (CapturePreview)this.findViewById(R.id.capturePreview);
}

每次我尝试调试应用程序时都会收到一条错误消息,但我还没有发现可能出了什么问题。

我非常感谢有关此问题的任何帮助。

谢谢!

【问题讨论】:

    标签: android-widget


    【解决方案1】:

    您需要在 SurfaceView 中创建以下构造函数才能使其工作:

    CapturePreview(Context context, AttributeSet attrs)

    您可能知道,Java 中的构造函数不是从它的超类继承的,但是当您在 XML 文件中使用该组件时,Android 会尝试调用该构造函数(而不是以编程方式定义您的 GUI)。当然,那是行不通的,因此我认为错误消息应该更清晰。

    AttributeSet 包含 XML 声明中提到的每个属性,因此如果您的组件有自定义属性,您可以在构造函数中检索并对其执行操作。

    【讨论】:

      【解决方案2】:

      您可以对受尊重的视图实施 onTouchListener()。当您自动单击表面时,Android 系统将带您进入 onTouchListener() 方法。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-11-26
        • 1970-01-01
        相关资源
        最近更新 更多