2013-03-18 4 views
2

Я реализовал систему перетаскивания и теперь хочу нарисовать линию от источника к месту назначения. Как я могу нарисовать эту линию? Я уже использовал расширение класса View, но он не работает. Вот мой код:Как нарисовать линию от источника до места назначения операции перетаскивания?

public class TempDDActivity extends Activity implements OnTouchListener { 
    /** Called when the activity is first created. */ 
    private View selected_item = null; 
    private int offset_x = 0; 
    private int offset_y = 0; 
    Boolean touchFlag=false; 
    boolean dropFlag=false; 
    LayoutParams imageParams; 
    ImageView imageDrop,image1,image2; 
    int crashX,crashY; 
    Drawable dropDrawable,selectDrawable; 
    Rect dropRect,selectRect; 
    int topy,leftX,rightX,bottomY; 

    int dropArray[];  

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     this.requestWindowFeature(Window.FEATURE_NO_TITLE); 
     this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); 
     setContentView(R.layout.main); 
     ViewGroup container = (ViewGroup) findViewById(R.id.container); 
     imageDrop=(ImageView) findViewById(R.id.ImgDrop);  
     image1=(ImageView) findViewById(R.id.img);  
     image2=(ImageView) findViewById(R.id.img2); 
     container.setOnTouchListener(new View.OnTouchListener() 
     { 
      public boolean onTouch(View v, MotionEvent event) 
      { 
       if(touchFlag==true) 
       { 
        System.err.println("Display If Part ::->"+touchFlag); 
        switch (event.getActionMasked()) 
        { 
        case MotionEvent.ACTION_DOWN : 

         topy=imageDrop.getTop(); 
         leftX=imageDrop.getLeft(); 
         rightX=imageDrop.getRight(); 
         bottomY=imageDrop.getBottom(); 
         System.err.println("Display Top-->"+topy);  
         System.err.println("Display Left-->"+leftX); 
         System.err.println("Display Right-->"+rightX); 
         System.err.println("Display Bottom-->"+bottomY);     


         //opRect. 
         break; 
        case MotionEvent.ACTION_MOVE: 
         crashX=(int) event.getX(); 
         crashY=(int) event.getY(); 
         System.err.println("Display Here X Value-->"+crashX); 
         System.err.println("Display Here Y Value-->"+crashY); 

         int x = (int) event.getX() - offset_x; 
         int y = (int) event.getY() - offset_y;           
         //int w = getWindowManager().getDefaultDisplay().getWidth() - 100; 
         //int h = getWindowManager().getDefaultDisplay().getHeight() - 100; 
         int w = getWindowManager().getDefaultDisplay().getWidth() - 50; 
         int h = getWindowManager().getDefaultDisplay().getHeight() - 10; 
         if (x > w) 
          x = w; 
         if (y > h) 
          y = h;      
         RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(new ViewGroup.MarginLayoutParams( RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT)); 
         lp.setMargins(x, y, 0, 0);     

         //Drop Image Here      
         if(crashX > leftX && crashX < rightX && crashY > topy && crashY < bottomY)      
         {       
          Drawable temp=selected_item.getBackground();        
          imageDrop.setBackgroundDrawable(temp); 
          imageDrop.bringToFront();       
          dropFlag=true; 
          selected_item.setVisibility(View.INVISIBLE); 
         } 
         //Drop Image Here      
         selected_item.setLayoutParams(lp); 
         break; 
        case MotionEvent.ACTION_UP: 
         //      
         touchFlag=false; 
         if(dropFlag==true) 
         { 
          dropFlag=false; 
         } 
         else 
         { 
          selected_item.setLayoutParams(imageParams); 
         }      
         break; 
        default: 
         break; 
        } 
       }else 
       { 
        System.err.println("Display Else Part ::->"+touchFlag); 
       }    
       return true; 
      } 
     }); 

     image1.setOnTouchListener(this); 
     image2.setOnTouchListener(this); 
    } 

    public boolean onTouch(View v, MotionEvent event) 
    { 
     switch (event.getActionMasked()) 
     { 
     case MotionEvent.ACTION_DOWN: 
      touchFlag=true; 
      offset_x = (int) event.getX(); 
      offset_y = (int) event.getY(); 
      selected_item = v; 
      imageParams=v.getLayoutParams(); 
      break; 
     case MotionEvent.ACTION_UP: 
      selected_item=null; 
      touchFlag=false; 
      break; 
     default: 
      break; 
     }  
     return false; 
    } 
} 

