2012-03-13 41 views
10

Tôi có mã trên ICS cho máy tính bảng. Tôi muốn thêm một lần xem hình động vào một đoạn. Các mảnh đã có chứa người thích. Mã để thêm chế độ xem động như sau. Tôi đang mã hóa chức năng kéo và thả này. Phần này của mã được lấy từ tập tin TouchInterceptor.java từ ứng dụng nhạc android.thêm chế độ xem động bằng WindowManager.addView

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); 

Tôi xác định tọa độ x của windowlayout param như 0. Eventthen khi xem sẽ được hiển thị, itstead hiển thị từ leftside của đoạn (khung bên phải), quan điểm được hiển thị từ giữa quyền và kéo dài đến khung bên phải. Tôi đang làm gì sai? Whats phải được thực hiện để sửa lỗi này?

Trả lời

8

Cố gắng thiết lập trọng lực để Gravity.TOP | Gravity.LEFT

2

Tôi đang làm việc exatly trên cùng mã lấy từ dự án mở souce Google Music cũ.

Giống như bạn tôi đoán, tôi đã có một TouchInterceptor trong một đoạn. Vấn đề của tôi là đoạn không lấy hết toàn bộ màn hình, nó có một mảnh khác ở bên trái.

Tôi đã thử rất nhiều bằng cách sử dụng mWindowParams.gravity để có thể chỉ định một x, y tuyệt đối nhưng tôi không thể tìm thấy giải pháp. Cuối cùng tôi đã giải quyết nó với mWindowParams.horizontalMargin.

Đây là mã tôi đã đưa ra:

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; 
} 

Phần tôi thêm là:

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

này tham số mWindowParams.horizontalMargin xác định lợi nhuận của cửa sổ từ phía lực hấp dẫn cụ thể (Gravity.Left) dưới dạng% € [0,1].

Vì vậy, với getAbsoluteLeft() tôi đi tới cây Xem để nhận khoảng cách tuyệt đối của danh sách từ phía bên trái.

Chia nó theo chiều rộng của cửa sổ, bạn nhận được phần trăm lợi nhuận bạn cần.

Các vấn đề liên quan