【问题标题】:Slide right to left Android Animations从右向左滑动 Android 动画
【发布时间】:2013-08-09 13:31:24
【问题描述】:

嘿,我正在开发一个 Android 项目,该项目需要 Android WebView 上的幻灯片动画。 当用户从左向右滑动时,它移动到新页面,当它从右向左滑动时,它移动到上一页。但是Android只有两个过渡,即 slide_out_right 和 slide_in_left。使用它们后,从左到右的滑动工作完美无缺,但另一个看起来很奇怪(相反)。

任何解决方案。我希望 slide_out_left 动画更精确。

【问题讨论】:

  • android 是开源的。找到这些动画的文件,反转它们并不是很复杂。

标签: android


【解决方案1】:

阅读此blog post 带有过渡动画的示例,我已包含以下代码:

通话活动

package com.as400samplecode;

import android.os.Bundle;
import android.app.Activity;
import android.content.Intent;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class MainActivity extends Activity implements OnClickListener{

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

  Button nextActivity = (Button) findViewById(R.id.nextActivity);
  nextActivity.setOnClickListener(this);

 }

 public void onClick(View v) {

  switch (v.getId()) {
  case R.id.nextActivity:
   Intent nextActivity = new Intent(this,NextActivity.class);
   startActivity(nextActivity);
   //push from bottom to top
   overridePendingTransition(R.anim.push_up_in, R.anim.push_up_out);
   //slide from right to left
   //overridePendingTransition(R.anim.slide_in_right, R.anim.slide_out_left);
   break;

   // More buttons go here (if any) ...

  }
 }

 @Override
 public boolean onCreateOptionsMenu(Menu menu) {
  // Inflate the menu; this adds items to the action bar if it is present.
  getMenuInflater().inflate(R.menu.activity_main, menu);
  return true;
 }

}

调用活动的布局资源

<?xml version="1.0" encoding="UTF-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
 xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
 android:layout_height="match_parent" tools:context=".MainActivity"
 android:background="@color/ivory"> 
 <Button android:id="@+id/nextActivity" android:layout_width="match_parent"
  android:layout_height="wrap_content" android:layout_alignParentLeft="true"
  android:layout_alignParentTop="true" android:layout_marginTop="15dp"
  android:text="Go to Next Activity" /> 
</RelativeLayout>

调用的活动

package com.as400samplecode;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class NextActivity extends Activity implements OnClickListener{

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

        Button previousActivity = (Button) findViewById(R.id.previousActivity);
        previousActivity.setOnClickListener(this);

    }

 public void onClick(View v) {

  switch (v.getId()) {
  case R.id.previousActivity:
   finish();
   //push from top to bottom
   overridePendingTransition(R.anim.push_down_in, R.anim.push_down_out);
   //slide from left to right
   //overridePendingTransition(R.anim.slide_in_left, R.anim.slide_out_right);
   break;

   // More buttons go here (if any) ...

  }
 }


}

被调用活动的布局资源

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
 xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
 android:layout_height="match_parent" tools:context=".NextActivity"
 android:background="@color/khaki">

 <Button android:id="@+id/previousActivity" android:layout_width="match_parent"
  android:layout_height="wrap_content" android:layout_alignParentLeft="true"
  android:layout_alignParentTop="true" android:layout_marginTop="15dp"
  android:text="Go to Previous Activity" />

</RelativeLayout>

动画资源 - push_down_in.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
 <translate android:fromYDelta="-100%p" android:toYDelta="0" android:duration="5000"/>
 <alpha android:fromAlpha="0.0" android:toAlpha="1.0" android:duration="5000" />
</set>

动画资源 - push_down_out.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
 <translate android:fromYDelta="0" android:toYDelta="100%p" android:duration="5000" />
 <alpha android:fromAlpha="1.0" android:toAlpha="0.0" android:duration="5000" />
</set>

动画资源 - push_up_in.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
 <translate android:fromYDelta="100%p" android:toYDelta="0" android:duration="5000"/>
 <alpha android:fromAlpha="0.0" android:toAlpha="1.0" android:duration="5000" />
</set>

动画资源 - push_up_out.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
 <translate android:fromYDelta="0" android:toYDelta="-100%p" android:duration="5000"/>
 <alpha android:fromAlpha="1.0" android:toAlpha="0.0" android:duration="5000" />
</set>

动画资源 - slide_in_left.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:shareInterpolator="false" >
    <translate android:duration="5000" android:fromXDelta="-100%" android:toXDelta="0%"/>
    <alpha android:duration="5000" android:fromAlpha="0.0" android:toAlpha="1.0" />
</set>

动画资源 - slide_in_right.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:shareInterpolator="false" >
    <translate android:duration="5000" android:fromXDelta="100%" android:toXDelta="0%" />
    <alpha android:duration="5000" android:fromAlpha="0.0" android:toAlpha="1.0" />
</set>

动画资源 - slide_out_left.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:shareInterpolator="false" >
    <translate android:duration="5000" android:fromXDelta="0%" android:toXDelta="-100%"/>
    <alpha android:duration="5000" android:fromAlpha="1.0" android:toAlpha="0.0" />
</set>

