Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/204.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在android中,触摸事件变得缓慢,有时无法在Listview中处理_Android_Ontouchlistener - Fatal编程技术网

在android中,触摸事件变得缓慢,有时无法在Listview中处理

在android中,触摸事件变得缓慢,有时无法在Listview中处理,android,ontouchlistener,Android,Ontouchlistener,我在listview项目中使用了一个imageview的touch listener。当我像一个示例应用程序那样使用它时,它工作得很好。我的意思是我将该listview项目作为一个示例应用程序。但当我把它放在listview中时,它真的变得非常慢 我只想横向拖动图像,为此,我使用了从Github获得的ConstrainedDragandDrop视图类 在我的示例应用程序中: public class HorizontalScroll extends Activity { ImageVi

我在listview项目中使用了一个imageview的touch listener。当我像一个示例应用程序那样使用它时,它工作得很好。我的意思是我将该listview项目作为一个示例应用程序。但当我把它放在listview中时,它真的变得非常慢

我只想横向拖动图像,为此,我使用了从Github获得的ConstrainedDragandDrop视图类

在我的示例应用程序中:

public class HorizontalScroll extends Activity {

    ImageView full_left,heart;

    RelativeLayout rlMainLayout,rlImages,Cartoon_image,half_left,play_btn,centre,centre_leftanimate;
protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.inflated_bloops);


        half_left=(RelativeLayout)findViewById(R.id.half_left);

        Cartoon_image=(RelativeLayout)findViewById(R.id.cartoon_image);
        play_btn=(RelativeLayout)findViewById(R.id.play_btn);
        heart=(ImageView)findViewById(R.id.ivheart);


          ConstrainedDragAndDropView dndView = (ConstrainedDragAndDropView) findViewById(R.id.dndView);
            dndView.setDragHandle(findViewById(R.id.cartoon_image),findViewById(R.id.half_left),heart);
            dndView.setAllowVerticalDrag(false,HorizontalScroll.this);


}
}
在我的Listview中使用时:

 public class Cars extends BaseAdapter 
{

    public View getView(int position, View convertView, ViewGroup parent)
    {
        View v = convertView;

            LayoutInflater inflator = getLayoutInflater();
            v= inflator.inflate(R.layout.inflated_bloops, null);

            ConstrainedDragAndDropView dndView = (ConstrainedDragAndDropView) v.findViewById(R.id.dndView);
            dndView.setDragHandle(v.findViewById(R.id.cartoon_image),v.findViewById(R.id.half_left),heart);
            dndView.setAllowVerticalDrag(false,FeedModeActivity.this);

        RelativeLayout  Cartoon_image=(RelativeLayout)v.findViewById(R.id.cartoon_image);

        ImageView ivDummy =(ImageView)v.findViewById(R.id.dummy);



                try{
                    loader.DisplayImageRelative( al_new.get(position).replace(" ", "%20"),ivDummy, Cartoon_image);
                }
                catch(Exception e){
                    e.printStackTrace();
                }

        return v;
    }

    @Override
    public int getCount() {
        // TODO Auto-generated method stub
        return al_new.size();
    }

    @Override
    public Object getItem(int arg0) {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public long getItemId(int position) {
        // TODO Auto-generated method stub
        return 0;
    }
}   
这是我的自定义dragDrop视图:

 public class ConstrainedDragAndDropView extends LinearLayout {

    Activity main;
    protected View dragHandle,half,heart;
    protected List<View> dropTargets = new ArrayList<View>();
    protected boolean dragging = false;
    protected int pointerId;

    protected int selectedDropTargetIndex = -1;
    protected int lastSelectedDropTargetIndex = -1;
    protected int lastDroppedIndex = -1;

    protected boolean allowHorizontalDrag = true;
    protected boolean allowVerticalDrag = true;

    protected DropListener dropListener;

    public interface DropListener {
        public void onDrop(final int dropIndex, final View dropTarget);
    }

    public ConstrainedDragAndDropView(Context context) {
        super(context);
    }

    public ConstrainedDragAndDropView(Context context, AttributeSet attrs) {
        super(context, attrs);
        applyAttrs(context, attrs);
    }

    @SuppressLint("NewApi")
    public ConstrainedDragAndDropView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        applyAttrs(context, attrs);
    }

    public DropListener getDropListener() {
        return dropListener;
    }

    public void setDropListener(DropListener dropListener) {
        this.dropListener = dropListener;
    }

    public View getDragHandle() {
        return dragHandle;
    }

    public void setDragHandle(View dragHandle,View half_left,View heart) {
        this.dragHandle = dragHandle;

        this.half=half_left;

        this.heart=heart;
        setupDragHandle();
    }

    public List<View> getDropTargets() {
        return dropTargets;
    }

    public void setDropTargets(List<View> dropTargets) {
        this.dropTargets = dropTargets;
    }

    public void addDropTarget(View target) {
        if (dropTargets == null) {
            dropTargets = new ArrayList<View>();
        }
        dropTargets.add(target);
    }

    public boolean isAllowHorizontalDrag() {
        return allowHorizontalDrag;
    }

