ViewFlipper一般被用作指定的多个View对象的动态切换,当想要自动播放时,一般可使用startFlipping()启动播放,如下:
private ViewFlipper mViewFLipperBG;
private List
上述代码开屏时能正常操作,但是当锁屏重开时,会发现ViewFlipper不会播放而且即使主动调用startFlipper()也不会播放。
我们先来看看ViewFlipper的源码,可以发现:
private boolean mRunning = false;
private boolean mStarted = false;
private boolean mVisible = false;
private boolean mUserPresent = true;
private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
@Override
//ViewFlipper默认由此receiver做系统事件响应
public void onReceive(Context context, Intent intent) {
final String action = intent.getAction();
if (Intent.ACTION_SCREEN_OFF.equals(action)) {//ACTION_SCREEN_OFF在手机关屏的时候产生
mUserPresent = false;
updateRunning();
} else if (Intent.ACTION_USER_PRESENT.equals(action)) {//ACTION_USER_PRESENT在手机解锁唤醒用户主界面时产生
mUserPresent = true;
updateRunning(false);
}
}
};
@Override
protected void onAttachedToWindow() {
super.onAttachedToWindow();
// Listen for broadcasts related to user-presence
final IntentFilter filter = new IntentFilter();
filter.addAction(Intent.ACTION_SCREEN_OFF);
filter.addAction(Intent.ACTION_USER_PRESENT);
getContext().registerReceiver(mReceiver, filter);
if (mAutoStart) {
// Automatically start when requested
startFlipping();
}
}
public void startFlipping() {
mStarted = true;
updateRunning();
}
public void stopFlipping() {
mStarted = false;
updateRunning();
}
private void updateRunning() {
updateRunning(true);
}
private void updateRunning(boolean flipNow) {
boolean running = mVisible && mStarted && mUserPresent;//startFlipper的关键
if (running != mRunning) {
if (running) {
showOnly(mWhichChild, flipNow);
Message msg = mHandler.obtainMessage(FLIP_MSG);
mHandler.sendMessageDelayed(msg, mFlipInterval);
} else {
mHandler.removeMessages(FLIP_MSG);
}
mRunning = running;
}
if (LOGD) {
Log.d(TAG, "updateRunning() mVisible=" + mVisible + ", mStarted=" + mStarted
+ ", mUserPresent=" + mUserPresent + ", mRunning=" + mRunning);
}
}
ViewFlipper在关屏会自动stopFlipping(),等待解锁进入后自动重开,所以我们不需要手动去停止。
然而,重点在于ViewFlipper自动播放的关键标志位是mVisible 、 mStarted 、 mUserPresent,其中任何情况下mVisible和mStarted都可以按照我们去控制,而mUserPresent就必须在解锁屏幕进去才能自动设置为true,假如我们需要做一个锁屏软件,这就大大限制了我们的用户体验。
我们只要人为把mUserPresent=true就可以实现我们要的效果:
<script src="https://code.csdn.net/snippets/451632.js"></script>
这样就可以了!