实现按钮在没有触摸事件时几秒钟之后自动隐藏

大概意思就是用一个线程来控制时间。

下面我实现一个Button的自动隐藏

获取控件

mButton = (Button)findViewById(R.id.btn);

控件的隐藏需要有一个Handler机制监听消息和发送消息

class MyHandler extends Handler{

//发送消息的id

private final int MSG_HIDE = 0x001;

//WeakReference垃圾回收机制

privateWeakReference weakRef;

public MyHandler(MainActivitypMainActivity){

weakRef = newWeakReference(pMainActivity);

}

@Override

public void handleMessage(Message msg) {

final MainActivity mainActivity = weakRef.get();

if (mainActivity != null) {

switch (msg.what) {

case MSG_HIDE:

mainActivity.hide();

break;

}

}

super.handleMessage(msg);

}

/**

*发送消息

*/

public void sendHideControllMessage(){

obtainMessage(MSG_HIDE).sendToTarget();

}

然后需要开启一个新的线程,控制按钮的定时隐藏

private class CountTimeThread extends Thread{

private final long maxVisibleTime ;

private long startVisibleTime;

/**

*设置控件显示时间second单位是秒

*@paramsecond

*/

public CountTimeThread(int second){

maxVisibleTime = second * 1000;//换算为毫秒

setDaemon(true);//设置为后台进程

}

/**

*如果用户有操作,则重新开始计时隐藏时间

*/

private synchronized void reset() {

startVisibleTime = System.currentTimeMillis();

}

@Override

public void run() {

startVisibleTime = System.currentTimeMillis();//初始化开始时间

while (true) {

//如果时间达到最大时间,则发送隐藏消息

if (startVisibleTime + maxVisibleTime < System.currentTimeMillis()){

mHandler.sendHideControllMessage();

startVisibleTime = System.currentTimeMillis();

}

try {

Thread.sleep(1000);

} catch (Exception e) {

}

}

}

}

然后需要一个开启线程的方法

private void startCountTimeThread(){

countTimeThread = new CountTimeThread(2);

countTimeThread.start();

}

重写触摸监听,如果有触摸事件发送,则需要重置显示的时间

@Override

public boolean onTouchEvent(MotionEvent event) {

countTimeThread.reset();//重置时间

if (event.getAction() == MotionEvent.ACTION_DOWN) {

boolean isVisible = (mButton.getVisibility() == View.VISIBLE);

if (!isVisible) {

mButton.setVisibility(View.VISIBLE);

return true;

}

}

return super.onTouchEvent(event);

}

全部代码如下:

import java.lang.ref.WeakReference;

import android.support.v7.app.ActionBarActivity;

import android.os.Bundle;

import android.os.Handler;

import android.os.Message;

import android.view.MotionEvent;

import android.view.View;

import android.widget.Button;

public classMainActivity extends ActionBarActivity {

ButtonmButton;

MyHandlermHandler= newMyHandler(MainActivity.this);

CountTimeThreadcountTimeThread;

@Override

protectedvoidonCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

mButton = (Button) findViewById(R.id.btn);

startCountTimeThread();

}

//如果有触摸事件,,则重置显示时间

@Override

publicbooleanonTouchEvent(MotionEvent event) {

countTimeThread.reset();//重置时间

if (event.getAction() == MotionEvent.ACTION_DOWN) {

boolean isVisible = (mButton.getVisibility() ==View.VISIBLE);

if (!isVisible) {

mButton.setVisibility(View.VISIBLE);

return true;

}

}

return super.onTouchEvent(event);

}

/**

*开启监听控件隐藏的线程

*/

privatevoidstartCountTimeThread(){

countTimeThread = new CountTimeThread(2);

countTimeThread.start();

}

/**

*隐藏需要隐藏的按钮

*/

privatevoidhide(){

if (mButton.getVisibility() == View.VISIBLE) {

mButton.setVisibility(View.GONE);

}

}

/**

* Handler消息传递机制

*/

classMyHandler extendsHandler{

//发送消息的id

private final int MSG_HIDE= 0x001;

//WeakReference垃圾回收机制

private WeakReference weakRef;

public MyHandler(MainActivity pMainActivity){

weakRef = newWeakReference(pMainActivity);

}

@Override

public void handleMessage(Message msg) {

final MainActivity mainActivity = weakRef.get();

if (mainActivity != null) {

switch (msg.what) {

case MSG_HIDE:

mainActivity.hide();

break;

}

}

super.handleMessage(msg);

}

/**

*发送消息

*/

public void sendHideControllMessage(){

obtainMessage(MSG_HIDE).sendToTarget();

}

}

/**

*用进程监听按钮控件的显示时间,定时隐藏

*@authorzxl

*

*/

privateclassCountTimeThread extends Thread{

private final long maxVisibleTime;

private long startVisibleTime;

/**

*设置控件显示时间second单位是秒

*@paramsecond

*/

public CountTimeThread(int second){

maxVisibleTime = second * 1000;//换算为毫秒

setDaemon(true);//设置为后台进程

}

/**

*如果用户有操作,则重新开始计时隐藏时间

*/

private synchronized void reset() {

startVisibleTime = System.currentTimeMillis();

}

@Override

public void run() {

startVisibleTime = System.currentTimeMillis();//初始化开始时间

while (true) {

//如果时间达到最大时间,则发送隐藏消息

if (startVisibleTime + maxVisibleTime < System.currentTimeMillis()){

mHandler.sendHideControllMessage();

startVisibleTime = System.currentTimeMillis();

}

try {

Thread.sleep(1000);

}catch(Exception e) {

}

}

}

}

}

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