在Activity中实现定时屏保(定时10秒,间隔5秒钟切换图片)

经过二天的努力,有关屏保的测试程序终于完成,因为要在项目中用到,所以就先做了个测试用的,希望对大家有用,我刚开始在网上找的资料讲的都不是很完整,也没有源码,所以今天我附上源码,希望大家共享,附源码下载地址:http://download.csdn.net/detail/weijing331/4518413,不用改任何东西。

本测试程序有二个重点:

1、控制与判别User静止未触摸键盘或屏幕的时间及其事件。

2、设计动态全屏淡入(Fade-in)、淡出(Fade-out)图片的交替。

以上这二个重点都需要通过线程来实现,以时间截记得方式,判断距离上一次单击键盘或屏幕的时间,并计量二次的间隔,当超过了指定的秒数(代码中是10秒)则进入屏保模式。

就一个主Activity,一个Java文件,Manifest中不用改。

package weijing.zhcw;

import java.util.Date;

import android.R.bool;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.DialogInterface;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Matrix;
import android.graphics.drawable.BitmapDrawable;
import android.os.Bundle;
import android.os.Handler;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.MotionEvent;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.TextView;

public class PingBao_TestActivity extends Activity {
private TextView mtextview01 = null;
private ImageView mimageviewo1 = null;
/* 对象作为新建AlertDialog之用 */
private LayoutInflater minflater01 = null;

/* 输入解锁的View */
private View mview01 = null;
private EditText mEditText01, mEditText02;

/* menu选项identifier,用以识别事件 */
static final private int MENU_ABOUT = Menu.FIRST;
static final private int MENU_EXIT = Menu.FIRST + 1;

private Handler mHandler01 = new Handler();
private Handler mHandler02 = new Handler();
private Handler mHandler03 = new Handler();
private Handler mHandler04 = new Handler();

/* 用于输入密码的 Dialog 和用于判断Dialog是否显示的状态*/
Dialog alertdialog = null;
private int alertdialogFlag = -1;

/* 控制User静止与否的Counter */
private int intCounter1, intCounter2;

/* Fade in与Fade out 的Counter */
private int intCounter3, intCounter4;
/* 控制顺序替换背景图ID的Counter */
private int intDrable = 0;
/** 上一次User有动作的Time Stamp */
private Date lastUpdateTime;

/* 计算User有几秒没有动作的 */
private long timePeriod;

/* 静止超过N秒将自动进入屏保 */
private float fHoldStillSecond = 10;
private boolean bIfRunScreenSaver;
private boolean bFadeFlagOut, bFadeFalgIn = false;

private long intervalScreenSaver = 1000;
private long intervalKeypadeSaver = 1000;
private long intervalFade = 100;
private int screenWidth, screenHeight;

/* 每N秒换置图片 */
private int intSecondsToChange = 5;
/* 设置 Screen Saver需要用到的背景图 */

private static int[] screenDrable = new int[] { R.drawable.bg_800x600,
R.drawable.bg_kuang2, R.drawable.bg, R.drawable.login_bg };

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
/* 必须在setContentView之前调用全屏显示 */
requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);

setContentView(R.layout.main);

mtextview01 = (TextView) findViewById(R.id.myTextView1);
mimageviewo1 = (ImageView) findViewById(R.id.myImageView1);
mEditText01 = (EditText) findViewById(R.id.myEditText1);
/* 初始取得User触碰屏幕的时间 */
lastUpdateTime = new Date(System.currentTimeMillis());
/* 初始化Layout上的Widget的可见性 */
recoverOriginalLayout();
}

/* 监控User没有动作的线程* */

