sau*_*lon 5 animation android android-fragments material-design shared-element-transition
我正在尝试在不同活动的片段之间实现共享元素转换,我已经实现了共享元素进入转换,但无法管理回退转换。
片段 A 托管在 Activity A 中,单击按钮时,图像被添加为共享元素,然后启动 Activity B,其中托管包含共享元素的目标视图的 Fragment B。
活动一:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_a);
getSupportFragmentManager()
.beginTransaction()
.addToBackStack(null)
.replace(R.id.content, FragmentA.newInstance())
.commit();
}
@Override
public void onBackPressed() {
super.onBackPressed();
finishAfterTransition();
}
Run Code Online (Sandbox Code Playgroud)
片段A:
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
postponeEnterTransition();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
setSharedElementEnterTransition(TransitionInflater.from(getContext()).inflateTransition(android.R.transition.move));
setSharedElementReturnTransition(TransitionInflater.from(getContext()).inflateTransition(android.R.transition.move));
}
}
@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
final ImageView imageView = (ImageView) view.findViewById(R.id.simple_activity_a_imageView);
Button button = (Button) view.findViewById(R.id.simple_activity_a_btn);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(getActivity(), ActivityB.class);
ActivityOptionsCompat options = ActivityOptionsCompat.makeSceneTransitionAnimation(
getActivity(),
imageView,
ViewCompat.getTransitionName(imageView));
startActivity(intent, options.toBundle());
}
});
}
Run Code Online (Sandbox Code Playgroud)
活动乙:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_fragment_to_fragment);
getSupportFragmentManager()
.beginTransaction()
.addToBackStack(null)
.replace(R.id.content, FragmentB.newInstance())
.commit();
}
@Override
public void onBackPressed() {
super.onBackPressed();
finishAfterTransition();
}
Run Code Online (Sandbox Code Playgroud)
片段B:
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
postponeEnterTransition();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
setSharedElementEnterTransition(TransitionInflater.from(getContext()).inflateTransition(android.R.transition.move));
setSharedElementReturnTransition(TransitionInflater.from(getContext()).inflateTransition(android.R.transition.move));
}
}
@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
TextView detailTextView = (TextView) view.findViewById(R.id.simple_activity_b_text);
detailTextView.setText("detail");
ImageView imageView = (ImageView) view.findViewById(R.id.simple_activity_b_image);
imageView.setVisibility(View.VISIBLE);
view.findViewById(R.id.activity_simple_two).setVisibility(View.VISIBLE);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
imageView.setTransitionName(getString(R.string.simple_activity_transition));
}
Glide.with(this)
.load(GlideFragmentA.ARMADILLO_PIC_URL)
.centerCrop()
.dontAnimate()
.listener(new RequestListener<String, GlideDrawable>() {
@Override
public boolean onException(Exception e, String model, Target<GlideDrawable> target, boolean isFirstResource) {
startPostponedEnterTransition();
return false;
}
@Override
public boolean onResourceReady(GlideDrawable resource, String model, Target<GlideDrawable> target, boolean isFromMemoryCache, boolean isFirstResource) {
startPostponedEnterTransition();
return false;
}
})
.into(imageView);
}
Run Code Online (Sandbox Code Playgroud)
这是因为imageView在片段中...它不是Activity B 的元素..所以在
活动 B 你可以做这样的事情并测试它..
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_fragment_to_fragment);
FrameLayout frame = (FrameLayout) findViewById(R.id.content);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
frame
.setTransitionName(getString(R.string.simple_activity_transition));
}
getSupportFragmentManager()
.beginTransaction()
.addToBackStack(null)
.replace(R.id.content, FragmentB.newInstance())
.commit();
}
@Override
public void onBackPressed() {
super.onBackPressed();
finishAfterTransition();
}
Run Code Online (Sandbox Code Playgroud)
现在您可以测试检查是否onBackPressed会有过渡。
| 归档时间: |
|
| 查看次数: |
1806 次 |
| 最近记录: |