Gif Bilder onClick 1 mal abspielen und wieder stoppen

  • Antworten:18
  • OffenNicht stickyNicht beantwortet
  • Forum-Beiträge: 56

02.09.2018, 11:27:54 via Website

Hallo,
ich hab ein Problem und vielleicht könnt ihr mir ja dabei helfen.

Ich möchte ein Gif Bild ( Bild welches sich bewegt, bzw. ein kleines sich wiederholendes Video ist) in meine App mit einbauen. Ich würde gerne machen das es bei onClick einmal läuft und wieder stoppt.

Ich hab viel im Internet geschaut und jeder schreibt irgendwie was anderes. Ich wollte es erst in ein ImageView packen und ich hab mit dem ImageView auch Sachen probiert damit es das Gif abspielt aber wollte alles nicht so klappen.

Hat da vielleicht jemand eine Idee?

Schonmal danke im voraus :)

Diskutiere mit!
  • Forum-Beiträge: 56

02.09.2018, 14:18:50 via Website

Ja schon, aber da ist gar nichts erklärt zu (bitmapData) (setBytes) und zu start und stop animation. Das wird bei mir alles immer rot angezeigt.

Hilfreich?
Diskutiere mit!
  • Forum-Beiträge: 483

02.09.2018, 14:38:58 via Website

Hallo hast du auch diese Zeilen beachtet?

dependencies {
  compile 'com.felipecsl:gifimageview:2.2.0'
}

Das musst du in dein Gradle File einfügen .
besser ist aber ab AS 3.x

implementation 'com.felipecsl:gifimageview:2.2.0'

Danach machst du ein Gradle sync.

import com.felipecsl.gifimageview.library.GifImageView;
und der Daten Typ ist "GifImageView"

Ansonsten schaue dir die Main Activity im Quellcode an.

— geändert am 02.09.2018, 15:01:39

Hilfreich?
Diskutiere mit!
  • Forum-Beiträge: 56

02.09.2018, 16:50:06 via Website

Erklärt immer noch nicht was ich mit (bitmapData) (setBytes) und zu start und stop animation machen soll.

So wie es dargestellt ist, ist das ja die Method

@Override protected void onStart() {
super.onStart();
gifView.startAnimation();
}

@Override protected void onStop() {
super.onStop();
gifView.stopAnimation();
}

aber woher weiß er welches Bild er ins ImageView packen soll? Ist wohl das hier:

gifView = findViewById(R.id.gifImageView);
gifView.setBytes(bitmapData);

dafür müsste ich wissen was setBytes und bitmapData zu bedeuten hat oder was das machen soll? Weil das ist immer rot.

Und gifView.startAnimation(); und gifView.stopAnimation(); wird mir auch immer rot angezeigt. Wenn onStart() und onStop() was machen würden, könnte ich ja die Method aufrufen bei onClick aber funktioniert nicht? Irgendwelche Ideen?

Hilfreich?
Diskutiere mit!
  • Forum-Beiträge: 483

02.09.2018, 17:12:45 via Website

gifView = findViewById(R.id.gifImageView);
Ist der Bezug auf das imageView zum XML layout. Im XML musst du auch das gitimageview benutzen . Schaue dies das layout im Beispiel an. Ich denke du kannst da auch im XML ein sours angeben wie bei einem normalen imageview.

gifView.setBytes(bitmapData);
Damit würdest du ein bitmap übergeben .kannst aber auch andere Quellen benutzen. Ressourcen zb.

Hilfreich?
Diskutiere mit!
Pascal P.
  • Mod
  • Blogger
  • Forum-Beiträge: 10.171

02.09.2018, 17:26:04 via Website

Es ist doch auch eine beispiel Activity angegeben...
https://github.com/felipecsl/GifImageView/blob/master/app/src/main/java/com/felipecsl/gifimageview/app/MainActivity.java

@Jockel: Die View ist primitiv gebaut, die akzeptiert das Gif nur als ByteArray, keine Ressource etc... (Standardmethoden der ImageView sind nicht überschrieben worden, daher der verdacht...)

@TE: Du musst dein Gif halt vorher in ein Bytearray umwandeln:
https://www.mkyong.com/java/how-to-convert-bufferedimage-to-byte-in-java/

und Bild zuweisen dann mittels setBytes danach dann starten oder auf onklick etc. starten.