private Runnable mTask01 = new Runnable() {

@Override
public void run() {
// TODO Auto-generated method stub
intCounter1++;
Date timeNow = new Date(System.currentTimeMillis());
/* 计算User静止不动作的时间间距 */
timePeriod = (long) timeNow.getTime()
- (long) lastUpdateTime.getTime();
// System.out.println("timePeriod->" + timePeriod);
// System.out.println("timePeriod->" + timePeriod);

float timePeriodSecond = ((float) timePeriod / 1000);
/* 如果超过时间静止不动 */
System.out.println("timePeriodSecond->" + timePeriodSecond
+ "fHoldStillSecond->" + fHoldStillSecond);
if (timePeriodSecond > fHoldStillSecond) {
if (bIfRunScreenSaver == false) {
/* 启动线程 */
mHandler02.postAtTime(mTask02, intervalScreenSaver);
/* Fade out */
if ((intCounter1 % intSecondsToChange) == 0) {
bFadeFlagOut = true;
mHandler03.postDelayed(mTask03, intervalFade);
} else {
/* 在Fadeout后立即Fadein */
if (bFadeFlagOut == true) {
bFadeFalgIn = true;
mHandler04.postDelayed(mTask04, intervalFade);
} else {
bFadeFalgIn = false;
intCounter4 = 0;
mHandler04.removeCallbacks(mTask04);
}
intCounter3 = 0;
bFadeFlagOut = false;
}

bIfRunScreenSaver = true;
} else {
/* Screen Saver正在运行 */
/* Fade Out */
if ((intCounter1 % intSecondsToChange) == 0) {
bFadeFlagOut = true;
mHandler03.postDelayed(mTask03, intervalFade);
} else {
/* 在Fade out 后立即Fade in */
if (bFadeFlagOut == true) {
bFadeFalgIn = true;
mHandler04.postDelayed(mTask04, intervalFade);
} else {
bFadeFalgIn = false;
intCounter4 = 0;
mHandler04.removeCallbacks(mTask04);
}
intCounter3 = 0;
bFadeFlagOut = false;
}
}
}

else {
/* 当User没有动作的间距未超过时间 */
bIfRunScreenSaver = false;
recoverOriginalLayout();
}
Log.i("HIPPO", "Counter1:" + Integer.toString(intCounter1) + "/"
+ Float.toString(timePeriodSecond));
/* 反复运行线程1 */
mHandler01.postDelayed(mTask01, intervalKeypadeSaver);
}
};

private Runnable mTask02 = new Runnable() {

@Override
public void run() {
// TODO Auto-generated method stub
if (bIfRunScreenSaver == true) {
intCounter2++;
hideOriginalLayout();
showScreenSaver();
mHandler02.postDelayed(mTask02, intervalScreenSaver);
} else {
mHandler02.removeCallbacks(mTask02);
}
}
};
/* Fade out 特效Runnable */
private Runnable mTask03 = new Runnable() {

@Override
public void run() {
// TODO Auto-generated method stub
if (bIfRunScreenSaver == true && bFadeFlagOut == true) {
intCounter3++;
/* 设置ImageView的透明度渐暗下去 */
// mimageviewo1.setAlpha(255 - intCounter3 * 28);
System.out.println("mTask03->"
+ Integer.toBinaryString(intCounter3));
mHandler03.postDelayed(mTask03, intervalFade);
} else {
mHandler03.removeCallbacks(mTask03);
}
}
};

/* Fade in 特效Runnable */

private Runnable mTask04 = new Runnable() {

@Override
public void run() {
// TODO Auto-generated method stub
if (bIfRunScreenSaver == true && bFadeFalgIn == true) {
intCounter4++;
/* 设置ImageView的透明度亮起来 */
// mimageviewo1.setAlpha(intCounter4 * 28);
mHandler04.postDelayed(mTask04, intervalFade);
System.out.println("Fade in->"
+ Integer.toBinaryString(intCounter4));

} else {
mHandler04.removeCallbacks(mTask04);
}
}
};

/* 恢复原有的Layout的可视性 */
private void recoverOriginalLayout() {
mtextview01.setVisibility(View.VISIBLE);
mEditText01.setVisibility(View.VISIBLE);
mimageviewo1.setVisibility(View.GONE);
System.out.println("recoverOriginalLayout-------->");
}