ответ

1

теперь я хочу, чтобы нарисовать линию от источника к месту назначения

Прежде всего, необходимо иметь собственный взгляд на самом деле рисовать линию. Это будет макет, который обертывает ImageViews, который в вашем случае я считаю RelativeLayout. Этот класс будет что-то вроде:

public class DragObserverLayout extends RelativeLayout { 

    float startX, startY, stopX, stopY; 
    private Paint mPaint = new Paint(); 
    private List<Rect> lines = new ArrayList<Rect>(); 

    public DragObserverLayout(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     mPaint.setColor(Color.GREEN); 
     mPaint.setStrokeWidth(2.0f); 
    } 

    @Override 
    protected void dispatchDraw(Canvas canvas) { 
     super.dispatchDraw(canvas); 
     final int count = lines.size(); 
     for (int i = 0; i < count; i++) { 
      final Rect r = lines.get(i); 
      canvas.drawLine(r.left, r.top, r.right, r.bottom, mPaint); 
     } 
    } 

    public void addLine(Rect r) { 
     lines.add(r); 
     invalidate(); 
    } 

} 

Тогда в OnTouchListener для контейнера, в котором вы делаете операцию перетаскивания, вы бы просто сделать:

final int[] location = new int[2]; 
    final DragObserverLayout container = (DragObserverLayout) findViewById(R.id.container);  
    container.setOnTouchListener(new View.OnTouchListener() { 
     public boolean onTouch(View v, MotionEvent event) { 
      if(touchFlag==true) { 
       switch (event.getActionMasked()) 
       { 
       case MotionEvent.ACTION_DOWN : 
        //... 
        selected_item.getLocationOnScreen(location); 
     container.startX = location[0]; 
     container.startY = location[1]; 
        break; 
       case MotionEvent.ACTION_MOVE: 
        //... 
        selected_item.getLocationOnScreen(location);    
        break; 
       case MotionEvent.ACTION_UP: 
        // ... 
        // .. the item was dragged on the target 
        if (selected_item.getVisibility() != View.VISIBLE) { 
         Rect r = new Rect(); 
         r.left = (int) container.startX; 
         r.top = (int) container.startY; 
         imageDrop.getLocationInWindow(location); 
         r.right = location[0]; 
         r.bottom = location[1]; 
         container.addLine(r); 
        } 

Это нарисует прямой линии от начального положение перетаскиваемого ImageView (верхняя левая точка обзора) в текущее положение до тех пор, пока не будет сброшено значение ImageView. Если вы хотите, вы могли бы компенсировать позицию стартовой линии, чтобы указать на реальное касание позиции, сделав простой расчет в методе onTouch для ImageViews. Это также работает, поскольку у вас полноэкранное приложение, охватывающее весь экран, иначе вам придется компенсировать возврат с getLocationOnScreen(), чтобы принять во внимание строку состояния. Если вы хотите сохранить линию на экране после завершения операции перетаскивания, вам необходимо сохранить ее в контейнере.

+0

я хочу, чтобы нарисовать линию после того, как ACTION_UP: Вызванные: java.lang.ClassCastException: android.widget.RelativeLayout – kamal

+0

@kamal Хочет, чтобы нарисовать линию между перемещенным 'ImageView' и падением' ImageView' если пользователь перетаскивает первый поверх другого? Эта строка должна оставаться на экране? И что с этим исключением? – Luksprog

+0

Простая вещь, когда я перетаскиваю Imageview в пункт назначения, тогда показываю строку между источником и destincation, как в примере есть image1, когда я выбираю image1 и уезжаю в imageDrop, тогда одна простая строка будет показывать между этими двумя изображениями, где первоначально изображение1 , ;;;;;;;;; и исключение составляет ....... final DragObserverLayout container = (DragObserverLayout) findViewById (R.id.container); – kamal

Смежные вопросы