2009-06-04 11 views
7

私はカメラプレビューのためのカスタムウィジェットを開発しようとしています。私はカメラのプレビューで画面を埋めると、その上にいくつかのボタンを描画したいと思います。次のようAndroid:カスタムカメラプレビューウィジェットを作成するには?

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ファイルを修正:私はバインドしようとしたActivityクラスで

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

を私はカスタムを作成しようとしました

は次のようにウィジェットウィジェットは次のようになります。

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

私はアプリケーションをデバッグしようとするたびにエラーメッセージが表示され、何が間違っているのか分からなかった。

この問題に関して本当に助けていただければ幸いです。

ありがとうございます!

答えて

4

あなたが仕事に、このためにSurfaceViewで次のコンストラクタを作成する必要があります:あなたが知っているかもしれませんが、それはスーパーだから

CapturePreview(Context context, AttributeSet attrs)

、Javaでコンストラクタは継承されません、まだこれはコンストラクタであるアンドロイドプログラムでGUIを定義するのではなく、XMLファイルでそのコンポーネントを使用するときに呼び出されます。それは当然のことではありません。したがって、私の意見では、はるかに明確にすべきエラーメッセージです。

AttributeSetには、XML宣言に記載されているすべての属性が含まれています。したがって、コンポーネントのカスタム属性がある場合は、コンストラクターでそれらを取得してアクションを実行できます。

+0

こんにちは、私は同じ質問をしています。しかし、私はddntを得る... PLZ助けてください... –

-1

あなたはonTouchListener()を実装することができます。サーフェスを自動的にクリックすると、AndroidシステムによってonTouchListener()メソッドが表示されます。