    public void setAllowHorizontalDrag(boolean allowHorizontalDrag) {
        this.allowHorizontalDrag = allowHorizontalDrag;
    }

    public boolean isAllowVerticalDrag() {
        return allowVerticalDrag;
    }

    public void setAllowVerticalDrag(boolean allowVerticalDrag,Activity c) {
        this.allowVerticalDrag = allowVerticalDrag;

        this.main=c;

    }

    protected void applyAttrs(Context context, AttributeSet attrs) {
        TypedArray a = context.getTheme().obtainStyledAttributes(attrs, R.styleable.ConstrainedDragAndDropView, 0, 0);


        try {
            /*
            layoutId = a.getResourceId(R.styleable.ConstrainedDragAndDropView_layoutId, 0);

            if (layoutId > 0) {
                LayoutInflater.from(context).inflate(layoutId, this, true);
            }
            */
        } finally {
            a.recycle();
        }
    }

    protected void setupDragHandle() {
        this.setOnTouchListener(new DragAreaTouchListener());
    }


    protected class DragAreaTouchListener implements OnTouchListener {
        public boolean onTouch(View view, MotionEvent motionEvent) {


            switch (motionEvent.getAction()) {
                case MotionEvent.ACTION_DOWN:
                       Log.d("Action down", "action down in listener");
                    onActionDown(view, motionEvent);
                    break;

                case MotionEvent.ACTION_UP:
                     Log.d("Action up", "action up in listener");
                    onActionUp(view, motionEvent);
                    break;

               case MotionEvent.ACTION_MOVE:
                   Log.d("Action move", "action move in listener");
                    onActionMove(view, motionEvent);
                    break;

                default:
                    break;
            }

            return true;
        }
    }

 public static   int   param;
    protected void onActionDown(View view, MotionEvent motionEvent) {
        // if we're not already dragging, and the touch position is on the drag handle,
        // then start dragging
        if(!dragging && isDragHandleTouch(motionEvent)) {
            pointerId = motionEvent.getPointerId(0);

            Float s1= dragHandle.getX();
            param=Integer.valueOf(s1.intValue());

            Log.e("param",""+param);
//            updateDragPosition(motionEvent);
            dragging = true;
            Log.d("drag", "drag start");
        }
    }

