标签: android-transitions

Android棒棒糖共享元素转换闪烁/闪烁

我在Lollipop的共享元素转换中看到奇怪的事情.共享元素在开始制作动画之前就会闪烁(请参阅视频https://www.youtube.com/watch?v=DCoyyC_S-9A)

我不知道为什么会这样.然而,当我添加<item name="android:windowSharedElementsUseOverlay">false</item>到我的主题时,我看不到闪烁,但过渡看起来并不好(看起来只有一半是动画"隐藏"动画的后半部分).

其他过渡设置:

<item name="android:windowActivityTransitions">true</item>
<item name="android:windowContentTransitions">true</item>
<item name="android:windowAllowEnterTransitionOverlap">true</item>
<item name="android:windowAllowReturnTransitionOverlap">true</item>
<item name="android:windowSharedElementEnterTransition">@android:transition/move</item>
<item name="android:windowSharedElementExitTransition">@android:transition/move</item>
Run Code Online (Sandbox Code Playgroud)

我正在使用ActivityCompat和ActivityOptionsCompat开始活动:

ActivityOptionsCompat options = ActivityOptionsCompat.makeSceneTransitionAnimation(ActivityMain.this,
                        new Pair<View, String>(playButton, getString(R.string.translation_control_button)),
                        new Pair<View, String>(findViewById(R.id.playerImage), getString(R.string.translation_artwork)));

ActivityCompat.startActivity(this, pendingIntent, options.toBundle());
Run Code Online (Sandbox Code Playgroud)

第一项活动:

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        android:id="@+id/main_container">

        <include layout="@layout/toolbar"/>

        <FrameLayout
            android:id="@+id/activity_main_fragment_container"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="1"></FrameLayout>

        <TableLayout
            xmlns:android="http://schemas.android.com/apk/res/android"
            android:layout_width="fill_parent"
            android:layout_height="45dp"
            android:padding="7dp"
            android:stretchColumns="*"
            android:id="@+id/player_toolboxTable"
            android:background="?colorPrimary">

            <TableRow
                android:layout_width="fill_parent"
                android:layout_height="fill_parent"
                android:id="@+id/player_toolbox">

                <ImageView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:clickable="true"
                    android:id="@+id/player_fav"
                    android:src="@drawable/rating_not_important"
                    android:onClick="playerFav"
                    android:background="@drawable/button_selector_semi_white"
                    />

                <ImageView
                    android:src="@drawable/av_pause_over_video"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:clickable="true"
                    android:id="@+id/player_play"
                    android:onClick="playerPlay"
                    android:background="@drawable/button_selector_semi_white"
                    android:transitionName="@string/translation_control_button"
                    /> …
Run Code Online (Sandbox Code Playgroud)

android android-transitions android-5.0-lollipop activity-transition shared-element-transition

20
推荐指数
1
解决办法
1万
查看次数

使用片段共享转换时,返回转换无法正常工作

我有2个片段ListMovieFragmentDetailMovieFragment.

我有一个接口,在ListMovieFragment该实现MainActivity.我正在使用共享元素转换; 当我点击图像视图ListMovieFragmentonMovieSelected被称为中MainActivity.

ListMovieFragment作品过渡.
但是当我单击back按钮时,从DetailMovieFragmentListMovieFragment 转换到ListMovieFragment无法正常工作.

什么是错的gif

这是MainActivity.我想我有一个错误的组合来设置片段的转换.

public class MainActivity extends AppCompatActivity implements ListMovieFragment.MovieSelectedListener {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        if(savedInstanceState == null) {
            ListMovieFragment listMovieFragment = new ListMovieFragment();

            FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
            fragmentTransaction.add(R.id.activity_main, listMovieFragment, ListMovieFragment.TAG);
            fragmentTransaction.commit();
        }
    }

    @Override
    public void onMovieSelected(int movieId) {
        DetailMovieFragment detailMovieFragment =
                (DetailMovieFragment)getSupportFragmentManager().findFragmentByTag(DetailMovieFragment.TAG);
        /* Create a new DetailMovieFragment if not exits …
Run Code Online (Sandbox Code Playgroud)

android android-fragments android-transitions fragment-transitions

20
推荐指数
1
解决办法
1243
查看次数

活动和共享视图之间的动画:动画结束时的小故障/黑客攻击?

所以,我面临的问题是我在两个活动和两个共享视图之间做的动画看起来不太好.

问题是它的"小问题",当从Activity2回到Activity1时,TextViews在动画结束时共享闪烁,从Activity2中显示"更大的文本"几分之一秒,所以它"闪烁" ".

活动1(RecyclerView有三个项目):

在此输入图像描述

活动2(详情):

在此输入图像描述

我在制作动画时拍摄了屏幕.从Activity2返回到Activit2时,您可以看到文本最后闪烁.这段视频(36MB,对不起大小)显示:

https://drive.google.com/file/d/0B3wIZ9CS9Kj_a0MyVFlzX1YtY0E/view?usp=sharing

问题是:我做错了什么?为什么会这样闪烁?我看到其他动画的视频,它们都非常流畅和漂亮.

我已经测试了不同类型的转换(changeBounds,explode等),但总会有一些奇怪的事情发生.任何提示,想法将不胜感激=)

我的代码

MainActivity(Activity1):

package se.snapcode.lollipoptest;

import android.app.Activity;
import android.app.ActivityOptions;
import android.content.Intent;
import android.os.Bundle;
import android.support.v4.view.GestureDetectorCompat;
import android.support.v7.widget.DefaultItemAnimator;
import android.support.v7.widget.LinearLayoutManager;
import android.util.Pair;
import android.view.GestureDetector;
import android.view.Menu;
import android.view.MenuItem;
import android.support.v7.widget.RecyclerView;
import android.view.MotionEvent;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;


public class MainActivity extends Activity {

    private RecyclerView mRecyclerView;
    private MyAdapter mAdapter;
    private RecyclerView.LayoutManager mLayoutManager;
    GestureDetectorCompat gestureDetector;

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

        mRecyclerView = (RecyclerView) findViewById(R.id.my_recycler_view);

        // use this setting to improve …
Run Code Online (Sandbox Code Playgroud)

android android-animation android-transitions activity-transition shared-element-transition

19
推荐指数
1
解决办法
5833
查看次数

视图之间的共享元素转换(不是活动或片段)

假设我使用基于视图的方法来开发Android应用程序,例如以下文章中描述的内容:http://corner.squareup.com/2014/10/advocating-against-android-fragments.html

所以现在我有两个全屏视图.一个是可见的,包含一个图像网格.另一个是隐藏的,是待点击图像的详细视图.如果在单击网格中的图像时没有转换,则将隐藏网格视图并显示详细视图.现在,如果我想要一些类似于网格视图中的小图像和详细视图中的较大图像之间的共享元素过渡的内容.这样的事情可能吗?

图片

mvp android android-transitions android-5.0-lollipop

18
推荐指数
1
解决办法
8555
查看次数

具有转换的片段事务 - 需要唯一的transitionNames

我想从列表视图转到详细视图,因此,我OnClickListener在列表中使用以下内容:

@Override
public void onClick(View view)
{
    Bet bet = (Bet)view.getTag();
    FragmentManager fm = getActivity().getSupportFragmentManager();
    BetDetailFragment f = BetDetailFragment.create(bet);
    String tag = f.getClass().getName();

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP)
    {
        setSharedElementReturnTransition(TransitionInflater.from(getActivity()).inflateTransition(android.R.transition.move));
        f.setSharedElementEnterTransition(TransitionInflater.from(getActivity()).inflateTransition(android.R.transition.move));
    }

    FragmentTransaction ft = fm.beginTransaction()
            .replace(R.id.frame_container, f, tag)
            .addToBackStack(tag);

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP)
    {
        L.d(this, "TRANS: " + TransitionUtil.getTransitionNameBetLogo1(bet) + "|" + view.findViewById(R.id.ivLogo1));
        L.d(this, "TRANS: " + TransitionUtil.getTransitionNameBetLogo2(bet) + "|" + view.findViewById(R.id.ivLogo2));
        ft.addSharedElement(view.findViewById(R.id.ivLogo1), "1");//TransitionUtil.getTransitionNameBetLogo1(bet));
        ft.addSharedElement(view.findViewById(R.id.ivLogo2), "2");//TransitionUtil.getTransitionNameBetLogo2(bet));
    }
    ft.commit();
}
Run Code Online (Sandbox Code Playgroud)

我的函数返回唯一的名称,我有两个不同的视图,但它仍然无法正常工作.我已经评论过不必要的函数并在那里写了一些独特的事务名称......但是,我仍然得到这个例外,在第一行addSharedElement:

java.lang.IllegalArgumentException: Unique transitionNames are required for …
Run Code Online (Sandbox Code Playgroud)

android transition transactions fragment android-transitions

18
推荐指数
2
解决办法
8878
查看次数

使用Transition从Fragment启动活动(API 21支持)

我正在尝试将Android应用程序移植到新的支持库(support-v4:21.0.0),并且我无法通过转换从Fragments启动活动.

在我的活动中,我一直在做类似的事情:

Bundle options = ActivityOptionsCompat.makeSceneTransitionAnimation(this).toBundle();
ActivityCompat.startActivityForResult(this, intent, REQUEST_SOMETHING, options);
Run Code Online (Sandbox Code Playgroud)

适用于活动.但是,如果我尝试使用Fragments做类似的事情,例如:

Activity activity = getActivity();
Bundle options = ActivityOptionsCompat.makeSceneTransitionAnimation(activity).toBundle();
ActivityCompat.startActivityForResult(activity, intent, REQUEST_SOMETHING, options);
Run Code Online (Sandbox Code Playgroud)

事实证明,onActivityResult()没有为片段调用,只有封闭的Activity.我没有在支持库中找到任何东西来将选项Bundle作为参数传递startActivityForResult()给实际的Fragment并让它回调到onActivityResult()那个Fragment中.这可能吗?

最简单的解决方案是处理onActivityResult()Activity本身的所有调用,但我宁愿不这样做,因为我有大量可能正在接收回调的片段.

感谢帮助.谢谢!

android android-support-library onactivityresult android-transitions android-5.0-lollipop

17
推荐指数
1
解决办法
6473
查看次数

如何在Android中提供自上而下的动画?

当我进入下一个活动时,我能够给出自下而上的动画,但现在当我按下时,我使用相同的代码从上到下动画制作动画,但它总是自下而上,所以我的问题是如何给动画我在Android设备上按下按钮时从上到下?
请在下面找到我的代码.

我使用它在从一个过渡Activity到另一个过程中使用它Intent.

overridePendingTransition( R.anim.slide_in_up, R.anim.slide_out_up );
Run Code Online (Sandbox Code Playgroud)

和xml是:slide_in_up.xml

<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
android:fromYDelta="100%p" android:toYDelta="0%p"
android:duration="@android:integer/config_longAnimTime"/>
Run Code Online (Sandbox Code Playgroud)

和slide_out_up.xml是

 <?xml version="1.0" encoding="utf-8"?>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
android:fromYDelta="0%p" android:toYDelta="-100%p"
android:duration="@android:integer/config_longAnimTime"/>
Run Code Online (Sandbox Code Playgroud)

android android-animation android-transitions

16
推荐指数
3
解决办法
4万
查看次数

FragmentTransaction.replace()淡入过渡显示"ghost"片段

您可以下载我的整个项目来尝试和调试.这是我的整个代码的回购:https://bitbucket.org/lexic92/studio48/


当我尝试用空白片段替换空白片段时,我在转换中出现了"鬼片段".

如何重现问题: 我有一个导航抽屉,当我点击一个项目时,它会打开一个填满整个屏幕的片段.

导航抽屉:

  • 按钮1 - 带文本的片段
  • 按钮2 - 空的片段

    1. 当我打开应用程序时,它会从包含文本的片段开始.然后,我打开导航抽屉并单击按钮2. 转换不良,瞬间变为空白屏幕,然后切换回淡入淡出的文本,直到它变为空白屏幕.

    2. 如果我打开导航抽屉并再次单击按钮2 ,它将从全文淡出到空白屏幕.因此,对于一个瞬间,它会在不应该的情况下显示带有文本的片段.我一步一步地在调试模式下运行我的应用程序,以减慢速度,并验证这种行为确实发生了.

    3. 如果我第三次打开导航抽屉并再次单击按钮2 ,它正确地不会显示任何动画,因为它正在淡入同一个屏幕.

有谁知道为什么会这样?你认为它与导航抽屉有什么关系吗?

这是我的整个代码的回购: https ://bitbucket.org/lexic92/studio48/

以下是一些代码摘录:

SongDetailActivity.java:

      @Override
      public void onNavigationDrawerItemSelected(int position) {
        // update the main content by replacing fragments
        FragmentManager fragmentManager = getSupportFragmentManager();

        //OPEN THE BLANK SCREEN
        if(position == 1) {
            fragmentManager.beginTransaction()
                    //.setCustomAnimations(R.anim.fade_in, R.anim.fade_out)
                    .setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE)
                    .replace(R.id.songlist_detail_container, PlaceholderFragment.newInstance(position + 1, mSongId))
                    .commit();
        }
        //OPEN THE SCREEN WITH TEXT
        else {
            SongDetailFragment …
Run Code Online (Sandbox Code Playgroud)

android android-animation android-fragments android-transitions

16
推荐指数
1
解决办法
5746
查看次数

退出转换前更新源活动

在此输入图像描述

我需要有关活动之间转换的帮助:

我有两个活动A和B,两个都有一个具有相同图像列表的ViewPager.每个页面都有与一个ImageView的transitionName等于image_x其中X是页面的索引.

A启动活动B调用ActivityOptionsCompat.makeSceneTransitionAnimation,输入转换完全正常.

问题如下:当我关闭活动B时,退出转换不会在B的相同位置初始化活动A的视图寻呼机.

当用户关闭B时,后者在结果中设置当前页面位置.在onActivityResult活动A中,我调用了setCurrentItem,并且行为显示在gif中.

有没有办法在退出转换开始之前更新活动A?

android android-animation android-viewpager android-transitions

16
推荐指数
1
解决办法
846
查看次数

如何知道一项活动是否在没有过渡的情况下开始?

我有一个用例,我主要通过转换开始一个活动,但从导航抽屉打开它时不是这种情况.

为了保持过渡顺利,我有一个Transition.TransitionListener在转换完成时触发一些UI更新.

所以我有这样的事情:

public class SomeActivity extends Activity {

    public void onCreate(Bundle savedInstanceState){ 
        // ...
        if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) {
            Transition sharedElementEnterTransition = getWindow().getSharedElementEnterTransition();
            sharedElementEnterTransition.addListener(new Transition.TransitionListener() {
                // ...
                @Override
                public void onTransitionEnd(Transition transition) {
                    doSomeUiUpdating();
                }
            });
        } else { // Pre-Lollipop
            doSomeUiUpdating();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这种运作良好,开始与动漫活动的时候,但我怎么能知道,如果活动未经过渡开始,这样我可以打电话doSomeUiUpdating()

我敢肯定,必须有一个简单的方法Activity,Window,Transition或地方,我都忽略了.我不想在调用Activity上中继设置一些告诉动画是否显示的包.

android android-animation android-transitions

16
推荐指数
1
解决办法
1700
查看次数