LG Pascal //It's not a bug, it's a feature. :) ;)

Hilfreich?
Diskutiere mit!
  • Forum-Beiträge: 483

02.09.2018, 17:52:55 via Website

Danke @Pascal so genau habe ich mir den Quellcode der View nicht angesehen. Habe nur gesehen das sie von imageview erbt. Da sind die Methoden zwar vorhanden aber eben nicht überschrieben.
Ok danke für den tip schaue mir den Quellcode das nächste mal genauer intensiver an.
J.

— geändert am 02.09.2018, 17:53:46

Hilfreich?
Diskutiere mit!
  • Forum-Beiträge: 56

02.09.2018, 19:34:45 via Website

Hilft mir jetzt auch nicht so weiter, treten wieder neue Probleme auf, nämlich was ist BufferedImage und ImageIO, das kann ich nicht importieren und wird rot angezeigt als Fehler.

Hilfreich?
Diskutiere mit!
Pascal P.
  • Mod
  • Blogger
  • Forum-Beiträge: 10.171

02.09.2018, 20:05:20 via App

Vielleicht solltest du auch mal überlegen was der Code tut anstatt diesen einfach nur zu kopieren...

ImageIO ist für Java Desktop, nicht für Android.
Das Bitmap Objekt müsstest du aus den Ressourcen laden...
Das beispiel sollte einfsch nur Zeigen wie du ein BuffereeImage zu einem ByteArray kommst.
Das einlesen des Bildes aus den Ressourcen fehlt dann noch.
Sollte das Bild aus dem Inet sein, kannst du das Beispiel von Github auch direkt übernehmen.

— geändert am 02.09.2018, 20:06:07

LG Pascal //It's not a bug, it's a feature. :) ;)

Hilfreich?
Diskutiere mit!
  • Forum-Beiträge: 56

02.09.2018, 20:31:02 via Website

Ich überlege ja schon wofür die Sachen sind aber wird mir manchmal nicht so klar wenn mann das nicht kennt ist das schwer.

Und ne aus dem Inet will ich das nicht, wenn aus den Resourcen. Das muss ja inmer bei onClick laufen, da ist das blöd wenn man dann auch immer ne internet verbindung benötigt.

Hilfreich?
Diskutiere mit!
  • Forum-Beiträge: 56

02.09.2018, 22:15:00 via Website

Ja hat schon ein bisschen geholfen, also mein Code sieht jetzt so aus und das einzige was noch rot ist ist dieses ImageIO, wofür das ist hab ich echt keine Ahnung, jemand hat hier geschrieben das ist für Java Desktop aber wie bekomme ich das weg beziehungsweise muss ich was damit machen?

public class MainActivityBild extends AppCompatActivity implements View.OnClickListener {

int go = 0;

GifImageView gifImageview;
Button Button1;

@Override
protected void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main_bild);

    Button1 = findViewById(R.id.button1);
    Button1.setOnClickListener(this);


    gifImageview = (GifImageView) findViewById(R.id.gifImageView);

public static class ImageTest {

   public static void main(String[] args) {


    try {

     GifImageView gifImageView = ImageIO.read(new File("C:\\Users\\AndroidStudioProjects\\Bild\\app\\src\\main\\res\\drawable\\coinflip.gif"));
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
       ImageIO.write(gifImageView, "gif", baos);
        baos.flush();
        byte[] imageInByte = baos.toByteArray();
        gifImageView.setBytes(imageInByte);
        baos.close();
    }

     catch (IOException e) {
        System.out.println(e.getMessage());
    }

   }

}

public void onClick(View view){
go++;
if(go > 0) {
onStart();
}
if(go > 1){
onStop();
go--;
}

}
@Override protected void onStart() {
    super.onStart();
    gifImageview.startAnimation();

}

@Override protected void onStop() {
    super.onStop();
    gifImageview.stopAnimation();

}

}
Hilfreich?
Diskutiere mit!
  • Forum-Beiträge: 483

02.09.2018, 22:33:53 via Website

Hi wer dir das geschrieben hat war Pascal.
Er meinte damit das die klasse nicht in Android vorhanden ist.
Ich würde dir empfehlen mal danach zu googlen damit du weist was die Methode macht auf einem Desktop Rechner. Wenn du weisst was der Code macht kannst du dir auch eine Variante suchen wie du es in Android realisieren kannst. In dem Beispiel von mir wird es doch schon recht gut erklärt.

