android 自动隐藏控件,Android 实现按钮在没有触摸事件时几秒钟之后自动隐藏
实现按钮在没有触摸事件时几秒钟之后自动隐藏大概意思就是用一个线程来控制时间。下面我实现一个Button的自动隐藏获取控件mButton = (Button)findViewById(R.id.btn);控件的隐藏需要有一个Handler机制监听消息和发送消息class MyHandler extends Handler{//发送消息的idprivate final int MSG_HIDE = 0
实现按钮在没有触摸事件时几秒钟之后自动隐藏
大概意思就是用一个线程来控制时间。
下面我实现一个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) {
}
}
}
}
}
更多推荐
所有评论(0)