这是我的问题。我有一个可点击= true的LinearLayout 一个onTouch事件,以便在触摸LinearLayout时,它会滑动 在屏幕上。这有效,但之后是onTouch事件 从新地点开火没有任何反应。
步骤:
看起来好像视图已移动到新位置,但实际上它没有。
以下是我的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]);
}
});
}
答案 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);
}