0

У меня есть изображение (шляпа) на переднем просмотре камеры (в фрагменте), поэтому вы можете попробовать шляпу перед покупкой. Но проблема в том, что когда в этом предварительном просмотре я пытаюсь открыть Навигационный ящик, моя шляпа перекрывает этот ящик, а передняя камера находится под ящиком навигации. Как сделать снимок (шляпу) ниже ящика навигации?Изображение накладывается на навигационный ящик

MirrorFragment.java:

public class MirrorFragment extends Fragment implements SurfaceHolder.Callback { 

    private Camera camera = null; 

    private SurfaceHolder cameraSurfaceHolder = null; 
    private boolean previewing = false; 
    private static int wid = 0, hgt = 0; 
    private View cameraViewControl; 
    private Button btnCapture; 
    private Activity activity; 

    public MirrorFragment() { 
    } 

    @Override 
    public void onAttach(Context context) { 
     super.onAttach(context); 
     this.activity = (Activity) context; 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 

     SurfaceView cameraSurfaceView; 
     Display display; 


     View view = inflater.inflate(R.layout.fragment_mirror, container, false); 
     activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 

     int toolbarHeight = ((MainActivity) activity).getToolbar().getHeight(); 


     display = getActivity().getWindowManager().getDefaultDisplay(); 

     wid = display.getWidth(); 
     hgt = display.getHeight(); 


     activity.getWindow().setFormat(PixelFormat.TRANSLUCENT); 
     activity.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); 

     cameraSurfaceView = (SurfaceView) view.findViewById(R.id.cameraSurfaceViewFragment); 
     cameraSurfaceHolder = cameraSurfaceView.getHolder(); 

     cameraSurfaceHolder.addCallback(this); 

     cameraSurfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 



     LayoutInflater layoutInflater = LayoutInflater.from(getActivity()); 

     RelativeLayout.LayoutParams layoutParamsControl = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, 
       RelativeLayout.LayoutParams.MATCH_PARENT); 

     cameraViewControl = layoutInflater.inflate(R.layout.cambutton, null); 

     btnCapture = (Button) cameraViewControl.findViewById(R.id.btnCapture); 

     setMarginTopForHat(toolbarHeight); 


     activity.addContentView(cameraViewControl, layoutParamsControl); 

     return view; 
    } 




    public void setMarginTopForHat(int height) { 
     LinearLayout.LayoutParams layoutParams = (LinearLayout.LayoutParams) btnCapture.getLayoutParams(); 
     layoutParams.setMargins(0, height + 30, 0, 0); 
     btnCapture.setLayoutParams(layoutParams); 
    }  


    @Override 
    public void surfaceCreated(SurfaceHolder holder) { 

     try { 
      camera = Camera.open(1); 
      camera.setDisplayOrientation(90); 
     } catch (RuntimeException e) { 
      Toast.makeText(getContext(), "Device camera is not working properly, please try after sometime.", 
        Toast.LENGTH_LONG).show(); 
     } 
    } 



    @Override 
    public void surfaceDestroyed(SurfaceHolder holder) { 

     ((ViewGroup) cameraViewControl.getParent()).removeView(cameraViewControl); 
     camera.stopPreview(); 
     camera.release(); 
     camera = null; 
     previewing = false; 
    } 
} 

fragment_mirror.xml:

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:orientation="vertical"> 

    <SurfaceView 
     android:id="@+id/cameraSurfaceViewFragment" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:layout_alignParentTop="true" 
     android:layout_centerHorizontal="true" /> 

</RelativeLayout> 

ответ

0

Ваша шляпа View появляется над ящиком, потому что вы используете addContentView() метод своей деятельности, которая добавляет его в качестве последний ребенок в содержании Деятельности ViewGroup, заставляя его рисовать поверх остальной части его содержимого. Если ViewGroup, который вы загружаете MirrorFragment, является FrameLayout, вы можете просто добавить его вместо этого. Однако, вероятно, предпочтительным решением является его добавление непосредственно к макету fragment_mirror либо программным способом, либо в формате XML.

+0

Извините, не понял. Должен ли я изменить метод 'addContentView()' на другой метод? Потому что я пытался добавить в 'addContentView()' различные параметры (такие как 'View view = inflater.inflate (R.layout.fragment_mirror, container, false);' и это не сработало. –

+0

Вы не хотите для использования 'addContentView()', так как это то, что вызывает представление шляпы над всем остальным. Вы хотите использовать метод 'addView()' какой бы ViewGroup вы не решили добавить шляпу View. Я бы предложил добавить ее прямо перед 'view', прежде чем вы вернете это в' onCreateView() '. Возможно, вам придется изменить макет' fragment_mirror', однако, в зависимости от того, какой тип ViewGroup у него есть как его корень. Если вы хотите опубликовать этот макет, я может быть более конкретным. –

+0

Я отредактировал свой вопрос и разместил макет MirrorFragment. Пожалуйста, посмотрите. –

Смежные вопросы