Ответ 1
Попробуйте установить гравитацию на Gravity.TOP | Gravity.LEFT
У меня есть код для ICS для планшетов. Я хочу добавить динамическое изображение в фрагмент. Фрагмент уже содержит preferencelist. Код для добавления представления динамически выглядит следующим образом. Я кодирую эту функцию перетаскивания. Эта часть кода взята из файла TouchInterceptor.java из приложения для Android-андроида.
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);
Я указываю координату x для параметра windowlayout param как 0. Событие, а затем, когда отображается представление, оно отображается слева от фрагмента (правое окно), представление отображается со средней части правой панели и охватывает на правую панель. Что я делаю неправильно? Что нужно сделать, чтобы исправить это?
Попробуйте установить гравитацию на Gravity.TOP | Gravity.LEFT
Я работаю над тем же кодом, взятым из старого проекта Google Music open.
Как я и предполагал, у меня был 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()
я подхожу к дереву просмотра, чтобы получить абсолютное расстояние списка слева.
Разделив его на ширину окна, вы получите процент необходимого вам поля.