动画资源 - slide_out_right.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:shareInterpolator="false" >
    <translate android:duration="5000" android:fromXDelta="0%" android:toXDelta="100%"/>
    <alpha android:duration="5000" android:fromAlpha="1.0" android:toAlpha="0.0" />
</set>

【讨论】:

  • 很棒的代码示例,您能否通过一些指向良好文档/阅读的链接来解释答案的一些特定细节。
  • 您可以轻松地调低持续时间数字以获得更“现代”的速度动画:)
  • @ZooMagic 怎么做?请分享:)
  • @Darari 例如 android:duration="@android:integer/config_shortAnimTime"
【解决方案2】:

您可以像这样将自己的动画样式设置为 xml 文件(放在 anim 文件夹中):

从左到右:

  <set xmlns:android="http://schemas.android.com/apk/res/android"
     android:shareInterpolator="false">
        <translate android:fromXDelta="-100%" android:toXDelta="0%"
         android:fromYDelta="0%" android:toYDelta="0%"
         android:duration="500"/>
  </set>

从右到左:

    <set xmlns:android="http://schemas.android.com/apk/res/android"
     android:shareInterpolator="false">
     <translate
        android:fromXDelta="0%" android:toXDelta="100%"
        android:fromYDelta="0%" android:toYDelta="0%"
        android:duration="500" />
   </set>

在这里你可以设置你自己的持续时间值,可能这取决于手机型号,动画看起来如何,如果看起来不好,请尝试一些值。

然后你可以在你的活动中调用它:

     Intent animActivity = new Intent(this,YourStartAfterAnimActivity.class);
      startActivity(nextActivity);

      overridePendingTransition(R.anim.your_left_to_right, R.anim.your_right_to_left);

【讨论】:

【解决方案3】:

对于滑动两个活动(旧的和新的)相同的方向:

left_in.xml

<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="300"
    android:fromXDelta="-100%"
    android:toXDelta="0%"
    android:interpolator="@android:anim/decelerate_interpolator"
     />

right_in.xml

<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="300"
    android:fromXDelta="100%"
    android:toXDelta="0%"
    android:interpolator="@android:anim/decelerate_interpolator"
     />

left_out.xml

<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="300"
    android:fromXDelta="0%"
    android:interpolator="@android:anim/decelerate_interpolator"
    android:toXDelta="-100%" />

right_out.xml

<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="300"
    android:fromXDelta="0%"
    android:interpolator="@android:anim/decelerate_interpolator"
    android:toXDelta="100%" />

startActivity 过渡:

overridePendingTransition(R.anim.right_in, R.anim.left_out);

onBackPressed 转换:

overridePendingTransition(R.anim.left_in, R.anim.right_out);

【讨论】:

    【解决方案4】:

    我发现最简单的方法是使用Activity Transitions,真的很简单

    在要运行动画的 Activity 中覆盖 onCreate 方法:

    @Override
      protected void onCreate(Bundle savedInstanceState) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
          Slide slide = new Slide();
          slide.setSlideEdge(Gravity.RIGHT);
    
          getWindow().setEnterTransition(slide);
        }
        super.onCreate(savedInstanceState);
      }
    

    然后使用转换启动它(而不是 activity.startActivity(context)):

    activity.startActivity(starter, ActivityOptions.makeSceneTransitionAnimation(activity).toBundle());
    

    要使用 this.finish() 来关闭带有动画的活动,请使用以下代码:

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
          getActivity().finishAfterTransition();
        } else getActivity().finish();
    

    欲了解更多信息,请查看以下链接:

    【讨论】:

      【解决方案5】:

      看这个链接..你可以在这里看到很多种类的动画,只需将xml复制到你的res/anim文件夹中,然后像下面这样使用它..

      listView.setAnimation(AnimationUtils.loadAnimation(MainActivity.this,R.anim.slide_in_right));
      

      Animation Lists

      【讨论】:

        【解决方案6】:

        您可以制作自己的动画。例如像这样在 res/anim 中创建 xml 文件

        <?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android"
             android:interpolator="@android:anim/linear_interpolator">
            <translate
                    android:fromXDelta="100%p"
                    android:toXDelta="0"
                    android:startOffset="0"
                    android:duration="500"
                    /> </set>
        

        然后覆盖所选活动中的动画:

           overridePendingTransition(R.anim.animationIN, R.anim.animationOUT);
        

        【讨论】:

          【解决方案7】:

          从右到左的新页面动画

          <set xmlns:android="http://schemas.android.com/apk/res/android"
           android:shareInterpolator="false">
           <translate
              android:fromXDelta="0%" android:toXDelta="800%"
              android:fromYDelta="0%" android:toYDelta="0%"
              android:duration="600" />
          

          【讨论】:

            【解决方案8】:
            <translate
                android:fromXDelta="100%p"
                android:toXDelta="0%p"
                android:duration="500" />
            

            【讨论】:

            • 对我有用,但如果你写一些关于在哪里以及如何使用它的描述会更好。
            • 另外,对于那些想要向左滑出的人,将 fromXDelta 分配给“0%p”,将 toXDelta 分配给“-100%p”
            猜你喜欢
            • 2011-07-06
            • 2021-07-05
            • 2017-04-19
            • 2011-04-17
            • 2021-11-28
            • 1970-01-01
            • 1970-01-01
            • 2010-10-10
            • 1970-01-01
            相关资源
            最近更新 更多