可点击的imageview位置随动画变化 - android

时间:2010-08-30 22:47:16

标签: android animation imageview relativelayout

我有一个包含在RelativeLayout中的imageview。单击图像视图时,我会使用平移动画为整个RelativeLayout设置动画以将其向下移动。

当我再次点击图像视图(在它的新位置)时,它应该将其向上移动,但事实并非如此。但是,如果我单击imageview开始的位置,它会将整个“面板”移回。为什么imageview不会随相对布局移动...至少就其可点击性而言。实际图像正在移动,但可点击的位置不是。

这是布局的xml:

<RelativeLayout
    android:layout_alignParentTop="true"
    android:layout_alignParentLeft="true"
    android:layout_width="fill_parent"
    android:layout_height="120px"       
    android:layout_marginTop="-106px"
    android:id="@+id/chatbox"
    android:visibility="invisible">
    <TextView
        android:layout_width="fill_parent"
        android:layout_height="106px"
        android:background="#000000"
        android:id="@+id/chattext" />
    <ImageView
        android:layout_width="20px"
        android:layout_height="14px"
        android:id="@+id/chatbubble"
        android:layout_below="@id/chattext"
        android:src="@drawable/chatbubble" />
</RelativeLayout>

编辑:我应该添加我正在使用Animation.setFillAfter(true)在动画完成后将面板保持在原位。

2 个答案:

答案 0 :(得分:2)

这是因为动画实际上不影响视图位置,它们只是绘制它们。所以要处理新地方的点击,你必须在那里放置一些东西(即不可见的FrameLayout)。或者您可以在动画完成时更改视图边距,因此视图实际上将移动到该位置。

答案 1 :(得分:0)

我遇到了同样的问题,我找到的最佳解决方案是在动画中添加一个AnimationListener,然后在Konstantin Burov所说的那个监听器中自己移动视图:

animation.setFillAfter(false);

AnimationListener animListener = new AnimationListener() {

    @Override
    public void onAnimationStart(Animation animation) {
    }

    @Override
    public void onAnimationRepeat(Animation animation) {
    }

    @Override
    public void onAnimationEnd(Animation animation) {
        RelativeLayout.LayoutParams relativeLayoutParams = (LayoutParams) yourView.getLayoutParams();

        //To avoid the flicker
        yourView.clearAnimation();

        relativeLayoutParams.setMargins(0, 0, 0, Utils.dpToPx(activity, newPositionDp);
        yourView.setLayoutParams(relativeLayoutParams);
    }
};

animation.setAnimationListener(animListener);

Utils.dpToPx也可能有用:

public final static int dpToPx(Context context, int dp) {
    return ((int)((dp * context.getResources().getDisplayMetrics().density) + 0.5));
}