gpt4 book ai didi

android - 如何在 XML 布局中使用扩展类?

转载 作者:太空狗 更新时间:2023-10-29 16:34:36 25 4
gpt4 key购买 nike

我已经为相机预览创建了一个扩展的 SurfaceView 类。

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

CameraPreview(Context context) {
super(context);

mHolder = this.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.
try {
mCamera = Camera.open();
mCamera.setPreviewDisplay(holder);
} catch (Exception e){
Log.wtf("surfaceCreated", e.toString());
}
}

public void surfaceDestroyed(SurfaceHolder holder) {
try {
mCamera.stopPreview();
mCamera.release();
mCamera = null;
} catch (Exception e){
Log.wtf("surfaceDestroyed", e.toString());
}
}

public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
try {
Camera.Parameters parameters = mCamera.getParameters();
// parameters.setPreviewSize(w, h);
// parameters.setPreviewSize(222, 222);
mCamera.setParameters(parameters);
mCamera.startPreview();
} catch (Exception e){
Log.wtf("surfaceChanged", e.toString());
}
}
}

在这样的 Activity 中使用时,它作为全屏预览工作:

public class CameraActivity extends Activity {
CameraPreview mPreview;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
mPreview = new CameraPreview(this);
setContentView(mPreview);
}
}

当我尝试在 XML 布局文件中使用它时,它给出了 ClassNotFoundException。

<CameraPreview class="com.xxxxxx.camera3.CameraPreview"
android:layout_width="260dp"
android:layout_height="260dp"
android:id="@+id/surfaceView"
android:background="#ff404040"
android:layout_gravity="center_horizontal"/>

我需要做什么才能让它发挥作用?如何在 SurfaceView 中放置相机预览?

最佳答案

假设包含新 View 的包名为:com.ranandar.views

在您的 xml 中执行以下操作:

<com.ranandar.views.CameraPreview
android:layout_width="260dp"
android:layout_height="260dp"
android:id="@+id/surfaceView"
android:background="#ff404040"
android:layout_gravity="center_horizontal"/>

这会在包 com.ranandar.views 中查找,找到定义该 View 的类并使用它。

您的 Activity 存在问题。您将内容 View 设置为表面 View ,这是不对的。

编辑:添加您请求的示例。

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

CameraPreview(Context context) {
super(context);
init();
}

CameraPreview(Context context, AttributeSet attrs){
super(context, attrs);
init();
}

public void init(){
mHolder = this.getHolder();
mHolder.addCallback(this);
mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
}

//additionally with all your other code
...
}

所以我所做的是添加定义自定义 View 所需的构造函数,并在 XML 中使用它。您需要定义额外的构造函数,以便在 XML 中使用它时,将属性集传递给 View 。属性集是您声明的各种字段,如 layout_width/height、background 等。否则,如果没有此构造函数,CameraPreview 将无法膨胀,因为传递的属性集没有构造函数来处理它。双参数构造函数 super(context, attrs) 中的调用使用您定义的属性进行处理。

进一步学习可能需要的文档:Creating Custom Views

需要为您的 XML 文件创建一个 ViewGroup 类,如 RelativeLayout、LinearLayout 等...在这种情况下做一个框架布局:

 <?xml version="1.0" encoding="utf-8"?>
<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/root"
android:layout_width="match_parent"
andorid:layout_height="match_parent">

<com.ranandar.views.CameraPreview
android:id="@+id/camera_preview"
android:layout_width="260dp"
android:layout_height="260dp"
android:id="@+id/surfaceView"
android:background="#ff404040"
android:layout_gravity="center_horizontal"/>

</FrameLayout>

假设这个 xml 文件叫做 activity_main.xml

执行以下操作:

public class CameraActivity extends Activity {
CameraPreview mPreview;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
requestWindowFeature(Window.FEATURE_NO_TITLE);
mPreview = (CameraPreview) findViewById(R.id.camera_preview);
}
}

始终确保先设置 ContentView,然后再进行任何可能调用布局组件的操作。这对您来说可能是个问题

关于android - 如何在 XML 布局中使用扩展类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31866023/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com