View beim ersten Erscheinen

  • Antworten:7
Mac Systems
  • Forum-Beiträge: 1.727

21.02.2011, 13:33:08 via Website

Hallo,

kennt jemand eine einfache Möglichkeit wie Ich feststellen kann wann ein View das erste mal gezeigt wird ?
Ich habe das schon bei einigen APPs gesehen, diese starten eine Animation wenn der View praktisch gerade "reinscrollt".

Aus dem Bauch raus würde Ich in der onDraw Methode das feststellen können, oder geht das eleganter ?

Windmate HD, See you @ IO 14 , Worked on Wundercar, Glass V3, LG G Watch, Moto 360, Android TV

Antworten
Mac Systems
  • Forum-Beiträge: 1.727

21.02.2011, 13:39:36 via Website

Hab mich da wohl dumm ausgedrückt:

Ich habe z.b eine ListView in der Bilder oder was auch immer drin sind (ImageView).
Nun scrollt der User durch die Liste, wie schaffe ich es am einfachsten die ImageViews zu zoomen wenn diese Praktisch erscheinen ?

Ich würde jetzt evtl. so vorgehen, allerdings ist mir unklar wann die onDraw wirklich aufgerufen wird.

protected onDraw(...)

if(!isAlreadyScaled)
{
setAnimation(ani);
isAlreadyScaled=true;
}

Ideen dazu ?

Windmate HD, See you @ IO 14 , Worked on Wundercar, Glass V3, LG G Watch, Moto 360, Android TV

Antworten
Markus Gu
  • Forum-Beiträge: 2.644

21.02.2011, 13:41:51 via Website

im adapter weißt du ja,

wenn convertView == null, dann view erscheint das erste mal

oder meinst du was anderes?

swordiApps Blog - Website

Antworten
Mac Systems
  • Forum-Beiträge: 1.727

21.02.2011, 13:48:17 via Website

In einem Adapter würde das wohl gehen ja.
Und in einem View ? (Teste ich gerade ein wenig aus ...)

Windmate HD, See you @ IO 14 , Worked on Wundercar, Glass V3, LG G Watch, Moto 360, Android TV

Antworten
Rafael K.
  • Forum-Beiträge: 2.359

21.02.2011, 13:50:25 via Website

Markus Gursch
wenn convertView == null, dann view erscheint das erste mal
Ich erinnere mich so waaage, dass der convertView nicht von der Row in den Daten abhängt, sondern er dort auch einfach Zeilen übergibt, die zum anderen Ende rausscrollen.
So muss er immer nur soviele Views gleichzeitig im Speicher halten wie Rows sichtbar sind.

Ich denke mann kann in der Methode aber die position dazu verwenden zwischenzuspeichern welche Zeile bereits angezeigt und somit skaliert wurde.

@Mac:
Wenn du den Adapter als innere Klasse anlegst, bist du ja quasi "im View".

— geändert am 21.02.2011, 13:51:56

Antworten
Mac Systems
  • Forum-Beiträge: 1.727

21.02.2011, 14:05:57 via Website

@Mac:
Wenn du den Adapter als innere Klasse anlegst, bist du ja quasi "im View".

So Code schreibe Ich schon lange nicht mehr ;)

So als kleine Basis Klasse habe Ich das mal angelegt, es funtzt auf den ersten Blick.
Spendiert man dem ding ein setAnimation ist alles wohl perfekt. oder überschrreibt entsprechend die Konstruktoren.


public abstract class AnimatedView extends View
{

private volatile boolean wasAnimationStarted = false;

final ScaleAnimation scale = new ScaleAnimation(0, 1, 0, 1, Animation.RELATIVE_TO_SELF, 0.5f,
Animation.RELATIVE_TO_SELF, 0.5f);

public AnimatedView(final Context context, final AttributeSet attrs, final int defStyle)
{
super(context, attrs, defStyle);
}

public AnimatedView(final Context context, final AttributeSet attrs)
{
super(context, attrs);
}

public AnimatedView(final Context context)
{
super(context);
}

/*
* (non-Javadoc)
*
* @see android.view.View#onDraw(android.graphics.Canvas)
*/
@Override
protected void onDraw(final Canvas canvas)
{
if (!wasAnimationStarted)
{
scale.setDuration(1000L);
startAnimation(scale);
wasAnimationStarted = true;
}
}

}

Windmate HD, See you @ IO 14 , Worked on Wundercar, Glass V3, LG G Watch, Moto 360, Android TV

Antworten
Mac Systems
  • Forum-Beiträge: 1.727

21.02.2011, 14:45:47 via Website

Der Ansatz hat allerdings das Problem das ich wenn ich auf layout-land wechsel den wert von wasAnimationStarted speichern müsste, was an sich ginge.
Nur wie halte ich das persistieren des state generisch ? Einen Schlüssel explizit angeben wäre jetzt unschön.

Windmate HD, See you @ IO 14 , Worked on Wundercar, Glass V3, LG G Watch, Moto 360, Android TV

Antworten