带有长按动作的搜索栏

时间:2019-08-12 11:35:07

标签: android android-studio android-seekbar

我想将点击动作附加到搜索栏上以执行某些操作。

我试图通过在setOnLongClickListeneronStopTrackingTouch方法上实现onProgressChanged来做到这一点,但它不起作用。

   seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
        @Override
        public void onProgressChanged(SeekBar seekBar, final int progress, boolean fromUser) {
            textView.setText("" + progress);
        }

        @Override
        public void onStartTrackingTouch(SeekBar seekBar) {

        }

        @Override
        public void onStopTrackingTouch(SeekBar seekBar) {
            seekBar.setOnLongClickListener(new View.OnLongClickListener() {
                @Override
                public boolean onLongClick(View v) {
                    ToastMaker("LongPress");
                    return false;
                }
            });
        }
    });

我的最终目标是为onProgressChanged设置seekbar的第10或20步,当用户按住seekbar时,step值将更改为1(使用incrementProgressBy(1)方法),以便用户可以在上选择精确值远程搜索栏。

如果您使用三星的视频编辑器,他们会做同样的事情。您可以快速滚动视频时间轴,当您想选择按住搜寻栏的确切时间时,也可以选择自己喜欢的确切时间(请看gif波纹管)

i.stack.imgur.com/HxNGc.gif

1 个答案:

答案 0 :(得分:0)

您可以尝试使用onTouchEvent()这样覆盖搜索栏的触摸事件

private var isLongPress = false
private val longPressHandler = Handler()
private val onLongPress = Runnable {
isLongPress = true

    //do whatever you want on long press
}
private val onPress = {
    //do on normal press
}

override fun onTouchEvent(event: MotionEvent): Boolean {
    when (event.action) {
        MotionEvent.ACTION_DOWN -> {
            //on action down we start the long press handler
            longPressHandler.postDelayed(onLongPress, 500)
        }
        MotionEvent.ACTION_UP, MotionEvent.ACTION_CANCEL -> {
           if (isLongPress) {
                //if 500ms passed and user lifts the finger
                isLongPress = false
            } else {
                //if 500ms didn't pass and user lifts his finger before that time we cancel long press click and treat it as normal press
            longPressHandler.removeCallbacks(onLongPress)
            onPress()
            }
        }
    }
    return true
}