业务需求来源于售货机项目,虽然最终这个项目没有实施,但是这个功能确实很常用,考虑到在Android中我还没做过这个功能,故此找到实现方式后记录于此 ~
最初接到此需求的时候,我只考虑到了定时器,远远没有全面思考,一些场景根本就没有考虑到,索性互联网的开放精神,让我学习到了更多的思考方向 !
后来的后来,我补全了一个售货机常用的 商品轮播展示功能 ~
Effect
这里我直接通过了log查看了需求实现效果,表示使用的话没有什么问题
思考方式
问题
1.如何监听用户未操作时效?
2.如何监听用户的行为?
3.如何处理操作行为与操作时效的关系?
反思
1.监听用户未操作时效是否需要使用到定时器?
2.监听用户的行为与时效关系是否建立在onTouch的down、move、up中?
3.场景完善的时候是否考虑生命周期的问题?
实现
自定义CountTimer:用于监听计时过程与结果
注:如需跳转activity、弹出toast可能均需要传入上下文,可以根据场景内部封装application的上下文,或者对应Activity、fragment的上下文 - - ~
package nkwl.com.timescreen;
import android.os.CountDownTimer;
import android.util.Log;
/**
* @author MrLiu
* @date 2019/11/18
* desc
*/
public class CountTimer extends CountDownTimer {
public CountTimer(long millisInFuture, long countDownInterval) {
super(millisInFuture, countDownInterval);
}
//计时过程显示:如有需求你可以在特定的时间范围内执行自己操作
@Override
public void onTick(long l) {
Log.e("tag", l + "");
}
//计时完毕时触发:我们的需求中的实现逻辑在这里,一般都逻辑会跳转一个屏保的Activity
@Override
public void onFinish() {
Log.e("tag", "未来某一天,可能依旧拥有无限希望");
}
}
BaseActivity:用于监听用户行为,处理行为与时间之间的关系
注:此处写在Base类主要针对的全局对象,具体场景根据个人需求而定,如只需要部分场景使用,那么把关键代码抄到对应类即可
package nkwl.com.timescreen;
import android.content.Context;
import android.os.Bundle;
import android.os.Handler;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.view.MotionEvent;
/**
* @author MrLiu
* @date 2019/11/19
* desc
*/
public class BaseActivity extends AppCompatActivity {
private CountTimer countTimerView;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
init();
}
private void init() {
//初始化CountTimer,设置倒计时为2分钟。
countTimerView = new CountTimer(5000, 1000);
}
private void timeStart() {
new Handler(getMainLooper()).post(new Runnable() {
@Override
public void run() {
countTimerView.start();
}
});
}
/**
* 主要的方法,重写dispatchTouchEvent
*
* @param ev
* @return
*/
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
switch (ev.getAction()) {
//获取触摸动作,如果ACTION_UP,计时开始。
case MotionEvent.ACTION_UP:
countTimerView.start();
break;
//否则其他动作计时取消
default:
countTimerView.cancel();
break;
}
return super.dispatchTouchEvent(ev);
}
@Override
protected void onResume() {
super.onResume();
timeStart();
}
@Override
protected void onPause() {
super.onPause();
countTimerView.cancel();
}
}
MainActivity:使用类(简称:鸡肋展示类;毕竟各位都是聪明人,其实这块我说明与否都一样)
注:如此需求适用全局,那么继承BaseActivity即可
package nkwl.com.timescreen;
import android.os.Bundle;
public class MainActivity extends BaseActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
}