FrameLayout mit runden Ecken nicht ganz rund

  • Hallo Leute,

    ich habe ein FrameLayout in welchem ich ein Bild zeige. Dabei möchte ich die Ecken abrunden.. Dazu gehe ich ähnlich vor wie hier

    Da ich aber ein bild zeige, habe ich als setBackground() das Bild und als setForeground() die shape mit den abgerundeten Ecken.. da funzt nur zur hälfte.. Die Ecken werden auf den ersten Blick abgerundet, jedoch sieht man die Ecken dann doch noch.. siehe


    Jemand eine Idee? Bin für hinweise Dankbar.

    Mfg MrT

    Einmal editiert, zuletzt von mrt (15. November 2018 um 12:28)

  • Warum benutzt du für dein Bild kein ImageView?

    Ja, da gibt es mehrere Gründe:

    • ImageView sagt für setForeground erst ab API 23, ich habe ab API 19
    • Ich habe eine io.fotoapparat.CameraView instanz, welche von FrameLayout ableitet.
    • Bei dem CameraView habe ich das shape schon drübergelegt. Ich möchte dann das aufgenommene Bild genauso anzeigen wie es in der CameraView zu sehen war.
  • hallo
    verstehe ich nicht wenn die kamera ein Bild gemacht hat, hast du doch auch die Datei und das kansst du auch in deinem ImageView anzeigen und das geht auch mit api19. Lade die Datei in ein Bitmap und gib es dem ImageView.

    3 Mal editiert, zuletzt von nono124 (16. November 2018 um 09:22)

  • und das geht auch mit api19. Lade die Datei in ein Bitmap und gib es dem ImageView.

    Wenn ich die CameraView in ein ImageVIew ändere srteht da:

    Code
    Call requires API level 23 (current min is 19) : android.view.View#setForeground

    mit @SuppressLint("NewApi") gibt das folgerichtig einen Crash:

    Code
    java.lang.NoSuchMethodError: No virtual method setForeground(Landroid/graphics/drawable/Drawable;)V in class Landroid/widget/ImageView; or its super classes (declaration of 'android.widget.ImageView' appears in /system/framework/framework.jar)

    Einmal editiert, zuletzt von mrt (16. November 2018 um 13:36)

  • Ich habe gedacht das dir die Kamera das Bild als Datei oder bitmap überigiebt.
    Klar wenn die Cam es dir nur in ein framelyout einblendet kannst du das natürlich nicht ändern. Du könntest es arber vom Layout capshen.

    Zeige mal etwas von deinen Code.

  • Hier das Layout:


    Dann die Java:

    Wie gesagt, da ich ab API 19, meckert er über die setForeground(), weil kennt diese nicht. Vorschlag seitens Android Stuio:

    • @RequiresAPI(M)
    • @TargetApi(M)
    • Surround with if (VERSION.SDK_INT >= VERSION_CODES.M)
    • Supress @SupressLint("NewApi")

    Nummer 4 führt zum obigen Crash auf API zwischen 19 und 23.
    Auf neuen Geräten tut sich da nicht wirklich was ändern...

    Einmal editiert, zuletzt von mrt (19. November 2018 um 08:27)

  • Zitat
    Spoiler anzeigen

    IP

    Hallo
    Frage zum Code.
    Was ist BitmapPhoto? Kenne ich nicht muss eine eigene Klasse sein. Wird mit " .bitmap" auch wirklich ein Bitmap daraus?
    Wie sieht es aus wenn du das forderground mal weg läßt wird da ein Bild angezeigt?

    In welches Layout wird denn das Bild von der Cam eingeblendet?

    Ansonsten wird dir wohl nichts anderes übrig bleiben die android Version abzufragen und entweder mit Vordergrund oder ohne zu arbeiten.
    Bei API 19 wirst du wohl selber die runden ecken vielleicht durch Transparenz auf dem Bitmat erzeugen müssen bevor du es anzeigst.

    Einmal editiert, zuletzt von nono124 (19. November 2018 um 09:57)

  • Was ist BitmapPhoto? Kenne ich nicht muss eine eigene Klasse sein. Wird mit " .bitmap" auch wirklich ein Bitmap daraus?

    BitmapPhoto ist ein Objekt von io.fotoapparat, wird geliefert bei whenDone()


    Wie sieht es aus wenn du das forderground mal weg läßt wird da ein Bild angezeigt?

    Ohne setForeground sieht das Bild ganz normal, mit Ecken aus.

    Zitat von jogiMuc

    In welches Layout wird denn das Bild von der Cam eingeblendet?

    das LiveBild? Es ist ein andere Fragment vorher. Das klappt das auch wunderbar mit CameraView.setForeground().

  • das LiveBild? Es ist ein andere Fragment vorher. Das klappt das auch wunderbar mit CameraView.setForeground().

    dann zeige uns doch mal wie das bei dem Live Bild aus sieht. Ich meine Layout und in Java.
    denn wenn dort das Fordergund geht muss es auch in deiner Klasse gehen.

    Oder ist das eine Lib die ihre eigenene Gradle fiele hat?

    Ps. mal noch eine Frage wie sieht den dein Fordergound Drawable aus "R.drawable.rounded_shape" .
    eigentlich müsste das ein Drawable sein und kein Xml Shape sein . Das müsste in den Ecken eine Farbe Haben und in der Mitte Transparenz, wenn du das als Maske über das Bild Legen willst. Um so Runde Ecken zu bekommen.


    setForeground

    added in API level 1 public void setForeground (Drawable foreground) Supply a Drawable that is to be rendered on top of all of the content in the view.

    2 Mal editiert, zuletzt von nono124 (19. November 2018 um 18:24)

  • habs auf eine sehr einfache weise gelöst:


    ich habe zwei shape items,

    • bei dem einen sind die Ecken nach außen spitz
    • und bei dem anderen sind die innenEcken abgerundet.

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!