Questo è quanto ho ricostruito agevolmente finora:
Servizio:
public class OverlayService extends Service {
int startX, startY;
float eventX,eventY;
Immagine wImage,tImage;
public OverlayService() {
}
@Override
public IBinder onBind(Intent intent) {
// TODO: Return the communication channel to the service.
throw new UnsupportedOperationException("Not yet implemented");
}
@Override
public void onCreate() {
super.onCreate();
wImage=new Immagine(this);
tImage=new Immagine(this);
wImage.setImageResource(R.drawable.post_it);
tImage.setImageResource(R.drawable.monnezza);
final WindowManager windowManager=(WindowManager) getSystemService(WINDOW_SERVICE);
final WindowManager.LayoutParams wParams=new WindowManager.LayoutParams(
200,
200,
WindowManager.LayoutParams.TYPE_PHONE,
WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
PixelFormat.TRANSLUCENT
);
wParams.gravity= Gravity.TOP | Gravity.START;
wParams.x=0;
wParams.y=100;
WindowManager.LayoutParams tParams=new WindowManager.LayoutParams(
200,
200,
WindowManager.LayoutParams.TYPE_PHONE,
WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
PixelFormat.TRANSLUCENT
);
tParams.gravity=Gravity.TOP | Gravity.START;
tParams.x=0;
tParams.y=100;
windowManager.addView(tImage,tParams);
windowManager.addView(wImage,wParams);
wImage.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
view.performClick();
switch(motionEvent.getAction()){
case MotionEvent.ACTION_DOWN:
startX=wParams.x;
startY=wParams.y;
eventX=motionEvent.getRawX();
eventY=motionEvent.getRawY();
return true;
case MotionEvent.ACTION_MOVE:
wParams.x=startX+(int)(motionEvent.getRawX()-eventX);
wParams.y=startY+(int)(motionEvent.getRawY()-eventY);
windowManager.updateViewLayout(wImage,wParams);
return true;
}
return true;
}
});
}
class Immagine extends android.support.v7.widget.AppCompatImageView{
public Immagine(Context context) {
super(context);
}
@Override
public boolean performClick() {
super.performClick();
return true;
}
}
}
Ora nel corso dell'evento MOVE deve esserci qualcosa che risistemi i confini dell'immagine.
Io farei qualcosa di semplice in questo modo: creare una funzione che mi sospinga sempre in una determinata posizione l'immagine.
Per far questo devo derivare le dimensioni del display:
private void misuraSchermo(){
windowManager.getDefaultDisplay().getSize(szDisplay);
}
private void resetPosition(){
misuraSchermo();
if(wParams.x<=szDisplay.x/2){
wParams.x=0;
}else{
wParams.x=szDisplay.x-wParams.width;
}
windowManager.updateViewLayout(wImage,wParams);
}
Con queste due "routines di servizio" misuro lo schermo e poi all'evento UP riporto l'immagine a sinistra o a destra a seconda che si trovi più verso sinistra o destra.
Questa è la prima difficoltà che ho avuto nel ricordare il codice, ma predisporrò degli altri Mandala.
Ma ho commesso un errore nella ricostruzione di resetPosition.
Non ho considerato che potrei spingere l'immagine anche nella dimensione verticale, oltre che in quella orizzontale, in modo che essa si trovi illusoriamente al limite inferiore della finestra ma in realtà si trovi molto più in basso, resistendo poi al "prelievo" successivo con il tocco.
Ecco la funzione completa, dopo aver creato anche una funzione che contempla la misurazione della statusBar:
private void resetPosition(){
misuraSchermo();
if(wParams.x<=(szDisplay.x/2-wParams.width/2)){
wParams.x=0;
}else{
wParams.x=szDisplay.x-wParams.width;
}
if(wParams.y>szDisplay.y-statusBarHeight()-wParams.height){
wParams.y=szDisplay.y-statusBarHeight()-wParams.height;
}
windowManager.updateViewLayout(wImage,wParams);
}
Questa, così come quella successiva che si occupa della gestione delle rotazioni del cellulare, conviene che me le faccia subito, in modo da togliermi il pensiero.
Nessun commento:
Posta un commento