在我的活动中,我有一个开关,当选中该开关时会创建一个动画,并且屏幕上会出现一个按钮。禁用开关后,该按钮也随动画一起消失。当按钮消失时,我将可见性设置为走了,当它出现时,我将可见性设置为可见。
按钮的初始状态已消失,当我尝试单击该位置时,应该没有任何反应。当按钮出现时,它变为可单击的。如果我再次使其消失,则仍然可以单击。这是为什么?我认为将可见性设置为“消失”可以防止按钮被触发。我知道我可以将按钮设置为setEnabled(false)
,但我很好奇为什么在将按钮的可见性设置为“消失”时仍可单击该按钮。
这是我的onCreate()
:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
handler = new Handler();
show = AnimationUtils.loadAnimation(getApplicationContext(),R.anim.show);
hide = AnimationUtils.loadAnimation(getApplicationContext(),R.anim.hide);
((SwitchCompat)findViewById(R.id.animation_switch)).setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if(isChecked){
handler.postDelayed(new Runnable() {
@Override
public void run() {
((AppCompatButton)findViewById(R.id.animated_button)).startAnimation(show);
((AppCompatButton)findViewById(R.id.animated_button)).setVisibility(View.VISIBLE);
}
}, 3000);
}else{
handler.postDelayed(new Runnable() {
@Override
public void run() {
((AppCompatButton)findViewById(R.id.animated_button)).startAnimation(hide);
((AppCompatButton)findViewById(R.id.animated_button)).setVisibility(View.GONE);
}
},3000);
}
}
});
((AppCompatButton)findViewById(R.id.animated_button)).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(MainActivity.this, "Button Clicked", Toast.LENGTH_LONG).show();
}
});
这里是布局:
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="36dp"
android:layout_marginTop="32dp"
android:text="Animataion"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/textView" />
<android.support.v7.widget.SwitchCompat
android:id="@+id/animation_switch"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="32dp"
android:layout_marginTop="24dp"
android:checked="false"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toBottomOf="@+id/notification_switch" />
<android.support.v7.widget.AppCompatButton
android:id="@+id/animated_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="8dp"
android:layout_marginStart="8dp"
android:layout_marginTop="176dp"
android:text="click me"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
android:visibility="gone"/>
</android.support.constraint.ConstraintLayout>
这是放映动画:
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" android:fillAfter="true">
<scale
android:duration="450"
android:fromXScale="0.0"
android:fromYScale="0.0"
android:toXScale="1.0"
android:toYScale="1.0"
android:pivotX="50%"
android:pivotY="50%"
/>
</set>
这是隐藏动画:
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" android:fillAfter="true">
<scale
android:duration="300"
android:fromXScale="1.0"
android:fromYScale="1.0"
android:toXScale="0.0"
android:toYScale="0.0"
android:pivotX="50%"
android:pivotY="50%"
/>
</set>
答案 0 :(得分:1)
如果在动画之后设置setVisibility(View.GONE),请尝试在动画末尾使用clearAnimation()清除视图上的动画
mview.clearAnimation()
OR
这在初始化动画时也可以使用,因为动画存在一些错误。
show = AnimationUtils.loadAnimation(getApplicationContext(),R.anim.show);
hide = AnimationUtils.loadAnimation(getApplicationContext(),R.anim.hide);
show.setFillAfter(false);
hide.setFillAfter(false);
答案 1 :(得分:0)
尝试这样的事情
hide = AnimationUtils.loadAnimation(getApplicationContext(),R.anim.hide);
hide.setAnimationListener(new Animation.AnimationListener() {
@Override
public void onAnimationStart(Animation animation) {}
@Override
public void onAnimationEnd(Animation animation) {
((AppCompatButton)findViewById(R.id.animated_button)).setVisibility(View.GONE);
((AppCompatButton)findViewById(R.id.animated_button)).setEnabled(false);
}
@Override
public void onAnimationRepeat(Animation animation) {}
});