拖放:ImageView不会一直移动到整个屏幕上

时间:2014-12-10 08:38:55

标签: android service drag-and-drop imageview window-managers

我有一个服务,它使用具有onDragListener的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 个答案:

答案 0 :(得分: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本身。 我觉得我错过了这个但是不确定你是否需要布局而没有其余的活动在它后面运行。哦,好吧,在我生命的两天里,我将永远不会回来大声笑。

...