【问题标题】:adding dynamic view using WindowManager.addView使用 WindowManager.addView 添加动态视图
【发布时间】:2012-03-29 20:50:10
【问题描述】:

我有一个适用于平板电脑的 ICS 代码。我想将 Imageview 动态添加到片段中。该片段已包含首选项列表。动态添加视图的代码如下。我正在编写这个拖放功能。这部分代码取自 Android 音乐应用的 TouchInterceptor.java 文件。

mWindowParams = new WindowManager.LayoutParams();
mWindowParams.gravity = Gravity.TOP ;
mWindowParams.x = 0;
mWindowParams.y = y
mWindowParams.height = WindowManager.LayoutParams.WRAP_CONTENT;
mWindowParams.width = WindowManager.LayoutParams.WRAP_CONTENT;
mWindowParams.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
    | WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE
    | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON
    | WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN;
mWindowParams.format = PixelFormat.TRANSLUCENT;
mWindowParams.windowAnimations = 0;

ImageView v = new ImageView(mContext);
int backGroundColor = mContext.getResources().getColor(R.color.bg_background);
v.setBackgroundColor(backGroundColor);
v.setImageBitmap(bm);

mWindowManager = (WindowManager)mContext.getSystemService("window");
mWindowManager.addView(v, mWindowParams);

我将 windowlayout 参数的 x 坐标指定为 0。事件然后当显示视图时,它不是从片段的左侧(右窗格)显示,而是从右窗格的中间显示,并且是跨越到右窗格。我做错了什么?必须做些什么来纠正这个问题?

【问题讨论】:

    标签: android view drag-and-drop


    【解决方案1】:

    尝试将重力设置为Gravity.TOP | Gravity.LEFT

    【讨论】:

      【解决方案2】:

      我正在使用从旧的 Google Music 开源项目中提取的相同代码。

      我猜和你一样,我在片段中有一个TouchInterceptor。我的问题是该片段没有占据所有屏幕宽度,它的左侧还有另一个片段。

      我尝试了很多使用mWindowParams.gravity 来指定绝对 x,y 但我找不到解决方案。最后我用mWindowParams.horizontalMargin解决了这个问题。

      这是我想出的代码:

      private int getAbsoluteLeft(){
          ViewGroup parent;
          View child = this;
          int left_absolute_position = 0;
          try{
              while( (parent = (ViewGroup) child.getParent()) != null) {
                  left_absolute_position += child.getLeft();
                  child = parent;
              }
          }catch(ClassCastException e){
          }
      
          return left_absolute_position;
      }
      
      private void startDragging(Bitmap bm, int x, int y) {
          stopDragging();
          //build the view
          Context context = getContext();
          ImageView v = new ImageView(context);
          //int backGroundColor = context.getResources().getColor(R.color.dragndrop_background);
          //v.setBackgroundColor(backGroundColor);
          //v.setBackgroundResource(R.drawable.playlist_tile_drag);
          v.setPadding(0, 0, 0, 0);
          v.setImageBitmap(bm);
          mDragBitmap = bm;
      
          mWindowManager = (WindowManager)context.getSystemService(Context.WINDOW_SERVICE);
      
          //Build Params
          mWindowParams = new WindowManager.LayoutParams();
          mWindowParams.gravity = Gravity.TOP | Gravity.LEFT;
          mWindowParams.x = ( x - mDragPointX + mXOffset );
          mWindowParams.y = ( y - mDragPointY + mYOffset );
      
          DisplayMetrics metrics = new DisplayMetrics();
          mWindowManager.getDefaultDisplay().getMetrics(metrics);
          mWindowParams.horizontalMargin = (float)getAbsoluteLeft() / (float)metrics.widthPixels;
      
          mWindowParams.height = WindowManager.LayoutParams.WRAP_CONTENT;
          mWindowParams.width = WindowManager.LayoutParams.WRAP_CONTENT;
          mWindowParams.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
                  | WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE
                  | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON
                  | WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN
                  | WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS;
          mWindowParams.format = PixelFormat.TRANSLUCENT;
          mWindowParams.windowAnimations = 0;
      
          mWindowManager.addView(v, mWindowParams);
          mDragView = v;
      }
      

      我添加的部分是:

      DisplayMetrics metrics = new DisplayMetrics();
      mWindowManager.getDefaultDisplay().getMetrics(metrics);
      mWindowParams.horizontalMargin = (float)getAbsoluteLeft() / (float)metrics.widthPixels;
      

      此参数mWindowParams.horizontalMargin 指定窗口距指定重力侧 (Gravity.Left) 的边距为 % € [0,1]。

      所以我使用getAbsoluteLeft() 上视图树以获取列表与左侧的绝对距离。

      将它除以窗口的宽度,得到所需的边距百分比。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-06-16
        • 1970-01-01
        • 2012-05-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多