문제

I have an imageview that's included inside a RelativeLayout. When the imageview is clicked, I animate the entire RelativeLayout with a translate animation to move it down.

when I click the imageview again (in it's new location) it's supposed to move it back up, but it does not. However, if I click where the imageview started, it does move the entire "panel" back up. Why is the imageview not moving with the relativelayout...at least insofar as the clickability of it. The actual image is moving, but the spot where it's clickable is not.

here is my xml for the layout:

<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>

Edit: I should add that I'm using Animation.setFillAfter(true) to hold the panel in place after the animation completes.

도움이 되었습니까?

해결책

This is because animations actually do not affect views positions, they just draw them. So to handle click at new place you have to place something there (i.e. invisible FrameLayout). Or you can change your views margins on animation complete, so the views actually will move to the place.

다른 팁

I had the same problem and the best solution I found is to add an AnimationListener to your animation and move the view yourself in that listener as Konstantin Burov said :

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);

The Utils.dpToPx may be useful too :

public final static int dpToPx(Context context, int dp) {
    return ((int)((dp * context.getResources().getDisplayMetrics().density) + 0.5));
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top