使用postDelayed每5秒隐藏一次视图

时间:2015-03-24 11:24:15

标签: android

问题

我有horizontalListView向用户显示加载到ViewPager的所有图片。它位于屏幕的底部。 我想要做的是horizontalListView隐藏它不被使用超过5秒。

它应该如何运作:

  • 出现用户点击屏幕horizontalListView
  • 用户滚动,选择horizontalListView上的内容并触发其阻止线程
  • horizontalListView上无所事事5秒后,它消失了

现在如何运作:

  • 出现用户点击屏幕horizontalListView
  • 用户滚动,选择等。而且postDelayed被解雇,让horizontalListView消失了。

CODE

Horizo​​ntalListView和Runnable

    horizontalListView.setOnTouchListener(new View.OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            hideViewHandler.removeCallbacks(mRunnable);
            hideViewHandler.postDelayed(mRunnable,5*1000);
            return true;
        }
    });

    mRunnable = new StoppableRunnable() {
        @Override
        public void stoppableRun() {
            hideAnimation();
        }
    };

在Image上设置的TapListener负责显示horizo​​ntalListView

  private class TapGestureListener extends GestureDetector.SimpleOnGestureListener {
    @Override
    public boolean onSingleTapConfirmed(MotionEvent e) {
        hListView.clearAnimation();
        if (((ViewGroup.MarginLayoutParams) hListView.getLayoutParams()).bottomMargin < 0) {
            expandAnimation();
            hideViewHandler.postDelayed(mRunnable,5*1000);
        } else {
            hideAnimation();
        }
        return true;
    }
}

4 个答案:

答案 0 :(得分:1)

您必须在侦听器内部检查MotionEvent.ACTION_UP或MotionEvent.ACTION_CANCEL,才能在它们之后触发runnable。

您当前的代码是在任何事件上发布runnable,但您只想在用户停止使用该视图时才这样做。

BTW:如果从TouchListener返回true,则表示您已经使用了该事件,并且事件链将停止。很可能ScrollView甚至不会滚动,因为事件不会传播到它。

答案 1 :(得分:0)

你可以这样做......

   yourScreenLayout.setOnTouchListener(new View.OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {
            if (horizontalListView.getVisibility() == View.INVISIBLE) {
                horizontalListView.setVisibility(View.VISIBLE);
                new Handler().postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        if (horizontalListView.getVisibility() == View.VISIBLE)
                            horizontalListView.setVisibility(View.INVISIBLE);
                    }
                }, 5000);
            } else {
                horizontalListView.setVisibility(View.INVISIBLE);
            }

        }
    });

答案 2 :(得分:0)

我认为问题的根源可能是在removeCallbacks之前调用postDelayed。 清除队列后,线程本身就被触发了。

答案 3 :(得分:0)

我自己设法解决了这个问题。

<强> FIX

我的onTouchListener无法正常工作的主要原因是它根本没有被触发。 <{1}}适配器内的OnClickListener正在消耗触发器。

现在我传递了horizontalListView内点击发生的信息,并用不同的方法做了所有事情。