2017-05-27 83 views
1

我正在嘗試添加自定義視圖類以超出我的相機預覽。Android:將自定義視圖添加到OnCreate

但我無法得到它的工作。即使只加入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(); 
     } 
    } 

} 
+0

您製作了一個構造函數,它將Camera2VideoFragment作爲參數,但在代碼中將其傳遞給MainActivity實例。 – RobCo

+0

閱讀https://stackoverflow.com/questions/12273976/camera-tutorial-for-android-using-surfaceview –

回答

1

它不工作,因爲你的自定義視圖的構造需要Camera2VideoFragment類,而不是一個活動。

public CustomView(Camera2VideoFragment context) {...} 

當你調用new CustomView(this/* is Activity not Camera2VideoFragment */)你當它實際上預計Camera2VideoFragment傳遞活動的一個實例。這兩者之間沒有繼承關係,因此你會得到編譯時錯誤。
爲了使它工作,你有3種選擇:

  1. 傳遞Camera2VideoFragment
  2. 變化從Camera2VideoFragment構造函數參數的實例來Activity
  3. 讓您的活動延長Camera2VideoFragment
+0

將其更改爲customview = new CustomView(Camera2VideoFragment.newInstance());很好? – David

+0

它應該是好的。它工作嗎? – Tudor

+0

現在沒有錯誤,但是當我添加到佈局我得到錯誤:未能實例化一個或多個類。 CustomView類沒有實例化 – David

1

呦您已通過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); 

} 

將其添加到您的rootview

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

甚至在添加到佈局之前,添加customview =新的CustomView(this);到OnCreate,我得到錯誤:自定義視圖(com.example.android.camera2video.Camera2VideoFragment)CustomView不能應用於(com.example.android.camera2video.CameraAvticity) – David

+0

我改變了類,如你所說,你能告訴我什麼改變OnCredate方法PLZ? – David

+0

我給你一個創建視圖組代碼。使用它。 –

1

Constructor permits widening conversions to occur when matching the actual parameters to newInstance() with the underlying constructor's formal parameters . So A class contains constructors that are invoked to create objects from the class blueprint .

請勿

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

Constructor預計Activity Context instead of Fragment getactivity

DO

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

FYI

這將是更好,如果你以後的setContentView調用customview

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

得到它的感謝..現在它運行,但我看到黑色的佈局,當我觸摸它的應用程序崩潰,生病有關它的問題。關於這個Therad的主題 – David

相關問題