EX07_03.java
上传用户:vip_99
上传日期:2021-03-27
资源大小:61159k
文件大小:14k
源码类别:

android开发

开发平台:

Java

  1. package irdc.ex07_03;
  2. import java.util.Date;
  3. import android.app.Activity;
  4. import android.app.AlertDialog;
  5. import android.content.DialogInterface;
  6. import android.graphics.Bitmap;
  7. import android.graphics.BitmapFactory;
  8. import android.graphics.Matrix;
  9. import android.graphics.drawable.BitmapDrawable;
  10. import android.os.Bundle;
  11. import android.os.Handler;
  12. import android.util.DisplayMetrics;
  13. import android.util.Log;
  14. import android.view.KeyEvent;
  15. import android.view.LayoutInflater;
  16. import android.view.Menu;
  17. import android.view.MenuItem;
  18. import android.view.MotionEvent;
  19. import android.view.View;
  20. import android.view.Window;
  21. import android.view.WindowManager;
  22. import android.widget.EditText;
  23. import android.widget.ImageView;
  24. import android.widget.TextView;
  25. public class EX07_03 extends Activity
  26. {
  27.   private TextView mTextView01;
  28.   private ImageView mImageView01;
  29.   
  30.   /* LayoutInflater对象作为新建AlertDialog之用 */
  31.   private LayoutInflater mInflater01;
  32.   
  33.   /* 输入解锁的View */
  34.   private View mView01;
  35.   private EditText mEditText01,mEditText02;
  36.   
  37.   /* menu选项identifier,用以识别事件 */
  38.   static final private int MENU_ABOUT = Menu.FIRST;
  39.   static final private int MENU_EXIT = Menu.FIRST+1;
  40.   private Handler mHandler01 = new Handler();
  41.   private Handler mHandler02 = new Handler();
  42.   private Handler mHandler03 = new Handler();
  43.   private Handler mHandler04 = new Handler();
  44.   /* 控制User静止与否的Counter */
  45.   private int intCounter1, intCounter2;
  46.   /* 控制FadeIn与Fade Out的Counter */
  47.   private int intCounter3, intCounter4;
  48.   /* 控制循序替换背景图ID的Counter  */
  49.   private int intDrawable=0;
  50.   /* 上一次User有动作的Time Stamp */
  51.   private Date lastUpdateTime;
  52.   /* 计算User共几秒没有动作 */
  53.   private long timePeriod;
  54.   /* 静止超过n秒将自动进入屏幕保护 */
  55.   private float fHoldStillSecond = (float) 5;
  56.   private boolean bIfRunScreenSaver;
  57.   private boolean bFadeFlagOut, bFadeFlagIn = false;
  58.   private long intervalScreenSaver = 1000;
  59.   private long intervalKeypadeSaver = 1000;
  60.   private long intervalFade = 100;
  61.   private int screenWidth, screenHeight;
  62.   /* 每n秒置换图片 */
  63.   private int intSecondsToChange = 5;
  64.   
  65.   /* 设置Screen Saver需要用到的背景图 */
  66.   private static int[] screenDrawable = new int[]
  67.   {
  68.     R.drawable.screen1,
  69.     R.drawable.screen2,
  70.     R.drawable.screen3,
  71.     R.drawable.screen4,
  72.     R.drawable.screen5
  73.   };
  74.   
  75.   /** Called when the activity is first created. */
  76.   @Override
  77.   public void onCreate(Bundle savedInstanceState)
  78.   {
  79.     super.onCreate(savedInstanceState);
  80.     
  81.     /* 必须在setContentView之前调用全屏幕显示 */
  82.     requestWindowFeature(Window.FEATURE_NO_TITLE);
  83.     getWindow().setFlags
  84.     (
  85.       WindowManager.LayoutParams.FLAG_FULLSCREEN,
  86.       WindowManager.LayoutParams.FLAG_FULLSCREEN
  87.     );
  88.     setContentView(R.layout.main);
  89.     
  90.     /* onCreate all Widget */
  91.     mTextView01 = (TextView)findViewById(R.id.myTextView1);
  92.     mImageView01 = (ImageView)findViewById(R.id.myImageView1);
  93.     mEditText01 = (EditText)findViewById(R.id.myEditText1);
  94.     
  95.     /* 初始取得User触碰手机的时间 */
  96.     lastUpdateTime = new Date(System.currentTimeMillis());
  97.     
  98.     /* 初始化Layout上的Widget可见性 */
  99.     recoverOriginalLayout();
  100.   }
  101.   
  102.   @Override
  103.   public boolean onCreateOptionsMenu(Menu menu)
  104.   {
  105.     // TODO Auto-generated method stub
  106.     
  107.     /* menu群组ID */
  108.     int idGroup1 = 0;
  109.     
  110.     /* The order position of the item */
  111.     int orderMenuItem1 = Menu.NONE;
  112.     int orderMenuItem2 = Menu.NONE+1;
  113.     
  114.     /* 创建具有SubMenu的menu */
  115.     menu.add
  116.     (
  117.       idGroup1, MENU_ABOUT, orderMenuItem1, R.string.app_about
  118.     );
  119.     /* 创建退出Menu */
  120.     menu.add(idGroup1, MENU_EXIT, orderMenuItem2, R.string.str_exit);
  121.     menu.setGroupCheckable(idGroup1, true, true);
  122.     
  123.     return super.onCreateOptionsMenu(menu);
  124.   }
  125.   
  126.   @Override
  127.   public boolean onOptionsItemSelected(MenuItem item)
  128.   {
  129.     // TODO Auto-generated method stub
  130.     switch(item.getItemId())
  131.     {
  132.       case (MENU_ABOUT):
  133.         new AlertDialog.Builder
  134.         (
  135.           EX07_03.this
  136.         ).setTitle(R.string.app_about).setIcon
  137.         (
  138.           R.drawable.hippo
  139.         ).setMessage
  140.         (
  141.           R.string.app_about_msg
  142.         ).setPositiveButton(R.string.str_ok,
  143.         new DialogInterface.OnClickListener()
  144.         {
  145.           public void onClick
  146.           (DialogInterface dialoginterface, int i)
  147.           {
  148.           }
  149.         }).show();
  150.         break;
  151.       case (MENU_EXIT):
  152.         /* 离开程序 */
  153.         finish();
  154.         break;
  155.     }
  156.     return super.onOptionsItemSelected(item);
  157.   }
  158.   
  159.   /* 监控User没有动作的运行线程 */
  160.   private Runnable mTasks01 = new Runnable() 
  161.   {
  162.     public void run() 
  163.     {
  164.       intCounter1++;
  165.       Date timeNow = new Date(System.currentTimeMillis());
  166.       
  167.       /* 计算User静止不动作的时间间距 */
  168.       timePeriod =
  169.       (long)timeNow.getTime() - (long)lastUpdateTime.getTime();
  170.       
  171.       float timePeriodSecond = ((float)timePeriod/1000);
  172.       
  173.       /* 如果超过时间静止不动 */
  174.       if(timePeriodSecond>fHoldStillSecond)
  175.       {
  176.         /* 静止超过时间第一次的标记 */
  177.         if(bIfRunScreenSaver==false)
  178.         {
  179.           /* 启动运行线程2 */
  180.           mHandler02.postDelayed(mTasks02, intervalScreenSaver);
  181.           
  182.           /* Fade Out*/
  183.           if(intCounter1%(intSecondsToChange)==0)
  184.           {
  185.             bFadeFlagOut=true;
  186.             mHandler03.postDelayed(mTasks03, intervalFade);
  187.           }
  188.           else
  189.           {
  190.             /* 在Fade Out后立即Fade In */
  191.             if(bFadeFlagOut==true)
  192.             {
  193.               bFadeFlagIn=true;
  194.               mHandler04.postDelayed(mTasks04, intervalFade);
  195.             }
  196.             else
  197.             {
  198.               bFadeFlagIn=false;
  199.               intCounter4 = 0;
  200.               mHandler04.removeCallbacks(mTasks04);
  201.             }
  202.             intCounter3 = 0;
  203.             bFadeFlagOut = false;
  204.           }
  205.           bIfRunScreenSaver = true;
  206.         }
  207.         else
  208.         {
  209.           /* screen saver 正在运行中 */
  210.           
  211.           /* Fade Out*/
  212.           if(intCounter1%(intSecondsToChange)==0)
  213.           {
  214.             bFadeFlagOut=true;
  215.             mHandler03.postDelayed(mTasks03, intervalFade);
  216.           }
  217.           else
  218.           {
  219.             /* 在Fade Out后立即Fade In */
  220.             if(bFadeFlagOut==true)
  221.             {
  222.               bFadeFlagIn=true;
  223.               mHandler04.postDelayed(mTasks04, intervalFade);
  224.             }
  225.             else
  226.             {
  227.               bFadeFlagIn=false;
  228.               intCounter4 = 0;
  229.               mHandler04.removeCallbacks(mTasks04);
  230.             }
  231.             intCounter3 = 0;
  232.             bFadeFlagOut=false;
  233.           }
  234.         }
  235.       }
  236.       else
  237.       {
  238.         /* 当User没有动作的间距未超过时间 */
  239.         bIfRunScreenSaver = false;
  240.         /* 恢复原来的Layout Visible*/
  241.         recoverOriginalLayout();
  242.       }
  243.       
  244.       /* 以LogCat监看User静止不动的时间间距 */
  245.       Log.i
  246.       (
  247.         "HIPPO",
  248.         "Counter1:"+Integer.toString(intCounter1)+
  249.         "/"+
  250.         Float.toString(timePeriodSecond));
  251.       
  252.       /* 反复运行运行线程1 */
  253.       mHandler01.postDelayed(mTasks01, intervalKeypadeSaver);
  254.     } 
  255.   };
  256.   
  257.   /* Screen Saver Runnable */
  258.   private Runnable mTasks02 = new Runnable() 
  259.   {
  260.     public void run() 
  261.     {
  262.       if(bIfRunScreenSaver==true)
  263.       {
  264.         intCounter2++;
  265.         
  266.         hideOriginalLayout();
  267.         showScreenSaver();
  268.         
  269.         //Log.i("HIPPO", "Counter2:"+Integer.toString(intCounter2));
  270.         mHandler02.postDelayed(mTasks02, intervalScreenSaver);
  271.       }
  272.       else
  273.       {
  274.         mHandler02.removeCallbacks(mTasks02);
  275.       }
  276.     } 
  277.   };
  278.   
  279.   /* Fade Out特效Runnable */
  280.   private Runnable mTasks03 = new Runnable() 
  281.   {
  282.     public void run() 
  283.     {
  284.       if(bIfRunScreenSaver==true && bFadeFlagOut==true)
  285.       {
  286.         intCounter3++;
  287.         
  288.         /* 设置ImageView的透明度渐暗下去 */
  289.         mImageView01.setAlpha(255-intCounter3*28);
  290.         
  291.         Log.i("HIPPO", "Fade out:"+Integer.toString(intCounter3));
  292.         mHandler03.postDelayed(mTasks03, intervalFade);
  293.       }
  294.       else
  295.       {
  296.         mHandler03.removeCallbacks(mTasks03);
  297.       }
  298.     } 
  299.   };
  300.   
  301.   /* Fade In特效Runnable */
  302.   private Runnable mTasks04 = new Runnable() 
  303.   {
  304.     public void run() 
  305.     {
  306.       if(bIfRunScreenSaver==true && bFadeFlagIn==true)
  307.       {
  308.         intCounter4++;
  309.         
  310.         /* 设置ImageView的透明度渐亮起来 */
  311.         mImageView01.setAlpha(intCounter4*28);
  312.         
  313.         mHandler04.postDelayed(mTasks04, intervalFade);
  314.         Log.i("HIPPO", "Fade In:"+Integer.toString(intCounter4));
  315.       }
  316.       else
  317.       {
  318.         mHandler04.removeCallbacks(mTasks04);
  319.       }
  320.     } 
  321.   };
  322.   
  323.   /* 恢复原有的Layout可视性 */
  324.   private void recoverOriginalLayout()
  325.   {
  326.     mTextView01.setVisibility(View.VISIBLE);
  327.     mEditText01.setVisibility(View.VISIBLE);
  328.     mImageView01.setVisibility(View.GONE);
  329.   }
  330.   
  331.   /* 隐藏原有应用程序里的布局配置组件 */
  332.   private void hideOriginalLayout()
  333.   {
  334.     /* 将欲隐藏的Widget写在此 */
  335.     mTextView01.setVisibility(View.INVISIBLE);
  336.     mEditText01.setVisibility(View.INVISIBLE);
  337.   }
  338.   
  339.   /* 开始ScreenSaver */
  340.   private void showScreenSaver()
  341.   {
  342.     /* 屏幕保护之后要做的事件写在此*/
  343.     
  344.     if(intDrawable>4)
  345.     {
  346.       intDrawable = 0;
  347.     }
  348.     
  349.     DisplayMetrics dm=new DisplayMetrics();
  350.     getWindowManager().getDefaultDisplay().getMetrics(dm);
  351.     screenWidth = dm.widthPixels;
  352.     screenHeight = dm.heightPixels;
  353.     Bitmap bmp=BitmapFactory.decodeResource(getResources(), screenDrawable[intDrawable]);
  354.     
  355.     /* Matrix比例 */ 
  356.     float scaleWidth = ((float) screenWidth) / bmp.getWidth();
  357.     float scaleHeight = ((float) screenHeight) / bmp.getHeight() ;
  358.     
  359.     Matrix matrix = new Matrix(); 
  360.     /* 使用Matrix.postScale设置维度ReSize */ 
  361.     matrix.postScale(scaleWidth, scaleHeight);
  362.     
  363.     /* ReSize图文件至屏幕分辨率 */
  364.     Bitmap resizedBitmap = Bitmap.createBitmap
  365.     (
  366.       bmp,0,0,bmp.getWidth(),bmp.getHeight(),matrix,true
  367.     );
  368.     
  369.     /* 新建Drawable放大图文件至全屏幕 */
  370.     BitmapDrawable myNewBitmapDrawable = 
  371.         new BitmapDrawable(resizedBitmap); 
  372.     mImageView01.setImageDrawable(myNewBitmapDrawable);
  373.     
  374.     /* 使ImageView可见 */
  375.     mImageView01.setVisibility(View.VISIBLE);
  376.     
  377.     /* 每间隔设置秒数置换图片ID,于下一个runnable2才会生效 */
  378.     if(intCounter2%intSecondsToChange==0)
  379.     {
  380.       intDrawable++;
  381.     }
  382.   }
  383.   
  384.   public void onUserWakeUpEvent()
  385.   {
  386.     if(bIfRunScreenSaver==true)
  387.     {
  388.       try
  389.       {
  390.         /* LayoutInflater.from取得此Activity的context */
  391.         mInflater01 = LayoutInflater.from(EX07_03.this);
  392.         
  393.         /* 创建解锁密码使用View的Layout */
  394.         mView01 = mInflater01.inflate(R.layout.securescreen, null);
  395.         
  396.         /* 于对话框中唯一的EditText等待输入解锁密码 */
  397.         mEditText02 =
  398.         (EditText) mView01.findViewById(R.id.myEditText2);
  399.         
  400.         /* 创建AlertDialog */
  401.         new AlertDialog.Builder(this)
  402.         .setView(mView01)
  403.         .setPositiveButton("OK",
  404.         new DialogInterface.OnClickListener()
  405.         {
  406.           public void onClick(DialogInterface dialog, int whichButton)
  407.           {
  408.             /* 比较输入的密码与原Activity里的设置是否相符 */
  409.             if(mEditText01.getText().toString().equals
  410.               (mEditText02.getText().toString()))
  411.             {
  412.               /* 当密码正确才真的解锁屏幕保护装置 */
  413.               resetScreenSaverListener();
  414.             }
  415.           }
  416.         }).show();
  417.       }
  418.       catch(Exception e)
  419.       {
  420.         e.printStackTrace();
  421.       }
  422.     }
  423.   }
  424.   
  425.   public void updateUserActionTime()
  426.   {
  427.     /* 取得点击按键事件时的系统Time Millis */
  428.     Date timeNow = new Date(System.currentTimeMillis());
  429.     
  430.     /* 重新计算点击按键距离上一次静止的时间间距 */
  431.     timePeriod =
  432.     (long)timeNow.getTime() - (long)lastUpdateTime.getTime();
  433.     lastUpdateTime.setTime(timeNow.getTime());
  434.   }
  435.   
  436.   public void resetScreenSaverListener()
  437.   {
  438.     /* 删除现有的Runnable */
  439.     mHandler01.removeCallbacks(mTasks01);
  440.     mHandler02.removeCallbacks(mTasks02);
  441.     
  442.     /* 取得点击按键事件时的系统Time Millis */
  443.     Date timeNow = new Date(System.currentTimeMillis());
  444.     /* 重新计算点击按键距离上一次静止的时间间距 */
  445.     timePeriod =
  446.     (long)timeNow.getTime() - (long)lastUpdateTime.getTime();
  447.     lastUpdateTime.setTime(timeNow.getTime());
  448.     
  449.     /* for Runnable2,取消屏幕保护 */
  450.     bIfRunScreenSaver = false;
  451.     
  452.     /* 重置Runnable1与Runnable1的Counter */
  453.     intCounter1 = 0;
  454.     intCounter2 = 0;
  455.     
  456.     /* 恢复原来的Layout Visible*/
  457.     recoverOriginalLayout();
  458.     
  459.     /* 重新postDelayed()新的Runnable */
  460.     mHandler01.postDelayed(mTasks01, intervalKeypadeSaver);
  461.   }
  462.   
  463.   @Override
  464.   public boolean onKeyDown(int keyCode, KeyEvent event)
  465.   {
  466.     // TODO Auto-generated method stub
  467.     if(bIfRunScreenSaver==true && keyCode!=4)
  468.     {
  469.       /* 当屏幕保护程序正在运行中,触动解除屏幕保护程序 */
  470.       onUserWakeUpEvent();
  471.     }
  472.     else
  473.     {
  474.       /* 更新User未触动手机的时间戳记 */
  475.       updateUserActionTime();
  476.     }
  477.     return super.onKeyDown(keyCode, event);
  478.   }
  479.   @Override
  480.   public boolean onTouchEvent(MotionEvent event)
  481.   {
  482.     // TODO Auto-generated method stub
  483.     if(bIfRunScreenSaver==true)
  484.     {
  485.       /* 当屏幕保护程序正在运行中,触动解除屏幕保护程序 */
  486.       onUserWakeUpEvent();
  487.     }
  488.     else
  489.     {
  490.       /* 更新User未触动手机的时间戳记 */
  491.       updateUserActionTime();
  492.     }
  493.     return super.onTouchEvent(event);
  494.   }
  495.   
  496.   @Override
  497.   protected void onResume()
  498.   {
  499.     // TODO Auto-generated method stub
  500.     mHandler01.postDelayed(mTasks01, intervalKeypadeSaver);
  501.     super.onResume();
  502.   }
  503.   
  504.   @Override
  505.   protected void onPause()
  506.   {
  507.     // TODO Auto-generated method stub
  508.     
  509.     try
  510.     {
  511.       /* 删除运行中的运行线程 */
  512.       mHandler01.removeCallbacks(mTasks01);
  513.       mHandler02.removeCallbacks(mTasks02);
  514.       mHandler03.removeCallbacks(mTasks03);
  515.       mHandler04.removeCallbacks(mTasks04);
  516.     }
  517.     catch(Exception e)
  518.     {
  519.       e.printStackTrace();
  520.     }
  521.     super.onPause();
  522.   }
  523. }