CircleButton LongClickListener 未触发

CircleButton LongClickListener not triggered

我使用了库 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 方法中,performClick() 在 MOTION_UP 案例块中被调用一次。这就是触发您的 OnClickListener 的原因。因此,对于长按,您需要插入适合您需要的方法 performLongClick()

这是我的长按想法。这很简单,但您需要自定义 CircleButton class。所以添加一个 class 变量说 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;
}