如何处理片段上的触摸事件?

时间:2014-02-19 13:41:44

标签: android android-fragments ontouchevent ontouchlistener

我正在建立一个我需要处理触摸事件的界面。特别是我能够将它们仅启用到片段中的受限区域。 为了更好地理解问题,尊重标准和我的应用程序的目标,我计划了导航抽屉,它假定存在许多片段(而不是活动)。触摸事件的活动很容易实现,另一方面,我在互联网上读到片段可能成为问题

我的应用程序,在架构层面,如下: - MainActivity.java - NavigationDrawer.java - TestFragment.java(现在单个片段,等待解决问题)

我没有找到解释如何做得好(或如何解决问题)的解决方案或教程。然后我问你,将问题简化为“在片段中启用触摸事件(在这种情况下为getPressure())”。以下是一些可能有助于解决问题的代码:

TestFragment

public class TestFragment extends Fragment {
    private static final String ARG_SECTION_NUMBER = "section_number";

    public static TestFragment newInstance(int sectionNumber) {
        TestFragment fragment = new TestFragment();
        Bundle args = new Bundle();
        args.putInt(ARG_SECTION_NUMBER, sectionNumber);
        fragment.setArguments(args);
        return fragment;
    }

    public TestFragment() {}

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
        return inflater.inflate(R.layout.fragment_test, container, false);
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        // Here I want to return the press value (0 to 1)
    }
}

如何将侦听器与整个片段相关联?在特定区域的情况下?最后,如何在屏幕上返回压力值?

非常感谢你的建议! :)

2 个答案:

答案 0 :(得分:94)

我不确定我是否理解你的问题,但我会尽力回答这个问题。因此,要获得片段上的触摸事件,我会这样做:

- 你的片段onCreateView:

View view = inflater.inflate(R.layout.fragment_test, container, false);

    view.setOnTouchListener(new View.OnTouchListener() {
            public boolean onTouch(View v, MotionEvent event) {

                if(event.getAction() == MotionEvent.ACTION_MOVE){
                    //do something
                }
                return true;
            }
    });

//here the rest of your code

return view;

您可以在onTouch中检查不同的MotionEvent,例如:

MotionEvent.ACTION_DOWN, MotionEvent.ACTION_UP,...

答案 1 :(得分:0)

在科特林:

override fun onCreateView(
    inflater: LayoutInflater, container: ViewGroup?,
    savedInstanceState: Bundle?
): View? {

   val view =  inflater.inflate(R.layout.fragment_img_view, container, false)

    view.setOnTouchListener(object : View.OnTouchListener {
        override fun onTouch(v: View?, event: MotionEvent): Boolean {
            if (event.action == MotionEvent.ACTION_MOVE) {
                scaleGestureDetector.onTouchEvent(event)
            }
            return true
        }
    })
    return view
}