Versuche den Code zu verstehen und nicht nur abschreiben.
Hier scheinst du an die Grenzen von Copy past gekommen zu sein.

Nur noch eins innerhalb einer Methode kann man keine neue Klasse erstellen.

Ich denke das du dir die Grundlagen von Java nochmal anschaust

Hilfreich?
Diskutiere mit!
  • Forum-Beiträge: 483

03.09.2018, 05:24:41 via Website

Ergänzend möchte ich noch bemerken das du es noch nicht verstanden hast was onStop, onStart ist und das man diese Methoden nicht selber aufrufen kann soll. Sage nur Aktivity lifecycle.

Auch gibt es in einer Aktivity keine Methode main.
Das hast du ohne den Code verstanden zu haben einfach kopiert.

Auch scheinst du noch einige Defizite in Java zu haben. Sonst würdest du solche Fehler wie eine innere Klasse in einer Methode zu erstellen nicht machen. Und noch mit der Main Methode das zeigt das du leider nichts verstanden hast.

Das alles zeigt mir das du erstmal Grundlagen lernnen solltest. Dafür ist das Forum leider nicht da.
Bei speziellen einzelnen Fragen helfen wir gern nur hier sind soviele Fehler und Defizite das würde den Rahmen des Forums sprengen.

LG. J.

— geändert am 03.09.2018, 05:50:50

Hilfreich?
Diskutiere mit!
  • Forum-Beiträge: 56

03.09.2018, 06:52:00 via Website

Ja ich hab defizite in Java, und ich hab im Internet nach ImageIO gesucht, hat mich aber nicht wirklich weiter gebracht. Ich hab halt niemanden der mir das bei bringt. Ich versuch mir immer Sachen zu kopieren und dann umzuschreiben wenn es geht aber wenn ihr mir nicht helfen wollt, pech, schreibt sowie so immer nur ihr beide und ihr seit nicht wirklich gute Helfer, ihr sagt immer nur schau hier schau da. Dann schreib ich halt in ein anderes Forum.

Hilfreich?
Diskutiere mit!
  • Forum-Beiträge: 483

03.09.2018, 07:03:44 via Website

Dann Kauf dir mal ein AnfängerBuch über Java und Android.

ihr beide und ihr seit nicht wirklich gute Helfer

Das ist nicht fair, da könnt ich auch sagen es liegt am Schüler.

Dann schreib ich halt in ein anderes Forum.

Das ist deine Entscheidung. Nur ob es da besser ist? Deine Lücken musst du schon selber schliesen.

Jetzt hier die beleidigte Leberwurst zu spielen ist der falsche Weg, und die Schuld den andern zu zuschreiben. Denke mal darüber nach.

http://openbook.rheinwerk-verlag.de/javainsel9/javainsel_20_006.htm

— geändert am 03.09.2018, 07:18:12

Hilfreich?
Diskutiere mit!
  • Forum-Beiträge: 483

03.09.2018, 07:56:11 via Website

Im Übrigen bin ich mir nicht sicher ob du mit dieser Lib dein Ziel das Gif nur ein mal abzuspielen erreichst. Denn mit startAnimation(), stopAnimation() wird es zwar gestartet und gestoppt aber das Stoppen eben nicht genau nach einen Zyklus was du ja willst. Sonder dann wenn du es ausführst. Das ist wie bei einem Player wo du einfach an einer x beliebigen stelle stoppst. Dazu müsstest du sicherlich recht tief in die Lib eingreifen das wird wohl zu schwer sein für dich.

Eine andere Möglichkeit währe ein kleine Video zu benutzen und dieses zb. mit den Mediaplayer abzuspielen.

https://developer.android.com/guide/topics/media/mediaplayer
https://developer.android.com/reference/android/media/MediaPlayer

— geändert am 03.09.2018, 08:05:55

Hilfreich?
Diskutiere mit!
  • Forum-Beiträge: 56

06.09.2018, 16:38:15 via Website

Das mit dem Media Player hab ich auch schon überlegt aber noch keine Zeit gehabt aber mit start und stop müsste das doch klappen wenn ich dazwischen etwas einbaue das stop erst nach einer bestimmten Zeit startet und wenn das so nicht funktioniert dann vielleicht mit asyntask.

Hilfreich?
Diskutiere mit!

Empfohlene Artikel