2012-11-10 77 views
2

我已经在android中创建一个视图,我需要从底部到顶部,反之亦然动画。我已经成功地使用TranslateAnimation来做到这一点。但问题是我在视图上有几个按钮。当动画那里接触点保持在原来的位置,并没有移动到新的位置。所以当我再次单击按钮的原始位置时,顶部到底部的动画将运行,但按钮不存在。按钮不动后动画android

我搜索了互联网和人们说,调用view.layout与参数,但我的问题是如何获得视图的最新位置,因为我试图获取位置动画开始和动画结束和它保持不变。

另外请不要给出答案,它实际上不会移动视图它创建一个副本并移动它等等因为我已经搜索,但无法找到一个合适的解决方案描述或实施。

下面是代码:

import android.content.Context; 
import android.graphics.Matrix; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.animation.Animation; 
import android.view.animation.Animation.AnimationListener; 
import android.view.animation.Transformation; 
import android.view.animation.TranslateAnimation; 
import android.widget.ImageButton; 
import android.widget.LinearLayout; 
import com.Card_Android.R; 

public class GameMenuScreenAnimated extends LinearLayout { 

private final View mainView; 

public GameMenuScreenAnimated(Context context, 
     final GameViewController dashboardVC) { 

    super(context); 
    LayoutInflater inflater = LayoutInflater.from(context); 
    mainView = inflater.inflate(R.layout.main_menu, this); 

    ImageButton btn = (ImageButton) mainView.findViewById(R.id.trade); 
    btn.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      System.out.println("yaaaaaay!!!!"); 

     } 
    }); 

    slideDown(mainView); 
} 

public View getMainView() { 
    return mainView; 
} 

private void slideUp(final View view) { 

    Animation slide = new TranslateAnimation(Animation.RELATIVE_TO_SELF, 
      0.0f, Animation.RELATIVE_TO_SELF, 0.0f, 
      Animation.RELATIVE_TO_SELF, 0.0f, Animation.RELATIVE_TO_SELF, 
      0.5f); 
    slide.setDuration(1000); 
    slide.setFillAfter(true); 
    slide.setFillEnabled(true); 
    view.startAnimation(slide); 
    slide.setAnimationListener(new AnimationListener() { 

     @Override 
     public void onAnimationStart(Animation animation) { 
      int[] startPosition = new int[2]; 
      view.getLocationOnScreen(startPosition); 
      System.out.println("onAnimationStart " + startPosition[0] 
        + " , " + startPosition[1]); 
     } 

     @Override 
     public void onAnimationRepeat(Animation animation) { 
     } 

     @Override 
     public void onAnimationEnd(Animation animation) { 
      int[] endPosition = new int[2]; 
      view.getLocationOnScreen(endPosition); 
      System.out.println("onAnimationEnd " + endPosition[0] + " , " 
      + endPosition[1]); 

     } 

    }); 

} 

private final AnimationListener slideDownAnimationListener = new AnimationListener() { 
    @Override 
    public void onAnimationStart(Animation animation) { 
    } 

    @Override 
    public void onAnimationRepeat(Animation animation) { 
    } 

    @Override 
    public void onAnimationEnd(Animation animation) { 
     final int left = mainView.getLeft(); 
     final int top = mainView.getTop(); 
     final int right = mainView.getRight(); 
     final int bottom = mainView.getBottom(); 
     mainView.layout(left, (int) Math.round(top + 0.25 * top), right, 
       (int) Math.round(bottom + 0.25 * bottom)); 
    } 
}; 

private final Animation slideDownAnimation = new TranslateAnimation(
     Animation.RELATIVE_TO_SELF, 0.0f, Animation.RELATIVE_TO_SELF, 0.0f, 
     Animation.RELATIVE_TO_SELF, 0.0f, Animation.RELATIVE_TO_SELF, 0.25f); 

private void slideDown(final View view) { 
    slideDownAnimation.setDuration(1000); 
    slideDownAnimation.setFillAfter(true); 
    slideDownAnimation.setFillEnabled(true); 
    slideDownAnimation.setAnimationListener(slideDownAnimationListener); 
    view.startAnimation(slideDownAnimation); 
} 
} 

的XML:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="fill_parent" 
android:layout_height="wrap_content" 
android:orientation="vertical" 
android:gravity="bottom" 
> 
<LinearLayout 
    android:id="@+id/tableLayout1" 
    android:layout_height="wrap_content" 
    android:layout_width="fill_parent" 
    android:gravity="center" 
    > 

     <ImageButton 
      android:id="@+id/trade" 
      android:layout_width="50dp" 
      android:layout_height="50dp" 
      android:layout_margin="0dp" 

      android:background="@null" 
      android:scaleType="centerCrop" 
      android:src="@drawable/upgrade_btn" /> 

    </LinearLayout> 

<LinearLayout 
    android:id="@+id/tableLayout1" 
    android:layout_width="fill_parent" 
    android:gravity="center" 
    android:layout_height="wrap_content" 
    > 

     <ImageButton 
        android:id="@+id/evolution" 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:layout_margin="0dp" 
        android:background="@null" 
        android:scaleType="centerCrop" 
        android:src="@drawable/sell_btn" /> 
      <ImageButton 
        android:id="@+id/trade" 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:layout_margin="0dp" 
        android:background="@null" 
        android:scaleType="centerCrop" 
        android:src="@drawable/upgrade_btn" 
        /> 

    </LinearLayout> 
</LinearLayout> 

提拉XML

<?xml version="1.0" encoding="utf-8"?> 

<selector xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/evolution"> 
<item android:state_pressed="true" android:drawable="@drawable/menu_off" /> <!-- pressed --> 
<item android:state_focused="true" android:drawable="@drawable/menu_on" /> <!-- focused --> 
<item android:drawable="@drawable/menu_on" /> <!-- default --> 
</selector> 

所有我想要做的是创造是几个简单的菜单在按钮点击时滑入和滑出的按钮。

+0

no xml?没有代码? –

+0

在这里你去!我已经添加了代码。 –

+0

顺便说一句,还有两个其他drwable XML,我没有提到几乎相同与图像被改变的差异。 –

回答

1

前段时间我遇到了同样的问题。您会在这里找到我的答案:

How can I apply the changes to the position of a view after an animation?

另一种方法是使用动画() - 功能或ObjectAnimator。这两种动画方式都会影响视图对象本身,而不是只更新屏幕上的像素,而不更新视图下落的内部值。您在此处找到有关这些功能的详细信息:)

动画((又名ViewPropertyAnimator): http://developer.android.com/guide/topics/graphics/prop-animation.html#view-prop-animator

ObjectAnimator:http://developer.android.com/guide/topics/graphics/prop-animation.html#object-animator

整个动画章是一个很好的阅读。这可能需要20分钟,但之后你可以更好地了解Android上的动画。