zoukankan      html  css  js  c++  java
  • 【Android】一段时间不操作弹出【屏保】效果

    仿屏保效果

    最近项目的一个小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;
    
                }
            }
        };
    }

    至此,仿屏保效果已经完成,很简单的一个例子,欢迎批评指正,共同学习,共同进步!



  • 相关阅读:
    opencvsharp BitmapSource图片截取问题
    wpf RenderTargetBitmap保存控件为图片时图片尺寸不对的问题
    c# ??和运算符先后的问题
    wpf 窗口打开后默认设置控件焦点
    win10 requireAdministrator设置开机自启动无效的解决方案
    Gogs webhook钩子 验签 (PHP版本)
    MongoDB管理用户的认证机制
    RocketMQ使用指南及参数详解
    微信公众号h5获取用户openId的方法和步骤
    php中常用的正则表达式函数
  • 原文地址:https://www.cnblogs.com/yangjj08/p/10153654.html
Copyright © 2011-2022 走看看