RecyclerView 项目过渡到片段
RecycleView item transition to fragment
我正在尝试创建从回收视图到片段的图像移动过渡。但问题是,在新的过渡图像显示后,移动动画不会发生,它只是与其余内容一起淡入。我做错了什么。我正在关注这个例子:
http://mikescamell.com/shared-element-transitions-part-4-recyclerview/
我有带图像视图的回收视图项目布局:
<?xml ...?>
<layout ...>
<data>
<variable name="model" type="..."/>
</data>
<LinearLayout ...>
<FrameLayout ...>
<ImageView android:id="@+id/image" .../>
</FrameLayout>
<LinearLayout ...>
...
</LinearLayout>
</LinearLayout>
</layout>
然后我有一个片段布局,我想将图像从回收视图移动到该布局。
<FrameLayout ...>
<TextView .../>
<ImageView android:id="@+id/logo" >
</FrameLayout>
这里是recycle my view的onBindViewHolder方法
@Override
public void onBindViewHolder(RecycleViewAdapter.ViewHolder holder, int position) {
final T object = getItem(position);
holder.getBinding().setVariable(BR.model, object);
holder.getBinding().executePendingBindings();
ViewCompat.setTransitionName(holder.getBaseView().findViewById(R.id.logo), "wb_logo");
holder.getBaseView().setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
onItemClickListener.onItemClick(view, object);
}
});
}
这是我主程序中的回收视图项目点击处理程序 activity
@Override
public void onFragmentItemClick(View view, Object object) {
PreviewFragment fragment = PreviewFragment.newInstance(Object.imageId, "");
getFragmentManager()
.beginTransaction()
.addSharedElement(view.getRootView().findViewById(R.id.logo), "wb_logo")
.addToBackStack(null)
.replace(R.id.fragment_container, fragment)
.commit();
}
在我不想制作动画图像的片段 class 中,我有以下设置:
@Override
public void onCreate(Bundle savedInstanceState) {
...
setSharedElementEnterTransition(
TransitionInflater.from(getActivity()).inflateTransition(android.R.transition.move));
}
@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
ImageView imageView = view.findViewById(R.id.logo);
imageView.setTransitionName("wb_logo");
imageView.setImageResource(...);
}
我尝试将 transitionName 属性静态添加到图像视图,但结果是一样的。
编辑
也许我的总体布局有问题。我的片段容器在 DrawerLayout
<android.support.v4.widget.DrawerLayout ...>
<android.support.design.widget.CoordinatorLayout ...>
<android.support.design.widget.AppBarLayout ...>
<android.support.v7.widget.Toolbar ... />
</android.support.design.widget.AppBarLayout>
<FrameLayout android:id="@+id/fragment_container" .../>
</android.support.design.widget.CoordinatorLayout>
<android.support.design.widget.NavigationView .../>
</android.support.v4.widget.DrawerLayout>
或片段class我正在使用我正在使用
android.app.Fragment
而不是
android.support.v4.app.Fragment
在
之内
android.support.v7.app.AppCompatActivity
尝试在 xml 而不是 JAVA 侧设置转换名称。我认为它可能不起作用,因为您是在已创建视图时设置它。
<ImageView
android:id="@+id/ivItem"
android:transitionName="wb_logo"
android:layout_width="match_parent"
android:background="@android:color/holo_blue_bright"
android:scaleType="centerCrop"
android:layout_height="wrap_content" />
以上将在您的回收站视图中的项目中。
<ImageView
android:id="@+id/wb_logo"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true"
android:scaleType="centerCrop"
android:transitionName="wb_logo" />
以上将在您的片段中
您的起始片段代码是正确的
我弄清楚我的问题是什么:我在回收视图中有多个项目,它们里面都有 ImageView android:transitionName="wb_logo"。
我不知何故错过了回收视图中的每个共享项目都必须具有唯一的 transitionName 的要点。当我修改 transitionName 以包含 id 后缀时,它开始按预期工作。
android:transitionName="wb_logo_1"
android:transitionName="wb_logo_2"
我正在尝试创建从回收视图到片段的图像移动过渡。但问题是,在新的过渡图像显示后,移动动画不会发生,它只是与其余内容一起淡入。我做错了什么。我正在关注这个例子: http://mikescamell.com/shared-element-transitions-part-4-recyclerview/
我有带图像视图的回收视图项目布局:
<?xml ...?>
<layout ...>
<data>
<variable name="model" type="..."/>
</data>
<LinearLayout ...>
<FrameLayout ...>
<ImageView android:id="@+id/image" .../>
</FrameLayout>
<LinearLayout ...>
...
</LinearLayout>
</LinearLayout>
</layout>
然后我有一个片段布局,我想将图像从回收视图移动到该布局。
<FrameLayout ...>
<TextView .../>
<ImageView android:id="@+id/logo" >
</FrameLayout>
这里是recycle my view的onBindViewHolder方法
@Override
public void onBindViewHolder(RecycleViewAdapter.ViewHolder holder, int position) {
final T object = getItem(position);
holder.getBinding().setVariable(BR.model, object);
holder.getBinding().executePendingBindings();
ViewCompat.setTransitionName(holder.getBaseView().findViewById(R.id.logo), "wb_logo");
holder.getBaseView().setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
onItemClickListener.onItemClick(view, object);
}
});
}
这是我主程序中的回收视图项目点击处理程序 activity
@Override
public void onFragmentItemClick(View view, Object object) {
PreviewFragment fragment = PreviewFragment.newInstance(Object.imageId, "");
getFragmentManager()
.beginTransaction()
.addSharedElement(view.getRootView().findViewById(R.id.logo), "wb_logo")
.addToBackStack(null)
.replace(R.id.fragment_container, fragment)
.commit();
}
在我不想制作动画图像的片段 class 中,我有以下设置:
@Override
public void onCreate(Bundle savedInstanceState) {
...
setSharedElementEnterTransition(
TransitionInflater.from(getActivity()).inflateTransition(android.R.transition.move));
}
@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
ImageView imageView = view.findViewById(R.id.logo);
imageView.setTransitionName("wb_logo");
imageView.setImageResource(...);
}
我尝试将 transitionName 属性静态添加到图像视图,但结果是一样的。
编辑 也许我的总体布局有问题。我的片段容器在 DrawerLayout
<android.support.v4.widget.DrawerLayout ...>
<android.support.design.widget.CoordinatorLayout ...>
<android.support.design.widget.AppBarLayout ...>
<android.support.v7.widget.Toolbar ... />
</android.support.design.widget.AppBarLayout>
<FrameLayout android:id="@+id/fragment_container" .../>
</android.support.design.widget.CoordinatorLayout>
<android.support.design.widget.NavigationView .../>
</android.support.v4.widget.DrawerLayout>
或片段class我正在使用我正在使用
android.app.Fragment
而不是
android.support.v4.app.Fragment
在
之内android.support.v7.app.AppCompatActivity
尝试在 xml 而不是 JAVA 侧设置转换名称。我认为它可能不起作用,因为您是在已创建视图时设置它。
<ImageView
android:id="@+id/ivItem"
android:transitionName="wb_logo"
android:layout_width="match_parent"
android:background="@android:color/holo_blue_bright"
android:scaleType="centerCrop"
android:layout_height="wrap_content" />
以上将在您的回收站视图中的项目中。
<ImageView
android:id="@+id/wb_logo"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true"
android:scaleType="centerCrop"
android:transitionName="wb_logo" />
以上将在您的片段中
您的起始片段代码是正确的
我弄清楚我的问题是什么:我在回收视图中有多个项目,它们里面都有 ImageView android:transitionName="wb_logo"。
我不知何故错过了回收视图中的每个共享项目都必须具有唯一的 transitionName 的要点。当我修改 transitionName 以包含 id 后缀时,它开始按预期工作。
android:transitionName="wb_logo_1"
android:transitionName="wb_logo_2"