Questa è una situazione difficile da descrivere, quindi per favore portami con me. Mi è stato chiesto di fare una programmazione 'segni dei pullman' un po 'come questo:Android - disegno ImageView precisamente sulla parte superiore della vista esistente nel livello più profondo
Tuttavia, nel mio caso ho bisogno di 'tirare' alcune delle immagini sottostanti per la parte anteriore e visualizzarle in un colore diverso per farli risaltare. Non riesco a determinare quale sarà il 'frame' di queste immagini prima del tempo di esecuzione. Il mio approccio è di aggiungere una vista semiopaca nera (che io chiamo una "tenda") che copre l'intero schermo, e quindi aggiungere le immagini di cui ho bisogno come sottoview della tenda con un colore diverso. EDIT Questa parte è facile e non sto chiedendo aiuto per questo (motivo per cui il suggerimento che questo è un duplicato della domanda suggerita non è corretto).
Non credo di poter utilizzare bringToFront()
o setTranslationZ()
perché questi metodi non porteranno il ImageView
fino in fondo alla mia tenda. Quindi, quello che sto cercando di fare è ottenere il 'frame' esatto della vista dell'immagine (la sua x, y, larghezza e altezza) relativo allo schermo generale e quindi provare ad aggiungere la nuova vista dell'immagine usando lo stesso disegnabile con la stessa cornice.
È anche importante sapere che la "vista" sottostante è in realtà composta da più viste (incluso un cassetto scorrevole), motivo per cui ho bisogno di ottenere le coordinate relative allo schermo. Spero che abbia senso.
Sono in grado di disegnare il nuovo ImageView
come visualizzazione secondaria della tenda con il colore corretto, ma la posizione e la dimensione dell'immagine sono lontane. Come posso disegnare questo nuovo ImageView
esattamente sopra quello precedente?
Sono aperto anche ad altre strategie (poiché questa sembra non funzionare). Grazie per tutto l'aiuto.
@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);
}
Possibile duplicato di [Come creare attività trasparenti in Android?] (Http://stackoverflow.com/questions/16332064/how-to-create-transparent-activity-in-android) – user5599807
provare [questo] (http : // pastebin.com/dg4CXx0f) – pskink
@ user5599807 - non un duplicato. Quel post richiede solo una domanda molto semplice, che è come disegnare una vista con uno sfondo semitrasparente. Lo sto già facendo (facilmente). La mia domanda riguarda come posizionare viste secondarie su quella nuova vista in una posizione precisa e con una dimensione precisa. – Alex