Here is my problem. I have a LinearLayout that has clickable=true for an onTouch Event so that when the LinearLayout is touched, it slides up the screen. This works, but afterward when the onTouch Event is fired from the new location nothing happens.
Steps:
- I touch the LinearLayout and it moves up like it should.
- I touch it again and nothing happens
- I touch the part of the screen where the LinearLayout was originally the LinearLayout will toggle like it should.
It appears as if the view has moved to a new location but in reality it has not.
Below is my xml & code.
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/julyContainer"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<RelativeLayout android:id="@+id/rel01"/>
<ImageView />
</RelativeLayout>
<ImageView
android:id="@+id/shadow"
android:paddingTop="6dip"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/header_barshadow"/>
<ScrollView
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical"
android:background="@drawable/bg_calendar"
android:id="@+id/calScroller">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<LinearLayout android:id="@+id/circleLayout"
android:orientation="horizontal"
android:clickable="true"
android:onClick="@string/circleAction"
android:paddingTop="10dip"
android:paddingLeft="10dip"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<Button
android:id="@+id/circleCal"
android:background="@drawable/cal_circle_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="@string/circleAction"/>
<LinearLayout
android:id="@+id/circleLayout01"
android:orientation="vertical"
android:paddingLeft="10dip"
android:paddingRight="3dip"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView/>
<TextView/>
<TextView/>
<LinearLayout android:id="@+id/julylayout2"
android:layout_width="match_parent"
android:layout_height="0dp"
android:orientation="vertical">
<TextView/>
</LinearLayout>
</LinearLayout>
</LinearLayout>
<ImageView android:id="@+id/etch1"
android:src="@drawable/etch_calendar"
android:paddingTop="15dip"
android:paddingBottom="15dip"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/circleLayout"/>
<LinearLayout android:id="@+id/squareLayout"
android:clickable="true"
android:onClick="@string/squareAction"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingLeft="10dip"
android:layout_below="@id/etch1">
<Button
android:id="@+id/squareCal"
android:background="@drawable/cal_square_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="@string/squareAction"/>
<LinearLayout
android:orientation="vertical"
android:paddingLeft="10dip"
android:paddingRight="3dip"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView/>
<TextView/>
<TextView/>
<LinearLayout android:id="@+id/layout3"
android:layout_width="match_parent"
android:layout_height="0dp"
android:orientation="vertical">
<TextView/>
</LinearLayout>
</LinearLayout>
</LinearLayout>
</RelativeLayout>
</ScrollView>
</LinearLayout>
CODE:
private void slideUp(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.25f);
slide.setDuration(1000);
slide.setFillAfter(true);
slide.setFillEnabled(true);
view.startAnimation(slide);
}
private void slideDown(View view) {
Animation slide = new TranslateAnimation(
Animation.RELATIVE_TO_SELF, 0.0f, Animation.RELATIVE_TO_SELF,
0.0f, Animation.RELATIVE_TO_SELF, -0.25f, Animation.RELATIVE_TO_SELF, 0.0f);
slide.setDuration(1000);
slide.setFillAfter(true);
slide.setFillEnabled(true);
view.startAnimation(slide);
}
NEW CHANGES: output of new positions
07-05 13:20:22.084: I/System.out(15187): onAnimationStart 0 , 120
07-05 13:20:23.053: I/System.out(15187): onAnimationEnd 0 , 120
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.75f);
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) {
final int left = view.getLeft();
final int top = view.getTop();
final int right = view.getRight();
final int bottom = view.getBottom();
int offset = (int) 0.75;
view.layout(left, top + offset * top, right, bottom + offset * bottom);
int[] endPosition = new int[2];
view.getLocationOnScreen(endPosition);
System.out.println("onAnimationEnd " + endPosition[0] + " , " + endPosition[1]);
}
});
}
This is normal behaviour for android animation. It is happening because animation does not really moves the layout so it's position on the display remains the same. If you want to relocate your layout to the place where your animation ends, you need to call
yourLayout.layout()
method and pass there 4 parameters, which describe layout's new position. Keep in mind thatlayout()
gets params relative to it's parent.See sample code below