我正在编写一个Android应用程序,并在编写应用程序的主要部分时遇到了问题。
我需要让ImageView消失一两秒钟,然后在点击时重新出现。点击部分工作,我使用XML使其可点击,然后点击调用方法。问题出在我打电话的方法中。我需要它:
我的问题是,无论我做什么,它都不会明显消失。我更喜欢远离Thread.sleep()因为我希望用户能够在不可见的情况下点击其他东西(如果我误解了Thread.sleep(),请告诉我。如果可以拥有所有方法是自己的线程,请告诉我如何。我仍然是Java的新手。)但是,我确实尝试使用Thread.sleep(),它在睡眠语句之前暂停了代码行,但没有明显影响消失和重新出现之间的时间量。 (这可能听起来令人困惑,看到代码将有助于解释它)。我还尝试使用while语句计数到100,然后当计数器达到100时重新出现,但这不起作用。我想过使用计时器,但我需要一个非常简洁的例子,因为这个计时器需要进入24种不同的方法。这是代码,它应该有助于解释一下。
这是我尝试的第一件事,我最好不要使用
public void tb1(View view){
b1.setVisibility(View.INVISIBLE); //Make the ImageView Invisible
playerscore ++;
score.setText("SCORE: " + playerscore); //The sleep affected this line for some reason
Thread.sleep(1000)
b1.setVisibility(View.VISIBLE) //Make the ImageView Visible
}
这是我尝试的第二件事。
public void tb1(View view) throws InterruptedException{
int i = 0;
b1.setVisibility(View.INVISIBLE);
playerscore ++;
score.setText("SCORE: " + playerscore);
while (i < 100){
i++;
}
if(i == 100){
b1.setVisibility(View.VISIBLE);
}
}
对于这个,就像我什么也没做。什么都没有延迟。
我真的不知道尝试什么。我使用了错误的东西,还是只是使用了错误的东西?请耐心等待我,我仍然是Java新手,并且经验不足。
提前感谢您提供任何/所有帮助!
<小时/> UPDATE 我从答案中添加了代码但没有任何改变。它消失了,但没有再出现。我有任何语法或任何值错误吗?
public void tb1(View view){
b1.setImageAlpha(0);
b1.animate().alpha(1f).setDuration(0).setStartDelay(3000).start();
playerscore++;
score.setText("SCORE: " + playerscore);
}
答案 0 :(得分:3)
如果您不需要任何动画,那么只需使用此代码,假设b1
是您的类变量:
b1.setVisibility(View.INVISIBLE);
b1.postDelayed(new Runnable() {
@Override
public void run() {
b1.setVisibility(View.VISIBLE);
}
}, 3000);
答案 1 :(得分:1)
<强>更新强>
M-WaJeEh的PostDelayed()方法非常酷 - 并且将代码调整到动画也不难。我的原始代码不起作用的原因是因为我们没有仔细阅读API。
折旧setAlpha(int)以支持 setImageAlpha(int)
然而,setAlpha(float)不是。
区别在于 setAlpha(int)和 setImageAlpha(int)设置图像上的alpha,而不是视图和 setAlpha(float)在实际视图上设置alpha。这是一个重要的区别,因为当图像在视图中时,图像本身不能被动画化。
因此,为了让它发挥作用 - 它应该是:
b1.setAlpha(0f);
b1.animate().alpha(1f).setDuration(0).setStartDelay(1000).start();
然后我尝试编写它以便视图淡出然后淡入。原来,当你有多个(或者我不是)时,AnimationSet非常破碎并且不会为AlphaAnimations设置动画。正确理解AnimationSet)。 PostDelayed()解决了这个问题,这是一件好事。
以下是一个例子:
<强> MainActivity.java 强>
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button button = (Button) findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
final ImageView imageView = (ImageView) findViewById(R.id.image);
imageView.animate().alpha(0f).setDuration(500);
imageView.postDelayed(new Runnable(){
@Override
public void run() {
imageView.animate().alpha(1f).setDuration(500);
}
}, 3000);
}
});
}
}
我们还可以将OnClickListener换成这样的东西,在点击时切换透明和不透明:
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
ImageView imageView = (ImageView) findViewById(R.id.image);
float alpha = imageView.getAlpha();
if (alpha == 0f) {
imageView.animate().alpha(1f).setDuration(500);
} else if (alpha == 1f) {
imageView.animate().alpha(0f).setDuration(500);
}
}
});
<强> activity_main.xml中强>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:gravity="center" >
<Button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="20dp"
android:text="Animate" />
<ImageView
android:id="@+id/image"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@android:drawable/bottom_bar" />
</LinearLayout>
这就是它的样子。太糟糕了我还不能发布图片。
点击时在透明和不透明之间切换:
https://dl.dropboxusercontent.com/u/2588338/Stuff/Untitled-1.gif
点击一次,淡出然后淡入:
https://dl.dropboxusercontent.com/u/2588338/Stuff/Untitled-2.gif
旧答案
你会想要使用Android的动画框架。
此外,第二种方法不起作用的原因是计算机非常快地计算数字 ,计算到100就完全不需要时间计算机 - 即使你想要计算到一个足够高的数字(或者说,每个循环让它睡10ms),它只会做与第一种方法相同的事情 - 阻止主线程并且不允许任何用户交互。
你想要的不是让视图消失,而是将视图的alpha设置为0,然后将视图的alpha设置为1并延迟。
这样的事情:
b1.setAlpha(0);
b1.animate().alpha(1f).setDuration(0).setStartDelay(1000).start();
具体来说,就你的例子而言(因为我对你对config_shortAnimTime的评论有点困惑 - 这只是Android系统定义的值):
public void tb1(View view){
//Make the ImageView invisible
b1.setAlpha(0);
// Make the ImageView visible after 1 second with no animation delay
b1.animate().alpha(1f).setDuration(0).setStartDelay(1000).start();
playerscore++;
score.setText("SCORE: " + playerscore);
}
如果您做了类似的事情,那么:
b1.animate().alpha(1f).setDuration(500).setStartDelay(2000).start();
然后b1因为setStartDelay()而在2秒内不可见,然后因为setDuration()而需要500毫秒才能淡入。