Android:ImageTIew onTouch Drag被ScrollView ontouch Event拦截

时间:2015-02-04 08:01:13

标签: android android-imageview ontouchlistener android-scrollview

我正在使用scrollview中的imageview控制器。在实现和测试方面,我发现滚动总是覆盖onTouch事件而不是imageView(dragImage)。

我尝试使用它来启用滚动

scv.setOnTouchListener(null);    

这是禁用

scv.setOnTouchListener( new OnTouchListener(){ 
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        return true; 
    }
});

它表明,dragImage只拖动了一个非常小的动作而不是在我想要的地方拖动。当我触摸ImageView而不是scrollView时,你能告诉我禁用滚动的更好方法吗?

以下是我的工作:

public static class PlaceholderFragment extends Fragment   {



private static final String ARG_SECTION_NUMBER = "section_number";

    /**
     * Returns a new instance of this fragment for the given section number.
     */
    public static PlaceholderFragment newInstance(int sectionNumber) {
        PlaceholderFragment fragment = new PlaceholderFragment();
        Bundle args = new Bundle();
        args.putInt(ARG_SECTION_NUMBER, sectionNumber);
        fragment.setArguments(args);            
        return fragment;
    }




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

        View  rootView = inflater.inflate(R.layout.frag_flight_bank, container, false);
        r1  = (RelativeLayout) rootView.findViewById(R.id.relativeLayouyt1);

        r2  = (RelativeLayout) rootView.findViewById(R.id.relativeLayouyt2);
        r3  = (RelativeLayout) rootView.findViewById(R.id.relativeLayouyt3);
        r4  = (RelativeLayout) rootView.findViewById(R.id.relativeLayouyt4);
        r5  = (RelativeLayout) rootView.findViewById(R.id.relativeLayouyt5);
        rTop  = (RelativeLayout) rootView.findViewById(R.id.rTop);

        scv = (ScrollView) rootView.findViewById(R.id.scrollView1);
        initialise(rootView);

        return rootView;
    }



    private void initialise(View rootView) {
        // TODO Auto-generated method stub

        tvCustom= (TextView) rootView.findViewById(R.id.ttvCustomize);
        tvRename= (TextView) rootView.findViewById(R.id.tvRename);
        tvNormal= (TextView) rootView.findViewById(R.id.tvNorma);
        tvExper= (TextView) rootView.findViewById(R.id.txExper);


    ...
            dragImage = (ImageView) rootView.findViewById(R.id.dragImage);
            //dragImage.setVisibility(View.GONE);

        dragImage.setOnTouchListener(new OnTouchListener(){
            private int _xDelta;
            private int _yDelta;
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                final int X = (int) event.getRawX();
                final int Y = (int) event.getRawY();
                switch (event.getAction() & MotionEvent.ACTION_MASK) {
                case MotionEvent.ACTION_DOWN:
                    RelativeLayout.LayoutParams lParams =      (RelativeLayout.LayoutParams) dragImage
                    .getLayoutParams();

                    _xDelta = X - lParams.leftMargin;
                    _yDelta = Y - lParams.topMargin;
                    break;
                case MotionEvent.ACTION_UP:
                    break;
                case MotionEvent.ACTION_POINTER_DOWN:
                    break;
                case MotionEvent.ACTION_POINTER_UP:
                    break;
                case MotionEvent.ACTION_MOVE:
                    RelativeLayout.LayoutParams ParamsA = (RelativeLayout.LayoutParams) dragImage
                    .getLayoutParams();
                    ParamsA.leftMargin = X - _xDelta;
                    ParamsA.topMargin = Y - _yDelta;
                    ParamsA.rightMargin = -250;
                    ParamsA.bottomMargin = -250;

                    dragImage.setLayoutParams(ParamsA);
                    break;
                }
                return true;

            }

        });

解决方案: 插入在beginnging(onCreteView)

scv.setOnTouchListener(new View.OnTouchListener() 
        {
            public boolean onTouch(View p_v, MotionEvent p_event) 
            {
                dragImage.getParent().requestDisallowInterceptTouchEvent(false);
                //  We will have to follow above for all scrollable contents
                return false;
            }
        });

在setOnTouchListener中,onTouch方法:

v.getParent().requestDisallowInterceptTouchEvent(true);

2 个答案:

答案 0 :(得分:6)

将以下代码添加到MotionEvent.ACTION_DOWNMotionEvent.ACTION_MOVE案例中以解决您的问题:

dragImage.getParent().requestDisallowInterceptTouchEvent(true);

答案 1 :(得分:0)

我终于让这个工作了,你还需要在onTouch事件中返回true。以下代码将缩放图像以填充imageview像素宽度。用户可以拖动封面图片重新定位,您需要跟踪Y矩阵以便以后显示。 ImageView比例类型设置为Matrix。

<script src="https://raw.githack.com/eduardolundgren/tracking.js/master/build/tracking.js"></script>
<script src="https://raw.githack.com/eduardolundgren/tracking.js/master/build/data/face.js"></script>
<div class="demo-title">
  <p><a href="http://trackingjs.com" target="_parent">tracking.js</a> - hover image to see all faces detected</p>
</div>
<div class="demo-frame">
  <div class="demo-container"> <span id="photo"><img id="img" src="https://raw.githubusercontent.com/eduardolundgren/tracking.js/master/examples/assets/faces.jpg" /></span>

  </div>
</div>