2014-12-10 5 views
1

У меня есть служба, которая создает окно с объектом ImageView, у которого есть onDragListener. Идея состоит в том, чтобы иметь возможность переместить это окно по экрану.Drag-and-Drop: ImageView не будет полностью перемещаться по экрану

Проблема: по какой причине координат, возвращенных event.getX() и event.getY(), кажется, не отражают реальность. Объект перемещается, но только в левом верхнем углу 70-100 пикселей или около того и очень шаткий. Протестировано на эмуляторе и Galaxy S5.

public class PlayerRemote extends Service 
         implements OnClickListener, OnDragListener{ 


     private WindowManager windowManager; 
     private ImageView remoteButton; 
     String msg = "Sharp"; 
     private static final String IMAGEVIEW_TAG = "Sharp"; 
     private WindowManager.LayoutParams layoutParams; 

     public static final String ACTION_SWITCH_VIEW = 
        "com.example.android.playerremote.action.SWITCH_VIEW"; 



     @Override public IBinder onBind(Intent intent) { 

     return null; 
     } 

     @Override 
     public void onCreate() { 
     super.onCreate(); 


     windowManager = (WindowManager) getSystemService(WINDOW_SERVICE); 
     Display display = windowManager.getDefaultDisplay(); 


     remoteButton = new ImageView(this); 
     remoteButton.setImageResource(R.drawable.on_off_inv); 
     remoteButton.setTag(IMAGEVIEW_TAG); 

     WindowManager.LayoutParams params = new WindowManager.LayoutParams(
      WindowManager.LayoutParams.WRAP_CONTENT, 
      WindowManager.LayoutParams.WRAP_CONTENT, 
      WindowManager.LayoutParams.TYPE_SYSTEM_ALERT, 
      WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE, 
      PixelFormat.TRANSLUCENT); 

     params.gravity = Gravity.TOP | Gravity.LEFT; 
     params.x = display.getWidth(); 
     params.y = display.getHeight(); 

     windowManager.addView(remoteButton, params); 

     //------------------------------------------------------ 
     //-SETTING OnLongClickListener-------------------------- 
     /***/ 
     remoteButton.setOnLongClickListener(new View.OnLongClickListener() { 
      @Override 
      public boolean onLongClick(View v) { 

       ClipData.Item item = new ClipData.Item((CharSequence)v.getTag()); 

       String[] mimeTypes = {ClipDescription.MIMETYPE_TEXT_PLAIN}; 

       ClipData dragData = new ClipData(v.getTag().toString(), mimeTypes, item); 

       // Instantiates the drag shadow builder. 
       View.DragShadowBuilder myShadow = new DragShadowBuilder(remoteButton); 

       // Starts the drag 
       v.startDrag(dragData, // the data to be dragged 
       myShadow,    // the drag shadow builder 
       null,     // no need to use local data 
       0      // flags (not currently used, set to 0) 
       ); 
       return true; 
      } 
      }); 

     //------------------------------------------------------------------ 
     //-SETTING OnDragListener------------------------------------------- 
     /***/ 
     remoteButton.setOnDragListener(new OnDragListener(){ 
      //@Override 
      public boolean onDrag(View v, DragEvent event){ 
      switch(event.getAction()) 
      { 
       case DragEvent.ACTION_DRAG_STARTED: 

        layoutParams = (LayoutParams) v.getLayoutParams(); 

        break; 

       case DragEvent.ACTION_DRAG_ENTERED: 


        break; 

       case DragEvent.ACTION_DRAG_EXITED : 


        break; 

       case DragEvent.ACTION_DRAG_LOCATION : 

        Log.d(msg, "Action is DragEvent.ACTION_DRAG_LOCATION"); 
        layoutParams.x = (int) Math.round(event.getX()); 
        layoutParams.y = (int) Math.round(event.getY()); 
        windowManager.updateViewLayout(remoteButton, layoutParams); 

        break; 

       case DragEvent.ACTION_DRAG_ENDED : 

        break; 

       case DragEvent.ACTION_DROP: 

        Log.d(msg, "ACTION_DROP event"); 
        layoutParams.x = (int) Math.round(event.getX()); 
        layoutParams.y = (int) Math.round(event.getY()); 
        windowManager.updateViewLayout(remoteButton, layoutParams); 
        break; 

       default: break; 
       } 
       return true; 
      } 
      });  

кажется, что когда я изменить тяжесть зрения, мое сопротивление и падение начинает пристанет в другом месте и по-прежнему не позволяет мне двигаться по экрану. Похоже, что мое окно инкапсулировано в другой объект, о котором я не знаю.

Любые идеи приветствуются.

ответ

1

Проблема решена путем надувания макета и добавление ImageView к нему так:

public class Remote extends Service 
... 
private WindowManager windowManager; 
private ImageView remoteButton; 
private RelativeLayout remoteButtonLayout; 

... 
[in onCreate()] 
... 

remoteButtonLayout = (RelativeLayout) inflater 
        .inflate(R.layout.remote_button, null); 
remoteButton = (ImageView)remoteButtonLayout.findViewById(R.id.on_off_inv); 
windowManager.addView(remoteButtonLayout, params); 

OnClickListener затем установить на макете, а не к самому ImageView. Я чувствовал, что мне не хватает этого, но не был уверен, нужен ли вам макет, если остальная деятельность не работает за ним. О, хорошо, вот два дня в моей жизни, я никогда не вернусь к LOL.

...