【问题标题】:Android: Adding CustomView to OnCreateAndroid:将 CustomView 添加到 OnCreate
【发布时间】:2017-05-27 08:08:14
【问题描述】:

我正在尝试添加一个自定义视图类以超出我的相机预览。

但我无法让它工作。即使只添加customview = new CustomView(this) 也不起作用。我收到错误:CustomView(com.example.android.camera2video.Camera2VideoFragment) CustomView 无法应用于 (com.example.android.camera2video.CameraAvticity)

这是我的代码,

CustomView.java

public class CustomView extends SurfaceView {

    private final Paint paint;
    private final SurfaceHolder mHolder;
    private final Context context;

    public CustomView(Camera2VideoFragment context) {
        super(context.getActivity().getBaseContext());
        mHolder = getHolder();
        mHolder.setFormat(PixelFormat.TRANSPARENT);
        this.context = context.getActivity().getBaseContext();
        paint = new Paint(Paint.ANTI_ALIAS_FLAG);
        paint.setColor(Color.WHITE);
        paint.setStyle(Paint.Style.STROKE);

    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        if (event.getAction() == MotionEvent.ACTION_DOWN) {
            invalidate();
            if (mHolder.getSurface().isValid()) {
                final Canvas canvas = mHolder.lockCanvas();
                Log.d("touch", "touchRecieved by camera");
                if (canvas != null) {
                    Log.d("touch", "touchRecieved CANVAS STILL Not Null");
                    canvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR);
                    canvas.drawColor(Color.TRANSPARENT);
                    canvas.drawCircle(event.getX(), event.getY(), 100, paint);
                    mHolder.unlockCanvasAndPost(canvas);
                    new Handler().postDelayed(new Runnable() {
                        @Override
                        public void run() {
                            Canvas canvas1 = mHolder.lockCanvas();
                            if(canvas1 !=null){
                                canvas1.drawColor(0, PorterDuff.Mode.CLEAR);
                                mHolder.unlockCanvasAndPost(canvas1);
                            }

                        }
                    }, 1000);

                }
                mHolder.unlockCanvasAndPost(canvas);


            }
        }


        return false;

CameraActivity.java

package com.example.android.camera2video;

import android.app.Activity;
import android.content.Context;
import android.os.Bundle;

public class CameraActivity extends Activity {
    private  Context context;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        customview = new CustomView(this);
        setContentView(R.layout.activity_camera);
        if (null == savedInstanceState) {
            getFragmentManager().beginTransaction()
                    .replace(R.id.container, Camera2VideoFragment.newInstance())
                    .commit();
        }
    }

}

【问题讨论】:

标签: android android-custom-view


【解决方案1】:

构造函数允许在匹配 带有底层构造函数的 newInstance() 的实际参数 形式参数。所以一个类包含构造函数,这些构造函数被调用以从类蓝图创建对象。

不要

 public CustomView(Camera2VideoFragment context) 
   {
    super(context.getActivity().getBaseContext());  
    ........

您的 Constructor 期望 Activity Context instead of Fragment getactivity

 public CustomView(Context context) {
 super(context);

仅供参考

如果在setContentView之后调用customview会更好。

    setContentView(R.layout.activity_camera);
    customview = new CustomView(this);

【讨论】:

  • 得到它谢谢。题外话
【解决方案2】:

它不起作用,因为您的自定义视图构造函数采用 Camera2VideoFragment 类而不是活动。

public CustomView(Camera2VideoFragment context) {...}

当您调用new CustomView(this/* is Activity not Camera2VideoFragment */) 时,您正在传递一个Activity 实例,而它实际上需要Camera2VideoFragment。两者之间没有继承关系,因此会出现编译时错误。
要使其正常工作,您有 3 个选项:

  1. 传递Camera2VideoFragment的实例
  2. 将构造函数参数从Camera2VideoFragment改为Activity
  3. 让你的活动扩展Camera2VideoFragment

【讨论】:

  • 改成customview = new CustomView(Camera2VideoFragment.newInstance());好吗?
  • 现在没有错误,但是当我添加到布局时出现错误:未能实例化一个或多个类。 CustomView 类没有实例化
  • 你不能把它放在 XML 中,因为你不能说你想将片段作为上下文传递给构造函数...将 CustomView 的构造函数更改为 Context 然后你可以把它在 XML 中。无论如何,您都不会在类中使用片段。您实际上只需要上下文,那么为什么要在构造函数中传递其他内容呢?
  • 嘿伙计,你能解释一下我应该具体改变什么吗?我有点困惑。我更改了构造函数以获取 Context 作为下面的人和您的建议。在 OnCreate 中要改变什么?
  • 上面的答案完全看你需要做什么。公共自定义视图(上下文上下文){超级(上下文); mHolder = getHolder(); mHolder.setFormat(PixelFormat.TRANSPARENT); this.context = 上下文;油漆=新油漆(油漆.ANTI_ALIAS_FLAG);油漆.setColor(颜色。白色); paint.setStyle(Paint.Style.STROKE); }。然后在活动内部,您可以删除 new CustomView(this) 并放入 customView = (CustomView) findViewById(R.id.custom_view);... 这将在 xml 中找到视图并将其绑定到您的活动中
【解决方案3】:

您已通过customview = new CustomView(this); 创建了一个自定义视图,但您并未将此视图添加到您的布局中。您必须将此视图添加到您想要的位置。也许将它添加到您的根 ViewGroup。换句话说,您没有在任何地方使用过这个 customView,这就是它没有显示的原因。

将您的构造函数更改为此..

 public CustomView(Context context) {
    super(context);
    mHolder = getHolder();
    mHolder.setFormat(PixelFormat.TRANSPARENT);
    this.context = context;
    paint = new Paint(Paint.ANTI_ALIAS_FLAG);
    paint.setColor(Color.WHITE);
    paint.setStyle(Paint.Style.STROKE);

}

将其添加到您的根视图

final ViewGroup viewGroup = (ViewGroup) ((ViewGroup) this.findViewById(android.R.id.content)).getChildAt(0);
viewGroup.addView(new CustomView(this));

【讨论】:

  • 甚至在将其添加到布局之前,添加 customview = new CustomView(this);到 OnCreate,我得到错误:自定义视图(com.example.android.camera2video.Camera2VideoFragment)自定义视图不能应用于(com.example.android.camera2video.CameraAvticity)
  • 我按你说的改了类,你能告诉我在 OnCredate 方法中要改变什么吗?
  • 我给了你一个关于创建的视图组代码。使用它。
  • 你能解释一下在哪里放置视图代码(只需添加到 oncreate 方法吗?)以及它如何与布局 xml 一起工作?我在布局中添加任何内容吗?我从未尝试过查看另一个视图
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-01-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-10
  • 2018-07-05
  • 1970-01-01
相关资源
最近更新 更多