Android: كيفية إنشاء القطعة معاينة الكاميرا المخصصة؟

StackOverflow https://stackoverflow.com/questions/951121

  •  11-09-2019
  •  | 
  •  

سؤال

أحاول تطوير عنصر واجهة مستخدم مخصص لمعاينة الكاميرا. أرغب في ملء الشاشة مع معاينة الكاميرا ورسم بعض الأزرار فوقها.

لقد حاولت إنشاء عنصر واجهة مستخدم مخصص بالطريقة التالية:

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>

في فئة النشاط حاولت ربط القطعة بالطريقة التالية:

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

في كل مرة أحاول تصحيح التطبيق، أحصل على رسالة خطأ وأنا لم أكتشف ما قد يكون خطأ.

سأقدر حقا أي مساعدة فيما يتعلق بهذه المشكلة.

شكرا!

هل كانت مفيدة؟

المحلول

تحتاج إلى إنشاء المنشئ التالي في SaveView لهذا العمل:

CapturePreview(Context context, AttributeSet attrs)

كما قد تعرف، في منشئين Java لا يرثون من فائقة النائبة، ومع ذلك، هذا هو المنشئ الذي يحاول أندرويد استدعاءه عند استخدام هذا المكون في ملف XML (بدلا من تحديد GUI برمجيا). لن يعمل ذلك، بطبيعة الحال، وبالتالي، فإن رسالة الخطأ، والتي يجب أن تكون أكثر وضوحا بكثير، في رأيي.

ال attibineset. يحتوي على كل سمة مذكورة في إعلان XML، لذلك إذا كان لديك سمات مخصصة للمكونات الخاصة بك، يمكنك استرداد الإجراءات الخاصة بها وتأخذها عليها في المنشئ.

نصائح أخرى

يمكنك تطبيق OnTouchListener () إلى طريقة العرض المحترمة. عند النقرات على السطح، ستأخذك نظام Android تلقائيا إلى طريقة OnTouchListener ().

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top