/* 隐藏原有应用程序的布局的可视性 */
private void hideOriginalLayout() {
mtextview01.setVisibility(View.INVISIBLE);
mEditText01.setVisibility(View.INVISIBLE);
System.out.println("hideOriginalLayout-------->");
}

/* 开始ScreenSaver */
private void showScreenSaver() {
System.out.println("intDrable-------->" + intDrable);
if (intDrable >= 4) {
intDrable = 0;
}

DisplayMetrics dm = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(dm);
screenWidth = dm.widthPixels;
screenHeight = dm.heightPixels;

Bitmap bmp = BitmapFactory.decodeResource(getResources(),
screenDrable[intDrable]);

/* Matrix比例 */

float scaleWidth = screenWidth / bmp.getWidth();
float scaleHeigth = screenHeight / bmp.getHeight();

Matrix matrix = new Matrix();

/* 使用Matrix.postScale设置维度ReSize */

Bitmap ressizeBitmap = Bitmap.createBitmap(bmp, 0, 0, bmp.getWidth(),
bmp.getHeight(), matrix, true);

/* 新建Drawable放大图片文件至全屏 */
BitmapDrawable mynewBitmapDrawable = new BitmapDrawable(ressizeBitmap);
mimageviewo1.setImageDrawable(mynewBitmapDrawable);

/* 使ImageView可见 */
mimageviewo1.setVisibility(View.VISIBLE);

/* 每间隔设置数秒换置图片ID,于下一个runnable才会生效 */
if ((intCounter2 % intSecondsToChange) == 0) {
intDrable++;
}
}

public void onUserWakeUpEvent() {
if (bIfRunScreenSaver == true) {
resetScreenSaverListener();

public void updateUserActionTime() {
Date timeNow = new Date(System.currentTimeMillis());
timePeriod = timeNow.getTime() - lastUpdateTime.getTime();
lastUpdateTime.setTime(timeNow.getTime());
System.out.println("updateUserActionTime-------->");
}

public void resetScreenSaverListener() {
/* 删除现有的Runnable */
mHandler01.removeCallbacks(mTask01);
mHandler02.removeCallbacks(mTask02);

Date timeNow = new Date(System.currentTimeMillis());
/* 获得单击按键事件的系统 Time Millis */
timePeriod = timeNow.getTime() - lastUpdateTime.getTime();
lastUpdateTime.setTime(timeNow.getTime());

/* for Runnable2,取消屏保 */

bIfRunScreenSaver = false;

/* 重置Runnable1与Runnable1的Counter */
intCounter1 = 0;
intCounter2 = 0;

/* 恢复原来的Layout Visable */
recoverOriginalLayout();

/* 重新postDelayed新的Runnable */
mHandler01.postDelayed(mTask01, intervalKeypadeSaver);
System.out.println("resetScreenSaverListener-------->");
}

public boolean onKeyDown(int keyCode, KeyEvent event) {
System.out.println("onKeyDown-------->");
if (bIfRunScreenSaver == true && keyCode != 4) {
onUserWakeUpEvent();
} else
updateUserActionTime();
return super.onKeyDown(keyCode, event);

}

public boolean onTouchEvent(MotionEvent event) {
System.out.println("onTouchEvent-------->");
if (bIfRunScreenSaver == true) {
onUserWakeUpEvent();
} else
updateUserActionTime();
return super.onTouchEvent(event);
}

protected void onResume() {
System.out.println("onResume-------->");
mHandler01.postAtTime(mTask01, intervalKeypadeSaver);
super.onResume();
}

protected void onPause() {
System.out.println("onPause-------->");
mHandler01.removeCallbacks(mTask01);
mHandler02.removeCallbacks(mTask02);
super.onPause();
}
}

下面是main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >

<ImageView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:id="@+id/myImageView1"
android:scaleType="fitCenter"
android:layout_gravity="center"
/>
<TextView
android:id="@+id/myTextView1"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:visible="true"
android:text="@string/hello" />
<EditText
android:id="@+id/myEditText1"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="" />

</LinearLayout>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值