Android:如何在活动之间制作动画?

时间:2012-06-28 11:56:42

标签: android animation android-activity swipe

我对Android中的动画有疑问。我已经制作了一个包含很多产品的应用程序,你现在可以通过从左到右滑动屏幕来切换产品(转到列表中的下一个产品)但是现在只需加载其他任何活动。

我想要的是很多其他应用程序也有的功能,刷卡需要让旧的活动离开屏幕,而新的活动同时进入。

我经常搜索和阅读,但我真的不知道从哪里开始。

我的产品是活动,这就是他们现在切换的方式:

@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
        float velocityY) {
     try {
         if (Math.abs(e1.getY() - e2.getY()) > SWIPE_MAX_OFF_PATH)
             return false;
         // left to right swipe
         if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
             for(HashMap h: products) {
                 if (h.get("id").toString().equals(id)) {
                     int index = products.indexOf(h)-1;

                     if (index != -1) {
                        HashMap product = products.get(index);

                        dialog = ProgressDialog.show(ProductActivity.this, "", 
                                 "Laden...", true);
                        Intent i = new Intent(ProductActivity.this, ProductActivity.class);
                        i.putExtra("id", product.get("id").toString());
                        i.putExtra("profileId", profileId);
                        i.putExtra("score", product.get("score").toString());
                        i.putExtra("products", products);
                        startActivity(i);
                    }
                     else {
                         Toast.makeText(ProductActivity.this, "Dit is het eerste product in de lijst.", Toast.LENGTH_LONG).show();
                     }
                 }
             }
         }
         //right to left swipe
         else if(e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
             for(HashMap h: products) {
                 if (h.get("id").toString().equals(id)) {
                     int index = products.indexOf(h)+1;

                     if (index != products.size()) {
                        HashMap product = products.get(index);

                        dialog = ProgressDialog.show(ProductActivity.this, "", 
                                 "Laden...", true);
                        Intent i = new Intent(ProductActivity.this, ProductActivity.class);
                        i.putExtra("id", product.get("id").toString());
                        i.putExtra("profileId", profileId);
                        i.putExtra("score", product.get("score").toString());
                        i.putExtra("products", products);
                        startActivity(i);
                    }
                     else {
                         Toast.makeText(ProductActivity.this, "Dit is het laatste product in de lijst.", Toast.LENGTH_LONG).show();
                     }
                 }
             }
         }
     } catch (Exception e) {
         // nothing
     }
     return false;
}

2 个答案:

答案 0 :(得分:2)

你可以尝试这个Android-Viewflow library

  

ViewFlow是一个Android UI小部件,提供可水平滚动的ViewGroup,其中包含从适配器填充的项目。

Viewflow with Circle indicators Viewflow with Title indicators

答案 1 :(得分:2)

使用overridePendingTransition,您可以覆盖活动的下一个动画。 覆盖方法startActivity并完成活动并在那里调用overridePendingTransition。

您可以在anim文件夹中将使用过的动画指定为xml文件。

对于幻灯片动画,请使用以下内容:

<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate 
    android:fromXDelta="-100%"
    android:toXDelta="0"
    android:fromYDelta="0"
    android:toYDelta="0"
    android:interpolator="@android:anim/accelerate_decelerate_interpolator"
    android:duration="@android:integer/config_longAnimTime" />
</set>

以及幻灯片动画:

<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate 
    android:fromXDelta="0"
    android:toXDelta="100%"
    android:fromYDelta="0"
    android:toYDelta="0"
    android:interpolator="@android:anim/accelerate_decelerate_interpolator"
    android:duration="@android:integer/config_longAnimTime" />
</set>

根据fromXDelta和toXDelta中使用的值,您可以确定它应该滑动的方向。