    protected void onActionUp(View view, MotionEvent motionEvent) {

         Log.d("Action up", "action up");
        // if we're dragging, then stop dragging
        if (dragging && motionEvent.getPointerId(0) == pointerId) {

            Log.e("condition","satisfied");

             Log.e("x val"+(int)motionEvent.getX(),"y val"+(int)motionEvent.getY()); 

             Log.e("x1"+half.getLeft(),"y1"+half.getTop());
             Log.e("x4"+half.getRight(),"y4"+half.getBottom());

              Float s1=motionEvent.getX();
              Float s2=motionEvent.getY();

          int   x=Integer.valueOf(s1.intValue());
          dragging = false;
           int  y=Integer.valueOf(s2.intValue());

             if((half.getLeft()<x)&&(x<half.getRight())&&((half.getTop()<y)&&(y<half.getBottom())))
                 {

                 Log.e("drop","on target");

                try {
                    Thread.sleep(1000);
                       dragHandle.setX(param);
                        heart.setVisibility(View.VISIBLE);

                        Animation pulse = AnimationUtils.loadAnimation(main, R.anim.pulse);
                         heart.startAnimation(pulse);
//                       heart.setVisibility(View.GONE);

                         pulse.setAnimationListener(new AnimationListener() {

                            public void onAnimationStart(Animation animation) {
                                // TODO Auto-generated method stub
                                Log.e("animation","start");
                            }

                            public void onAnimationRepeat(Animation animation) {
                                // TODO Auto-generated method stub

                            }

                            public void onAnimationEnd(Animation animation) {
                                // TODO Auto-generated method stub
                                Log.e("animation","end");
                                 heart.setVisibility(View.GONE);

                            }
                        });

                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
//               class SimpleThread extends Thread {
//                   
//                      public void run() {
//                      
//                          try {
//                              sleep(1000);
//                              runOnUiThread(new Runnable() {
//                                  public void run() {
//                              dragHandle.setX(param);
//                              heart.setVisibility(View.VISIBLE);
//                              
//                              Animation pulse = AnimationUtils.loadAnimation(main, R.anim.pulse);
//                           heart.startAnimation(pulse);
//                                  }
//                              });
//                              
//                          }
//               catch (InterruptedException e) {
//                      // TODO Auto-generated catch block
//                      e.printStackTrace();
//                  }
//          
//       }
//               }
//       
//        new SimpleThread().start();

                 }   

             else{

                 Log.e("drop",""+"outside target");

                 dragHandle.setX(param);

//               TranslateAnimation transAnimation= new TranslateAnimation(x, 300, y, 300);
//               transAnimation.setDuration(1000);//set duration
//                view.startAnimation(transAnimation);

             }
//           if()

//            updateDragPosition(motionEvent);
            Log.d("drag", "drag end");

            // find out what drop target, if any, the drag handle was dropped on
            int dropTargetIndex = findDropTargetIndexUnderDragHandle();

            if(dropTargetIndex >= 0) { // if drop was on a target, select the target
                Log.d("drag", "drop on target " + dropTargetIndex);
//                selectDropTarget(dropTargetIndex);
//                snapDragHandleToDropTarget(dropTargetIndex);
//                lastDroppedIndex = dropTargetIndex;
                if(dropListener != null) {
                    dropListener.onDrop(dropTargetIndex, dropTargets.get(dropTargetIndex));
                }
            } else { // if drop was not on a target, re-select the last selected target
//                deselectDropTarget();
//                snapDragHandleToDropTarget(lastDroppedIndex);
            }
        }

        else{
            Log.e("condition not","satisfied");
        }


    }

    protected void onActionMove(View view, MotionEvent motionEvent) {

     Log.d("Action move", "action move");
        if (dragging && motionEvent.getPointerId(0) == pointerId) {
            updateDragPosition(motionEvent);
            int dropTargetIndex = findDropTargetIndexUnderDragHandle();
            if(dropTargetIndex >= 0) {
                Log.d("drag", "hover on target " + dropTargetIndex);
//                selectDropTarget(dropTargetIndex);
            } else {
//                deselectDropTarget();
            }
        }
    }

    @SuppressLint("NewApi")
    protected void updateDragPosition(MotionEvent motionEvent) {

        // this is where we constrain the movement of the dragHandle

        if(allowHorizontalDrag) {
            float candidateX = motionEvent.getX() - dragHandle.getWidth() / 2;
            if(candidateX > 0 && candidateX + dragHandle.getWidth() < this.getWidth()) {
                dragHandle.setX(candidateX);
            }
        }

        if(allowVerticalDrag) {
            float candidateY = motionEvent.getY() - dragHandle.getHeight() / 2;
            if(candidateY > 0 && candidateY + dragHandle.getHeight() < this.getHeight()) {
                dragHandle.setY(candidateY);
            }
        }
    }

    @SuppressLint("NewApi")
    protected void snapDragHandleToDropTarget(int dropTargetIndex) {
        if(dropTargetIndex > -1) {
            View dropTarget = dropTargets.get(dropTargetIndex);
            float xCenter = dropTarget.getX() + dropTarget.getWidth() / 2;
            float yCenter = dropTarget.getY() + dropTarget.getHeight() / 2;

            float xOffset = dragHandle.getWidth() / 2;
            float yOffset = dragHandle.getHeight() / 2;

            float x = xCenter - xOffset;
            float y = yCenter - yOffset;

            dragHandle.setX(x);
            dragHandle.setY(y);
        }
    }


    protected boolean isDragHandleTouch(MotionEvent motionEvent) {
        Point point = new Point(
            new Float(motionEvent.getRawX()).intValue(),
            new Float(motionEvent.getRawY()).intValue()
        );

        return isPointInView(point, dragHandle);
    }

    protected int findDropTargetIndexUnderDragHandle() {
        int dropTargetIndex = -1;
        for(int i = 0; i < dropTargets.size(); i++) {
            if(isCollision(dragHandle, dropTargets.get(i))) {
                dropTargetIndex = i;
                break;
            }
        }

        return dropTargetIndex;
    }

    /**
     * Determines whether a raw screen coordinate is within the bounds of the specified view
     * @param point - Point containing screen coordinates
     * @param view - View to test
     * @return true if the point is in the view, else false
     */
    protected boolean isPointInView(Point point, View view) {

        int[] viewPosition = new int[2];
        view.getLocationOnScreen(viewPosition);

        int left = viewPosition[0];
        int right = left + view.getWidth();
        int top = viewPosition[1];
        int bottom = top + view.getHeight();

        return point.x >= left && point.x <= right && point.y >= top && point.y <= bottom;
    }

    @SuppressLint("NewApi")
    protected boolean isCollision(View view1, View view2) {
        boolean collision = false;


        do {
            if(view1.getY() + view1.getHeight() < view2.getY()) {
                break;
            }

            if(view1.getY() > view2.getY() + view2.getHeight()) {
                break;
            }

            if(view1.getX() > view2.getX() + view2.getWidth()) {
                break;
            }

            if(view1.getX() + view1.getWidth() < view2.getX()) {
                break;
            }

            collision = true;

        } while(false);

        return collision;
    }

    protected void selectDropTarget(int index) {
        if(index > -1) {
            deselectDropTarget();
            selectedDropTargetIndex = index;
            dropTargets.get(selectedDropTargetIndex).setSelected(true);
        }
    }

    protected void deselectDropTarget() {
        if(selectedDropTargetIndex > -1) {
            dropTargets.get(selectedDropTargetIndex).setSelected(false);
            lastSelectedDropTargetIndex = selectedDropTargetIndex;
            selectedDropTargetIndex = -1;
        }
    }
}

您的ListView高度是否为包裹内容?如果是,则使用match_parent进行更改。Listview高度为match_parent,我有一个要拖动的相对布局。当我像一个视图一样进行采样时,它工作得很好,但当我膨胀到Listview时,这些拖动变得非常缓慢