Visualizzazione stampabile
-
Il problema che la barra ogni tanto non riconoscre lo spostamento è dovuto al continuo controllo del touch sulla barra.
Se si sposta la barra piano non ci sono problema perchè la barra viene spostata rapidamente e il touch è sempre all'interno dell'intervallo, ma se si sposta velocemente il sistema potrebbe non riconoscere più il touch all'interno e quindi lasciare la barra dove è!
La possibile soluzione potrebbe essere di verificare se il touch è all'interno della barra solo all'inzio (e impostare un booleano) per poi spostare la barra sotto l'if del booleano:
all'inizio della activity
codice:
public boolean checkbarpressed = (boolean) false;
E poi l'evento OnTouchEvent:
codice:
public boolean onTouchEvent(MotionEvent event) {
/**
* EN
* Get y value, calculate if touch is in tollerance zone of drop down bar
*
* IT
* Ottiene il valore di y e calcola se il touch è nella zona di tolleranza della drop down bar
*/
int y = (int) event.getY();
int yiniziale;
if ((y >= (dropdownbar2.getTop() - TOLLERANCE_TOP ) ) & ( y <= (dropdownbar2.getBottom() + TOLLERANCE_BOTTOM )) & (checkbarpressed==false)) {
checkbarpressed=true;
yiniziale=y;
}
if (checkbarpressed==true) {
RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT);
statusBarOffset = dm.heightPixels - rootlayout.getHeight();
/**
* EN
* If the touch is over the minimal bar position before compression set it in the minimal position
*
* IT
* Se il touch è oltre la posizione minima della barra prima di ridursi di altezza la barra viene posizionata nel punto minimo
*/
if ((rootlayout.getHeight() - (y - statusBarOffset)) <= dropdownbar2.getHeight())
params.topMargin = rootlayout.getHeight() - dropdownbar2.getHeight();
else if ((y - statusBarOffset) <= dropdownbar2.getHeight())
params.topMargin = 0;
else params.topMargin = y - statusBarOffset - dropdownbar2.getHeight()/2;
dropdownbar2.setLayoutParams(params);
}
return false;
}
Bisogna reimpostare il booleano su false quando si stacca il dito dallo schermo e allo stesso tempo si può verificare il deltay (yiniziale-y) e se è maggiore di 0 spostare la barra in cima, se è minore di 0 spostare la barra in fondo.
Che eventi ci sono che possiamo usare?
Comunque rimane un problema... che in realtà non si porrà se "forziamo" la barra in alto e in basso. Se la barra è sull'include3 (cosa ci andrà?) l'evento touch non si presenta...
-
Ehi ciao dema, sei anche qui a farci compagnia :D benvenuto nel team :D
Purtroppo anche qui non c'è la soluzione al problema iniziale :( l'evento onTouchEvent non viene richiamato nonostante venga premuto il touch!!. Per quanto riguarda quello che hai detto trovo che sia un ottima cosa :) cosi anche nei terminali più lenti non si evita di uscire dall'intervallo.
Per quanto riguarda la domanda "Che eventi ci sono che possiamo usare?" è semplice :
La stessa onTouchEvent!:
codice:
if (event.getAction() == MotionEvent.ACTION_UP) {
do something
}
Dove chiaramente event è il parametro della funzione onTouch motion event e ACTION_UP significa rilascio del dito.
L'include 3 incluederà delle icone.
Lavorando per mettere l'animazione che fa salire o scendere la barra (ho usato i TraslateAnimation) ho trovato il problema che la barra si muove ma il drawer agganciato ad essa con il below (relative layout) non la segue e inoltre dopo l'animazione la barra non si muove correttamente, quindi ho risolto mettendo alla fine dell'animazione un setTop che risistema il drawer ma durante l'animazione il drawer non si muove e si aggancia solo alla fine. Creare due animazioni contemporanee potrebbe essere la soluzione ma viene una cosa sporchissima e inaccettabile. Comunque ecco cosa ho fatto:
codice:
if (event.getAction() == MotionEvent.ACTION_UP) {
int originalPos[] = new int[2];
dropdownbar2.getLocationOnScreen( originalPos );
Animation animation = new TranslateAnimation(0, 0, 0, 0 - originalPos[1] + statusBarOffset);
// il costruttore prevede 4 int, x iniziale, x finale, y iniziale e y finale. Tutte le coordinate sono relative al punto in cui si trova la view prima dell'animazione (es. 0,0,0,10 sposterà la view di 10dp in alto)
// A better form is:
// TraslateAnimation animation = new TranslateAnimation(0, 0, 0, -originalPos[1]);
// or
// TraslateAnimation animation = new TranslateAnimation(0, 0, 0, -(dropdownbar2.geTop()));
animation.setDuration(1000);
animation.setFillAfter(false); // <-- fa in modo che a fine animazione la view rimanga nel posto e non ritorni al posto iniziale
dropdownbar2.startAnimation(animation);
animation.setInterpolator(new AccelerateInterpolator(ACCELERATION_VALUE));
animation.setAnimationListener(new Animation.AnimationListener(){
@Override
public void onAnimationStart(Animation anim) {
}
@Override
public void onAnimationRepeat(Animation anim) {
}
@Override
public void onAnimationEnd(Animation anim) {
RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT);
params.topMargin = 0; <-- in questo caso la barra viene piazzata alla massima altezza
dropdownbar2.setLayoutParams(params);
}
});
}
-
Non intendevo solo su device più lenti... Perchè anche sul nexus non ci sta dietro! :D
Invece che usare un include non possiamo posizionare la barra e il drawer in un unico layout e riposizionare l'intero layout secondo l'evento?
Comunque non capisco... È solo sull'include3 che non crea l'evento! Sul resto funziona!
Vabbhe... Con la fine della scuola devo studiarmi un po' di java!
-
Quote:
Originariamente inviato da
dema121
Non intendevo solo su device più lenti... Perchè anche sul nexus non ci sta dietro! :D
Invece che usare un include non possiamo posizionare la barra e il drawer in un unico layout e riposizionare l'intero layout secondo l'evento?
Comunque non capisco... È solo sull'include3 che non crea l'evento! Sul resto funziona!
Vabbhe... Con la fine della scuola devo studiarmi un po' di java!
Be un layout unico sarebbe l'ideale in effetti..! (non so perchè non lo ho fatto :p)
A me l'evento non parte anche in altre zone non solo nel include3 (quando funziona funziona anche li)
-
Una cosa più pulita è modificare il booleano checkbarpressed con l'evento OnTouch solo della dropdownbar2 quindi:
codice:
dropdownbar2.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
if(motionEvent.getAction() == MotionEvent.ACTION_DOWN) {
checkbarpressed=true;
}
return false;
}
});
Per quanto riguarda il layout "unificato" della barra+drawer modifichiamo l'altezza del layout o la posizione come adesso?
EDIT:
impostato le animazioni di apertura e chiusura! Adesso la barra è "completa" ma c'è ancora il problema dell'include (su schermi dove la barra è sopra l'include).
Carico su GitHub e carico anche l'apk compilato.
@grafici: serve l'immagine normal e pressed della barra (.9.png)
P.S: spero di non aver fatto casini con GitHub! :D è la prima volta che lo uso...
-
Se ricordo bene i .9.png sono quelli con 1px di bordo nero inutilizzato... provvedo io, speriamo di risolvere i problemi di connessione entro sta sera :)
Intanto buono sviluppo
-
VI sto seguendo da un po', mi complimento con tutti gli sviluppatori. Mi sto rendendo utile anche io: sto creando un video (creando da 0 o quasi) in cui viene messo in funzione il launcher da una mano inesistente in modo da poterlo presentare sul mio canale YouTube e nel post. Il video rispecchierà il progetto del launcher naturalmente
-
@Jeeko: non inutilizzato ma i "bordi" servono a dire al sistema come adattare/allungare l'immagine.
Fai la barra più stretta possibile con i 3 trattini. Poi le 9patch le faccio io! ;)
@Nicoseven: chi si vede! ;)
-
Quote:
Originariamente inviato da
dema121
@Jeeko: non inutilizzato ma i "bordi" servono a dire al sistema come adattare/allungare l'immagine.
Fai la barra più stretta possibile con i 3 trattini. Poi le 9patch le faccio io! ;)
@Nicoseven: chi si vede! ;)
è sempre un piacere dema :D
una cosa: se il launcher verrà bene, andrà sul GPlay?
-
Quote:
Originariamente inviato da
dema121
@Jeeko: non inutilizzato ma i "bordi" servono a dire al sistema come adattare/allungare l'immagine.
Fai la barra più stretta possibile con i 3 trattini. Poi le 9patch le faccio io! ;)
https://github.com/dedeswim/now-laun...bar_normal.png
Sarebbe questa? Aspetto conferma per mettermi al lavoro