我使用lib MaterialWidget中的CircleButton。在我的片段中,我尝试在此组件上使用LongClickListener,但是它不起作用。 ClickListener工作正常,但工作时间不长。

库:https://github.com/keithellis/MaterialWidget/blob/master/library/src/main/java/com/material/widget/CircleButton.java

它正在使用标准按钮。

@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {

    final View rootView = inflater.inflate(R.layout.fragment_home_home, container, false);

    rootView.findViewById(R.id.cb_startPhotoe).setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if (isLongClickReleased) {
                Intent i = new Intent(getActivity(), NavigationActivity.class);
                i.putExtra("fake", 1);
                startActivity(i);
            }
        }
    });

    rootView.findViewById(R.id.cb_startPhotoe).setOnLongClickListener(new View.OnLongClickListener() {

        @Override
        public boolean onLongClick(View v) {
            isLongClickReleased = false;
            displayMenu(rootView);
            return true;
        }
    });
    return rootView;
}


当我看到库的代码时,对我来说没有什么特别的。
在调试模式下,不会触发侦听器
即使我评论了OnClickListener,也没有任何效果。

最佳答案

我没有使用特定的库,但是我阅读了代码,发现在onTouchEvent方法中,在MOTION_UP case块中一次调用了performClick()。这就是触发您的OnClickListener的原因。因此,对于长按,您需要在适合您需要的方法performLongClick()中插入。

这是我要做长按的想法。这很简单,但是您需要自定义那个CircleButton类。因此,添加一个类变量,例如long tsDown;

private long tsDown;

@Override
public boolean onTouchEvent(@NonNull MotionEvent event) {
    switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN:
             ...
             tsDown = System.currentTimeMillis();
             break;
        case MotionEvent.ACTION_UP:
            ...
            if (!mMoveOutside) {
                long tsUp = System.currentTimeMillis();
                if (tsUp - tsDown < 1000){
                  // if press duration is below 1s
                  performClick();
                }else{
                  performLongClick();
                }
            }
            break;

    }
    return true;
}

07-25 20:21