Это сложная ситуация для описания, поэтому, пожалуйста, потерпите меня. Меня попросили сделать экран «оценки тренера» примерно таким:
Однако в моем случае мне нужно «вытянуть» некоторые из основных изображений на передний план и отобразить их другим цветом, чтобы они выделялись. Я не могу определить, каким будет «кадр» этих изображений до запуска. Мой подход состоит в том, чтобы добавить черный полупрозрачный вид (я называю его «занавес»), покрывающий весь экран, а затем добавить нужные мне изображения в качестве подвидов занавеса другого цвета. EDIT Эта часть проста, и я не прошу помощи в этом (поэтому предположение, что это дубликат предложенного вопроса, неверно).
Я не думаю, что смогу использовать bringToFront()
или setTranslationZ()
, потому что эти методы не выведут ImageView
полностью на переднюю часть моего занавеса. Итак, что я пытаюсь сделать, это получить точную «рамку» представления изображения (его x, y, ширина и высота) относительно всего экрана, а затем попытаться добавить новый просмотр изображения с использованием того же чертежа с тем же кадром.
Также важно знать, что базовый «представление» на самом деле состоит из нескольких представлений (включая выдвижной ящик), поэтому мне нужно получить координаты относительно экрана. Я надеюсь это имеет смысл.
Я могу нарисовать новый ImageView
как часть занавеса с правильным цветом, но положение и размер изображения далеко. Как я могу нарисовать этот новый ImageView
точно поверх предыдущего?
Я также открыт для других стратегий (поскольку этот, кажется, не работает). Спасибо за любую помощь.
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
...
ViewTreeObserver vto = mRootview.getViewTreeObserver();
vto.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
mRootview.getViewTreeObserver().removeOnGlobalLayoutListener(this);
mDrawerLayout.openDrawer(Gravity.LEFT);
RelativeLayout curtain = addOpaqueCurtainToRootView();
int frame[] = getFrameOfExistingImageView();
addNewImageViewOnTopOfEverything(curtain, frame);
}
});
}
private RelativeLayout addOpaqueCurtainToRootView() {
RelativeLayout curtain = new RelativeLayout(context);
RelativeLayout.LayoutParams curtainParams = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, RelativeLayout.LayoutParams.MATCH_PARENT);
curtain.setLayoutParams(curtainParams);
curtain.setBackgroundColor(Color.argb(179, 0, 0, 0)); //70% opaque
mRootview.addView(curtain);
return curtain;
}
private int[] getFrameOfExistingImageView() {
// proving that I have a reference to the original image
mCurrentImage.setColorFilter(Color.rgb(255, 0, 0));
int array[] = new int[2];
mCurrentImage.getLocationOnScreen(array);
Log.d(TAG, "width: " + Integer.toString(array[0]));
Log.d(TAG, "height: " + Integer.toString(array[1]));
Log.d(TAG, "x: " + Float.toString(mCurrentImage.getX()));
Log.d(TAG, "y: " + Float.toString(mCurrentImage.getY()));
int frame[] = new int[4]; // x,y,width,height
frame[0] = (int)mCurrentImage.getX();
frame[1] = (int)mCurrentImage.getY();
frame[2] = array[0];
frame[3] = array[1];
return frame;
}
private void addNewImageViewOnTopOfEverything(RelativeLayout curtain, int[] frame) {
ImageView iv = new ImageView(context);
iv.setImageResource(R.drawable.imgView);
iv.setColorFilter(Color.rgb(255, 255, 255));
iv.setX(frame[0]);
iv.setY(frame[1]);
iv.setLayoutParams(new RelativeLayout.LayoutParams(frame[2], frame[3]));
curtain.addView(iv);
}