有一个带有高行的列表视图。在每一行中,都有一个名为btn_to_show_actual
的按钮,用于显示隐藏的相对布局ll_hide_btn
(包含多个按钮的布局),该布局从屏幕的右侧到屏幕的右侧(在相同的Y位置)父行。
X_in_screen = Constants.SCREEN_W * 1/2 ;
X_out_screen = Constants.SCREEN_W
Y_in_screen = Constants.SCREEN_H /2;
以上内容均已正确核对。
代码如下:
<ImageButton
android:id="@+id/btn_to_show_actual"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:background="@null"
android:src="@drawable/btn_to_show_actual_selector"
android:scaleType="fitXY"/>
<RelativeLayout
android:id="@+id/ll_hide_btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignTop="@+id/btn_to_show_actual"
android:layout_alignBottom="@+id/btn_to_show_actual"
android:layout_toLeftOf="@+id/btn_to_show_actual"
android:orientation="horizontal">
<ImageButton
android:id="@+id/btn_to_show"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_toLeftOf="@+id/btn_delete"
android:background="@null"
android:src="@drawable/btn_left_selector"
android:scaleType="fitXY"/>
<ImageButton
android:id="@+id/btn_to_hide"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_toLeftOf="@+id/btn_delete"
android:background="@null"
android:src="@drawable/btn_right_selector"
android:scaleType="fitXY"/>
<ImageButton
android:id="@+id/btn_delete"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_toLeftOf="@+id/btn_amend"
android:background="@null"
android:src="@drawable/btn_delete_selector"
android:scaleType="fitXY"/>
<ImageButton
android:id="@+id/btn_amend"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_toLeftOf="@+id/btn_share"
android:background="@null"
android:src="@drawable/btn_input_selector"
android:scaleType="fitXY"/>
<ImageButton
android:id="@+id/btn_share"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:background="@null"
android:src="@drawable/btn_share2_selector"
android:scaleType="fitXY"/>
</RelativeLayout>
btn_to_show_actual.setOnClickListener(new View.OnClickListener()
{
public void onClick(View v) {
Utilities.system_toast(Show_database.this, "btn to show actual pressed" + "\n" + "X-screen=" + Constants.SCREEN_W + "; X-in=" + X_in_screen + "; X-out= " + X_out_screen + "; Y=" + Y_in_screen);
//btn_to_show_actual.setVisibility(View.INVISIBLE);
btn_to_show.setVisibility(View.VISIBLE);
translate_to_left = new TranslateAnimation(Animation.ABSOLUTE, X_out_screen, // from X0
Animation.ABSOLUTE, X_in_screen, // to X1
Animation.ABSOLUTE, Y_in_screen, // from Y0
Animation.ABSOLUTE, Y_in_screen); // to Y1
translate_to_left.setInterpolator(new DecelerateInterpolator());
translate_to_left.setDuration(800);
translate_to_left.setFillAfter(true);
translate_to_left.setAnimationListener(new Animation.AnimationListener() {
public void onAnimationStart(Animation a) {
}
public void onAnimationRepeat(Animation a) {}
public void onAnimationEnd(Animation a)
{
btn_to_hide.setVisibility(View.VISIBLE);
btn_to_show.setVisibility(View.INVISIBLE);
}
});
ll_hide_btn.startAnimation(translate_to_left);
}
});
btn_to_hide.setOnClickListener(new View.OnClickListener()
{
public void onClick(View v)
{
Utilities.system_toast(Show_database.this, "btn to hide pressed");
translate_to_right = new TranslateAnimation(Animation.ABSOLUTE, X_in_screen, // from X0
Animation.ABSOLUTE, X_out_screen, // to X1
Animation.ABSOLUTE, Y_in_screen, // from Y0
Animation.ABSOLUTE, Y_in_screen); // to Y1
translate_to_right.setInterpolator(new DecelerateInterpolator());
translate_to_right.setDuration(800);
translate_to_right.setFillAfter(true);
translate_to_right.setAnimationListener(new Animation.AnimationListener() {
public void onAnimationStart(Animation a) {
}
public void onAnimationRepeat(Animation a) {}
public void onAnimationEnd(Animation a)
{
btn_to_hide.setVisibility(View.INVISIBLE);
btn_to_show.setVisibility(View.VISIBLE);
btn_to_show_actual.setVisibility(View.VISIBLE);
}
});
ll_hide_btn.startAnimation(translate_to_right);
}
});
按btn_to_show_actual
后,ll_hide_btn
无法从屏幕外转换为屏幕。如何使ll_hide_btn
显示/消失并正确翻译?
答案 0 :(得分:0)
我建议使用Animator而不是Animation,因为它只会更改对象的视觉表示。因此,使用“动画”按钮触摸坐标时可能会遇到问题
另一方面,动画师会更改对象的物理属性。因此,如果将视图移动到新位置,则触摸坐标将映射到新位置。
要获得所需的行为,不需要平移Y轴,只需平移X轴。您可以在X_out_screen位置将ll_hide_btn的初始TranslationX设置为在屏幕外设置ll_hide_btn,如果要将按钮转换为屏幕,则将其动画化为0
您的实现可能类似于:
在X_out_screen位置设置ll_hide_btn translationX:
ll_hide_btn.setTranslationX(X_out_screen)
OnClickListeners:
btn_to_show_actual.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
btn_to_show.setVisibility(View.VISIBLE);
ll_hide_btn.animate()
.translationX(0f)
.setDuration(800)
.setInterpolator(new DecelerateInterpolator())
.setListener(new Animator.AnimatorListener() {
@Override
public void onAnimationStart(Animator animation) {
}
@Override
public void onAnimationEnd(Animator animation) {
btn_to_hide.setVisibility(View.VISIBLE);
btn_to_show.setVisibility(View.INVISIBLE);
}
@Override
public void onAnimationCancel(Animator animation) {
}
@Override
public void onAnimationRepeat(Animator animation) {
}
});
}
});
btn_to_hide.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
ll_hide_btn.animate()
.translationX(X_out_screen.toFloat())
.setDuration(800)
.setInterpolator(new DecelerateInterpolator())
.setListener(new Animator.AnimatorListener() {
@Override
public void onAnimationStart(Animator animation) {
}
@Override
public void onAnimationEnd(Animator animation) {
btn_to_hide.setVisibility(View.INVISIBLE);
btn_to_show.setVisibility(View.VISIBLE);
btn_to_show_actual.setVisibility(View.VISIBLE);
}
@Override
public void onAnimationCancel(Animator animation) {
}
@Override
public void onAnimationRepeat(Animator animation) {
}
});
}
});