本示例程序 Screen Saver 通过避免同一个静止图片或画面在屏幕上久滞不动,达到保护屏幕的效果。
程序有两个重点:
1 . 控制与判断用户静止未触碰键盘或屏幕的时间及其事件
2. 设计动态全屏幕淡入 (Fade In) 与淡出 (Fade Out) 图片的交替效果
程序运行原理: 当键盘或屏幕两次被触击的事件间隔 (timePeriod) 超过了 5s时,就自动调用屏幕保护程序
这里声明 4个Runnable, 其作用分别如下:
1. mTask01: 每 秒 检查1次 时间间隔, 监视静止是否超过5s, 如果超过,将标记bIfRunScreenSaver 更改为 true, 启动mTask02,
2. mTask02: 每 秒 检查1次 时间间隔, 隐藏原有布局上的组件,调用 showScreenSaver() 加载图片,轮流加载5张图片,
3. mTask03: 淡出效果时使用, 每0.1s 运行一个scale
4. mTask04: 淡入效果时使用, 每0.1s 运行一个scale
应用开始时,先要输入 屏保密码, 输入后当用户超过 5s未操作时,进入屏保,屏幕变暗,此时有任何操作时,弹出对话框提示要求输入确认密码,
如果与 刚开始输入相同,则切换到屏保前的界面,否则一直显示屏保状态.
示意图如下:
具体用法请参见 EX07_03 工程
代码需要修改几个地方:
在onCreate() 方法最后,写上
1.-------------------------------------------------------
LayoutInflater mInflater01 = LayoutInflater.from(EX07_03.this);
/* 创建解锁密码使用View的Layout */
View mView01 = mInflater01.inflate(R.layout.securescreen, null);
mEditText02 = (EditText) mView01.findViewById(R.id.myEditText2);
dialog = new AlertDialog.Builder(this).setView(mView01)
.setPositiveButton("OK",this).create();
将 onUserWakeUpEvent() 方法简化 为:
public void onUserWakeUpEvent() {
if (bIfRunScreenSaver) {
if(!dialog.isShowing()){
dialog.show();
}
}
}
解决 点击 OK按钮 多次弹出对话框的问题
2.-------------------------------------------------------
将 recoverOriginalLayout() 方法改为:
/* 恢复原有的Layout可视性 */
private void recoverOriginalLayout() {
//文本,输入框可见,图片不可见
mTextView01.setVisibility(View.VISIBLE);
mEditText01.setVisibility(View.VISIBLE);
mBtn.setVisibility(View.VISIBLE);
mImageView01.setVisibility(View.GONE);
}
将 mTasks02 定义修改为:
/* 屏保 Runnable */
private Runnable mTasks02 = new Runnable() {
public void run()
{
if (bIfRunScreenSaver) {
intCounter2++;
/* 隐藏原有应用程序里的布局配置组件 */
mTextView01.setVisibility(View.INVISIBLE);
mEditText01.setVisibility(View.INVISIBLE);
mBtn.setVisibility(View.INVISIBLE);
showScreenSaver();
mHandler02.postDelayed(mTasks02, 1000);
} else
mHandler02.removeCallbacks(mTasks02);
}
};
将 ImageView 修改为如下:
<ImageView
android:id="@+id/myImageView1"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="center"
android:scaleType="fitCenter" />