在TranslateAnimation之后,LinearLayout onclick不会转换

时间:2012-07-05 07:40:03

标签: android android-animation

这是我的问题。我有一个可点击= true的LinearLayout 一个onTouch事件,以便在触摸LinearLayout时,它会滑动 在屏幕上。这有效,但之后是onTouch事件 从新地点开火没有任何反应。

步骤:

  1. 我触摸了LinearLayout,它会像它应该的那样向上移动。
  2. 我再次触摸它,没有任何反应
  3. 我触摸了屏幕中LinearLayout最初为LinearLayout切换的部分。
  4. 看起来好像视图已移动到新位置,但实际上它没有。

    以下是我的xml&码。

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

    新变化:新职位的输出

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

1 个答案:

答案 0 :(得分:2)

这是Android动画的正常行为。它正在发生,因为动画并没有真正移动布局,所以它在显示器上的位置保持不变。如果要将布局重新定位到动画结束的位置,则需要调用yourLayout.layout()方法并传递4个参数,这些参数描述布局的新位置。请记住,layout()相对于父母而言会获得参数。

参见下面的示例代码

private 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 = view.getLeft();
            final int top = view.getTop();
            final int right = view.getRight();
            final int bottom = view.getBottom();
            view.layout(left, top - 0.25 * top, right, bottom - 0.25 * bottom);
        }
};

private Animation slideDownAnimation = 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
                                     );

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