gpt4 book ai didi

android - 将 SharedElement Activity 转换与自定义 View 一起使用

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:46:55 25 4
gpt4 key购买 nike

我正在进行概念验证,我在 TableLayout 中有一些自定义 View 。单击其中一个 View 时,我想为 View 设置动画,使其扩展到一个新的 Activity 中。我要达到的效果和看到的差不多here .

根据我的研究,执行此操作的方法似乎是使用 shared element Transitions .但是,我无法让它正常工作,我想知道这是否是因为我使用的是自己的自定义 View 。

具体来说,淡入淡出正在发生,但缩放和平移运动没有发生。检查下面的 GIF 以查看我在哪里。在示例中,我单击了左上角的圆圈,我想在新 Activity 中将其转换为完整的圆圈。按下后退按钮时也会出现此问题。

enter image description here

我认为这是不正确的,因为必须绘制 View ,但是有没有办法进一步自定义我的 View 以使其工作?我发现的所有此类过渡示例都包含 ImageView、Button 和 TextView。

以下是相关来源。我的自定义 View 很大,不包含任何特殊代码,只是重写了 onDraw() 和 onMeasure()。

主 Activity .java

package com.rscottcarson.circleschedulertest;

import android.app.Activity;
import android.app.ActivityOptions;
import android.content.Intent;
import android.support.v4.app.ActivityOptionsCompat;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.view.Window;
import android.widget.Toast;
public class MainActivity extends Activity {

private View view1;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

view1 = findViewById(R.id.circle1);

view1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {

Intent intent = new Intent(MainActivity.this, DetailActivity.class);
// create the transition animation - the images in the layouts
// of both activities are defined with android:transitionName="profile"
ActivityOptions options = ActivityOptions
.makeSceneTransitionAnimation(MainActivity.this, view1, "profile");
// start the new activity
startActivity(intent, options.toBundle());
}
});

}
}

DetailActivity.java

package com.rscottcarson.circleschedulertest;

import android.app.Activity;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;

public class DetailActivity extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_detail);

}
}

change_image_trans.xml

<?xml version="1.0" encoding="utf-8"?>
<transitionSet xmlns:android="http://schemas.android.com/apk/res/android">
<changeTransform />
</transitionSet>

样式.xml

<resources>

<!-- Base application theme. -->
<style name="AppTheme" parent="android:Theme.Material.Light.DarkActionBar">
<item name="android:windowActivityTransitions">true</item>
<item name="android:windowContentTransitions">true</item>

<!-- Customize your theme here. -->
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item>


<!-- specify shared element transitions -->
<item name="android:windowSharedElementEnterTransition">
@transition/change_image_trans</item>
<!-- specify shared element transitions -->
<item name="android:windowSharedElementExitTransition">
@transition/change_image_trans</item>
</style>

</resources>

最佳答案

只需在 DetailActivity 中尝试使用 postponeEnterTransition()startPostponedEnterTransition()

postponeEnterTransition() 用于暂时延迟过渡,直到共享元素被正确测量和布局。

startPostponedEnterTransition() 安排共享元素转换在 Activity 的 View 层次结构中测量并布置共享元素后立即开始。

DetailActivity.java

@Override
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_detail);
postponeEnterTransition();
}

private void scheduleStartPostponedTransition(final View sharedElement) {
sharedElement.getViewTreeObserver().addOnPreDrawListener(
new ViewTreeObserver.OnPreDrawListener() {
@Override
public boolean onPreDraw() {
sharedElement.getViewTreeObserver().removeOnPreDrawListener(this);
startPostponedEnterTransition();
return true;
}
});
}

关于android - 将 SharedElement Activity 转换与自定义 View 一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41602452/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com