標籤:android 屏保 兩次斷行符號鍵 仿效果 demo
仿屏保效果最近項目的一個小Demo,和大家分享一下,本篇文章主要展示的是一個仿屏保的效果,使用者在一段時間不操作會自動彈出屏保頁面,當處於屏保頁面的時候,【兩秒內連續】按兩次鍵盤【斷行符號鍵】就會退出屏保頁面,如下:
下面具體介紹一下實現過程:
一 、5秒不操作自動鎖定畫面
這個介面非常簡單,就一個TextView,直接貼代碼:
<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" tools:context=".MainActivity" > <TextView android:id="@+id/start" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_centerInParent="true" android:textSize="30sp" android:gravity="center" android:textStyle="bold" android:textColor="#698048" android:text="5秒不操作自動鎖屏" /></RelativeLayout>
二 、具體實現邏輯
首先看MainPresenter類,是計時具體的實現邏輯類,主要是通過Runnable來實現操作,當無操作時5秒後會執行Runnable,跳轉到鎖定畫面,5秒內有操作會重設計時,具體代碼如下:
public class MainPresenter{ public final static int MSG_SHOW_TIPS = 0x01; private IMainView mMainView; private MainHandler mMainHandler; private boolean tipsIsShowed = true; private Runnable tipsShowRunable = new Runnable() { @Override public void run() { mMainHandler.obtainMessage(MSG_SHOW_TIPS).sendToTarget(); } }; public MainPresenter(IMainView view) { mMainView = view; mMainHandler = new MainHandler(); } /** * * <無操作時開始計時> * <功能詳細描述> * * @see [類、類#方法、類#成員] */ public void startTipsTimer() { mMainHandler.postDelayed(tipsShowRunable, 5000); } /** * * <結束當前計時,重設計時> * <功能詳細描述> * * @see [類、類#方法、類#成員] */ public void endTipsTimer() { mMainHandler.removeCallbacks(tipsShowRunable); } public void resetTipsTimer() { tipsIsShowed = false; mMainHandler.removeCallbacks(tipsShowRunable); mMainHandler.postDelayed(tipsShowRunable, 5000); } public class MainHandler extends Handler { @Override public void handleMessage(Message msg) { super.handleMessage(msg); switch (msg.what) { case MSG_SHOW_TIPS: mMainView.showTipsView(); tipsIsShowed = true; // 屏保顯示,兩秒內連續按下鍵盤Enter鍵可關閉屏保 break; } } }}
三 、MainActivity.java是首頁面
主要功能是重寫OnKeyDown方法,監聽鍵盤按下事件,一旦觸發鍵盤事件,就會重設計時,另外在onResume()方法中預設開始計時,showTipsView()方法是計時完成彈出屏保介面。
public class MainActivity extends Activity implements IMainView{ private MainPresenter mPresenter; protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mPresenter = new MainPresenter(this); } @Override public boolean onKeyDown(int keyCode, KeyEvent event) { //重設計時 mPresenter.resetTipsTimer(); return false; } @Override protected void onResume() { //啟動預設開始計時 mPresenter.startTipsTimer(); super.onResume(); } @Override protected void onPause() { //有其他動作時結束計時 mPresenter.endTipsTimer(); super.onPause(); } @Override public void showTipsView() { //展示屏保介面 Intent intent = new Intent(MainActivity.this, MyTimeActivity.class); startActivity(intent); }}
另外大家看到MainActivity實現了IMainView介面,IMainView很簡單,就封裝了一個showTipsView()方法,MainActivity實現了該方法而已,IMainView.java代碼如下。
public interface IMainView{ public void showTipsView();}
四 、屏保介面MyTimeActivity.java
MyTimeActivity介面很簡單,就是一個背景圖,外加一個系統時間顯示,還有就是兩秒內連續兩次按下斷行符號鍵會退出屏保介面的邏輯,具體代碼如下,關鍵區段都加了注釋:
public class MyTimeActivity extends Activity{ private static final int MSGKEY = 0x10001; private long exitTime = 0; //屏保右上方的系統時間 private TextView mTime; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.lock_screen); mTime = (TextView)findViewById(R.id.mytime); //啟動線程重新整理屏保介面右上方的時間 new TimeThread().start(); } public class TimeThread extends Thread { @Override public void run() { do { try { //更新時間 Thread.sleep(1000); Message msg = new Message(); msg.what = MSGKEY; mHandler.sendMessage(msg); } catch (InterruptedException e) { e.printStackTrace(); } } while (true); } } /** * 2秒內連續兩次按下斷行符號鍵退出屏保 * 重寫方法 * @param keyCode * @param event * @return * @see android.app.Activity#onKeyDown(int, android.view.KeyEvent) */ @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_ENTER) { exit(); return false; } return super.onKeyDown(keyCode, event); } public void exit() { if ((System.currentTimeMillis() - exitTime) > 2000) { Toast.makeText(getApplicationContext(), "再按一次解鎖鍵即可進入應用", Toast.LENGTH_SHORT).show(); exitTime = System.currentTimeMillis(); } else { finish(); } } private Handler mHandler = new Handler() { @Override public void handleMessage(Message msg) { super.handleMessage(msg); switch (msg.what) { case MSGKEY: long sysTime = System.currentTimeMillis(); CharSequence sysTimeStr = DateFormat.format("hh:mm", sysTime); mTime.setText(sysTimeStr); break; } } };}
至此,仿屏保效果已經完成,很簡單的一個例子,歡迎批評指正,共同學習,共同進步!
【Android】一段時間不操作彈出【屏保】效果