【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;

            }
        }
    };
}


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

时间: 2024-10-05 17:57:53

【Android】一段时间不操作弹出【屏保】效果的相关文章

Java Selenium (十二) 操作弹出窗口 &amp; 智能等待页面加载完成 &amp; 处理 Iframe 中的元素

一.操作弹出窗口   原理 在代码里, 通过 Set<String> allWindowsId = driver.getWindowHandles(); 来获取到所有弹出浏览器的句柄, 然后遍历, 使用swithcto.window(newwindow_handle)方法. 就可以定位到新的窗口. 测试页面的HTML <html> <head> <title>常见web ui元素操作, 及API使用</title> <script type

Android学习----------长按列表项弹出菜单,给菜单项添加事件,获取上下文

这里是先显示一个listview,长按listview的一个列表项,弹出一个菜单来,菜单有两个条目, "更新该条"和"删除该条",并且这两条都有监听事件,整体就像微信好友对话操作一样. 其中菜单项有一个获取上下文的操作:AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo(); 这句也是用于列表项的. 具体代码如下: protected void onCreate(Bundle

selenium移动div里面的滚动条,操作弹出对话框

还是使用js来移动 首先要定位到这个元素 倾向于使用js来定位元素,输入下面的脚本,按下回车键,即可在调试页面看到对应的div块$("div.table-responsive") 滚动方法使用scrollLeft()$("div.table-responsive").scrollLeft(1000) 应用到java selenium中 为了避免输入数字可以这样写 ((JavascriptExecutor) driver).executeScript("$(

ECSHOP后台登陆后一段时间不操作就超时的解决方法

ECSHOP后台登陆后一段时间不操作就超时的解决方法 ECSHOP教程/ ecshop教程网(www.ecshop119.com) 2012-05-27 客户生意比较好,因此比较忙,常常不在电脑前,经常打开后台长时间不操作,等回到电脑前操作时,每次都超时,需要从新登陆,因此,客户希望后台的登录时间尽量长些,解决这个问题主要是要在date/config.php 中设置session的值,session默认的是“1440”,可尽量大些,比如“3600”等等!

css实现的当鼠标悬浮弹出说明层效果

css实现的当鼠标悬浮弹出说明层效果:本章节分享一段代码实例,它是使用纯css实现的鼠标悬浮弹出说明层效果.代码实例如下: <!DOCTYPE html> <html> <head> <meta charset=" utf-8"> <meta name="author" content="http://www.softwhy.com/" /> <title>蚂蚁部落</

基于jQuery鼠标点击弹出登陆框效果

基于jQuery鼠标点击弹出登陆框效果.这是一款扁平样式风格的jQuery弹出层登陆框特效.效果图如下: 在线预览   源码下载 实现的代码. html代码: <input type="button" class="one" value="点击我查看效果" /> <div class="box"> <div class="box2"> <div class=&quo

点击弹出动态菜单效果ios源码

这是一个点击弹出动态菜单效果,源码SphereMenuSwift,SphereMenuSwift使用 UIDynamicAnimator做的动态菜单.点击按钮弹出菜单.菜单可以拖拽.模拟碰撞物理效果,这是用Swift写的项目.效果图: <ignore_js_op> 使用方法: 代码的实现: override func viewDidAppear(animated: Bool) {         super.viewDidAppear(animated)         self.view.b

[Android] 底部菜单布局+PopupWindows实现弹出菜单功能(初级篇)

    这篇文章主要是自己研究如何对底部菜单进行布局,并简单的实现点击不同"按钮"实现图片切换和背景切换的功能,最后通过PopupWindows实现弹出菜单,点击不同按钮能实现不同方法,相当于美图秀秀编辑图片的功能吧!它并没有涉及到Fragment碎片切换页面的功能,因为页面始终显示被处理的图片.这是我初学Android的一篇基础性文章和在线思想笔记,网上有很多更优秀的demo,不过也希望对大家有用~ 首先介绍两种方法实现底部菜单点击不同图标显示选中状态的效果. (可参考简短文章:An

Android ListView两种长按弹出菜单方式

* 知识点1:ListView item:两种长按弹出菜单方式* 知识点2:ListView SimpleAdapter的使用*  知识点 3:在java代码中创建一个ListView*/ -----------------------------------------------------Activity[mw_shl_code=java,true]package org.gxl.com; public class ListOnLongClickActivity extends Activ