[英]Android - make ImageView “blink”
I want to make my ImageView appear to blink. 我想让我的ImageView看起来像是闪烁。 More exactly, on an event like a button click, I want an ImageView to change its src for 1 second, then change back, then again etc. And then it should stop, and the ImageView should have the same src as previous.
更确切地说,在按钮单击等事件上,我希望ImageView将其src更改1秒,然后再更改,然后再更改等等。然后它应该停止,并且ImageView应该具有与之前相同的src。 I tried to do something based on another question, but it doesn't work...
我试图根据另一个问题做一些事情,但它不起作用......
private class MyHandler extends Handler {
public ImageView imgView;
@Override
public void handleMessage(Message msg) {
if (imgView != null) {
switch (msg.what) {
case 0:
imgView.setImageResource(R.drawable.red_img);
break;
case 1:
imgView.setImageResource(R.drawable.white_img);
break;
}
}
super.handleMessage(msg);
}
}
(...)
MyHandler blinker = new MyHandler();
blinker.imgView = imgView;
for (int j = 0; j < 5; j++) {
Message msg = new Message();
if (j % 2 == 0) {
msg.what = 0;
} else {
msg.what = 1;
}
blinker.sendMessageDelayed(msg, j * 300);
}
Does anyone know how this can be done (if it CAN be done). 有谁知道如何做到这一点(如果可以做到的话)。 Thanks!
谢谢!
Or you could simply use AnimationDrawable by defining it in xml: 或者你可以通过在xml中定义它来简单地使用AnimationDrawable :
<animation-list android:id="@+id/selected" android:oneshot="false">
<item android:drawable="@drawable/state1" android:duration="1000" />
<item android:drawable="@drawable/state2" android:duration="1000" />
</animation-list>
and calling start()
on it: 并在其上调用
start()
:
ImageView img = (ImageView)findViewById(R.id.spinning_wheel_image);
img.setImageResource(R.drawable.my_blinking_drawable);
AnimationDrawable frameAnimation = (AnimationDrawable) img.getDrawable();
frameAnimation.start();
The following code will place an ImageView on the screen, and when the ImageView is clicked, it will blink between 2 different images for 5 seconds: 下面的代码将在屏幕上放置一个ImageView,当单击ImageView时,它将在2个不同的图像之间闪烁5秒:
int numberOfTimesToBlink = 4;
long blinkInterval = 1000; // 1 second
final ImageView blinkingImageView = (ImageView)findViewById(R.id.blinkingImageView);
// setBackgroundDrawable is deprecated but it still works, and the newer method (setBackground) has min API level of 16
blinkingImageView.setBackgroundDrawable(getResources().getDrawable(R.drawable.yourFirstImage));
blinkingImageView.setTag("yourFirstImage");
final CountDownTimer blinkTimer = new CountDownTimer((numberOfTimesToBlink+1)*1000, blinkInterval) {
@Override
public void onTick(long millisUntilFinished) {
if (blinkingImageView.getTag() == "yourFirstImage") {
blinkingImageView.setBackgroundDrawable(getResources().getDrawable(R.drawable.yourSecondImage));
blinkingImageView.setTag("yourSecondImage");
}
else if (blinkingImageView.getTag() == "yourSecondImage") {
blinkingImageView.setBackgroundDrawable(getResources().getDrawable(R.drawable.yourFirstImage));
blinkingImageView.setTag("yourFirstImage");
}
}
@Override
public void onFinish() {
}
};
blinkingImageView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
blinkTimer.start();
}
});
And the xml file: 和xml文件:
<RelativeLayout 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:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin"
tools:context=".MainActivity">
<ImageView android:id="@+id/blinkingImageView"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</RelativeLayout>
You can just change the temporary source image and start a Timer for 1 second, after which the original image can be shown again: 您只需更改临时源图像并启动计时器1秒钟,之后可以再次显示原始图像:
image.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(final View v) {
ImageView img = (ImageView) v;
img.setImageResource(R.drawable.temporary_image);
Timer t = new Timer();
t.schedule(new TimerTask() {
@Override
public void run() {
runOnUiThread(new Runnable() {
@Override
public void run() {
img.setImageResource(R.drawable.main_image)
}
});
}
}, 1000);
}
});
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<alpha android:fromAlpha="0.0"
android:toAlpha="1.0"
android:interpolator="@android:anim/accelerate_interpolator"
android:duration="600"
android:repeatMode="reverse"
android:repeatCount="infinite"/>
</set>
or have a look at this 或看看这个
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.