android - 拖放:ImageView 不会在屏幕上一直移动

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

我有一个服务可以创建一个带有 ImageView 对象的窗口,该对象有一个 onDragListener。 这个想法是能够在屏幕上重新定位该窗口。

问题: 无论出于何种原因,event.getX() 和 event.getY() 返回的坐标似乎并不反射(reflect)现实。该对象确实移动,但仅在左上角 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;
             }
          });    

似乎当我改变 View 的重力时,我的拖放操作开始在不同的位置出现错误,并且仍然不允许我在屏幕上移动。感觉我的窗口被封装在另一个我不知道的对象中。

非常感谢任何想法。

最佳答案

通过膨胀布局并向其添加 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 本身。 我觉得我错过了它,但不确定您是否需要布局而无需其他 Activity 在其后面运行。哦,好吧,这是我生命中的两天,我再也回不来了,哈哈。

...

关于android - 拖放:ImageView 不会在屏幕上一直移动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27396486/

相关文章:

javascript - Jquery 检查 id=x 的 li 是否已经存在于 ul 中

android - 通过 Fabric Beta 安装应用程序时解码时找不到类

Android:从 onReceive 方法设置新的闹钟

ubuntu - 服务器重启后Docker服务启动

android - Android 中的后台服务 - 需要帮助

javascript - Jquery 拖放元素保留在列表中并创建另一个

android - Android 中的静电安全吗?

java - Android 中的类就像 Swift 中的 Struct

java - 在 android ScrollView 中禁用 "flinging"?

java - 是否可以在 JFrame 中包含 "movable"/"draggable"组件,如 JButtons、JTextFields?