0

我试图将Draggable panel library与我的视频播放项目整合在一起,到目前为止它已经非常适合我的需求。场景过渡可以消除所有的问题

首先我设置它,以便DraggablePanel始终位于我的视图Root中,以便它在最大化时覆盖整个屏幕。

但现在我想做一个很好的从缩略图到视频窗口的转换,就像Youtube一样。我试过这个:

public static void launch(TransitionableClass t, 
          AppCompatActivity activity, 
          Fragment bottomFragment, 
          ViewGroup container, 
          View iv, 
          String transitionName, 
          String url) { 
    DraggableVideoPanel draggableVideoPanel = new DraggableVideoPanel(activity.getApplicationContext()); 
    draggableVideoPanel.setFragmentManager(activity.getSupportFragmentManager()); 
    draggableVideoPanel.setBottomFragment(bottomFragment); 

    TypedValue typedValue = new TypedValue(); 
    activity.getResources().getValue(R.dimen.x_scale_factor, typedValue, true); 
    float xScaleFactor = typedValue.getFloat(); 
    typedValue = new TypedValue(); 
    activity.getResources().getValue(R.dimen.y_scale_factor, typedValue, true); 
    float yScaleFactor = typedValue.getFloat(); 



    draggableVideoPanel.setXScaleFactor(xScaleFactor); 
    draggableVideoPanel.setYScaleFactor(yScaleFactor); 
    draggableVideoPanel.setTopViewHeight(
      activity.getResources().getDimensionPixelSize(R.dimen.top_fragment_height)); 
    draggableVideoPanel.setTopFragmentMarginRight(
      activity.getResources().getDimensionPixelSize(R.dimen.top_fragment_margin)); 
    draggableVideoPanel.setTopFragmentMarginBottom(
      activity.getResources().getDimensionPixelSize(R.dimen.top_fragment_margin)); 


    draggableVideoPanel.initializeView(); 
    draggableVideoPanel.maximize(); 

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { 
     iv.setTransitionName(transitionName); 
     draggableVideoPanel.mCoverView.setTransitionName(transitionName); 


     Transition shared = t.inflateTransition(android.R.transition.move); 
     shared.addTarget(transitionName); 
     shared.setDuration(200); 

     Transition fade = t.inflateTransition(android.R.transition.fade); 
     fade.excludeTarget(transitionName, true); 
     fade.setDuration(200); 

     TransitionSet transitionSet = new TransitionSet(); 

     transitionSet.addTransition(fade).addTransition(shared); 

     Scene scene = new Scene(container, draggableVideoPanel); 
     draggableVideoPanel.mCoverView.setImageResource(R.drawable.img); 

     TransitionManager.go(scene, transitionSet); 
    } 

} 

所以我创建一个从两个共享视图的移动过渡,然后其余的淡入淡出。这段代码我从here

现在把内部消除了DraggablePanel用于过渡到使用过渡,我得到这个工作得很好,但现在:

http://i.imgur.com/2aPxDJX.mp4

所以它看起来像某种方式产生的过渡白色背景。使用布局检查器时,我发现在应用转换时,实际上窗口中的所有元素实际上都从场景中移除。

我该如何预防?我应该如何在视图间切换?

回答

0
Scene scene = new Scene(container, draggableVideoPanel); 

您正在使用此构造:Scene (ViewGroup sceneRoot, View layout)

构造一个场面,在输入时,将从sceneRoot容器中删除任何儿童,并添加布局对象的一个​​新的子容器。

如文档说明,本Scene结果除了draggableVideoPanel除去在container一切。

你想要的是TransitionManager.beginDelayedTransition(ViewGroup sceneRoot, Transition transition)

+0

但我可以做这个共享元素转换吗?刚刚尝试,但它没有工作 –

+0

是的,你可以。在代码中执行'TransitionManager.beginDelayedTransition(viewGroup,transition);'在该行的下面执行您想要重新定位的布局的变化,例如; 'draggableVideoPanel.setX(0);'。 'Transitions API'会计算delta值并应用'transition'。请注意,'draggableVideoPanel'应该是'viewGroup'的子项。 – azizbekian

+0

你是对的它确实工作,但由于某种原因,转换没有按预期工作https://www.youtube.com/watch?v=vM__d-4xFv8&feature=youtu.be –