FrameLayout mit runden Ecken nicht ganz rund

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • 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

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von mrt ()

  • Xcreen schrieb:

    Warum benutzt du für dein Bild kein ImageView?
    Ja, da gibt es mehrere Gründe:
    1. ImageView sagt für setForeground erst ab API 23, ich habe ab API 19
    2. Ich habe eine io.fotoapparat.CameraView instanz, welche von FrameLayout ableitet.
    3. 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.
    Ein Feedback auf Tipps ist auch schön. :P

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von jogimuc ()

  • jogimuc schrieb:

    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:

    Quellcode

    1. Call requires API level 23 (current min is 19) : android.view.View#setForeground
    mit @SuppressLint("NewApi") gibt das folgerichtig einen Crash:

    Quellcode

    1. 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)

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von mrt ()

  • Hier das Layout:

    XML-Quellcode

    1. <?xml version="1.0" encoding="utf-8"?>
    2. <android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    3. xmlns:app="http://schemas.android.com/apk/res-auto"
    4. xmlns:tools="http://schemas.android.com/tools"
    5. android:layout_width="match_parent"
    6. android:layout_height="match_parent"
    7. tools:context="CameraPreviewFragment">
    8. <android.support.constraint.ConstraintLayout
    9. android:id="@+id/fotoapparat_background_view"
    10. android:layout_width="0dp"
    11. android:layout_height="0dp"
    12. android:background="@color/colorBackground"
    13. app:layout_constraintBottom_toBottomOf="parent"
    14. app:layout_constraintEnd_toEndOf="parent"
    15. app:layout_constraintStart_toStartOf="parent"
    16. app:layout_constraintTop_toTopOf="parent">
    17. <ImageView
    18. android:id="@+id/fotoapparat_preview_view"
    19. android:layout_width="match_parent"
    20. android:layout_height="0dp"
    21. app:layout_constraintDimensionRatio="1.4"
    22. app:layout_constraintStart_toStartOf="parent"
    23. app:layout_constraintEnd_toEndOf="parent"
    24. app:layout_constraintBottom_toTopOf="@id/fotoapparat_spacer"
    25. app:layout_constraintTop_toTopOf="parent“ />
    26. <Space
    27. android:id="@+id/fotoapparat_spacer"
    28. android:layout_width="match_parent"
    29. android:layout_height="0dp"
    30. android:orientation="vertical"
    31. app:layout_constraintHeight_percent="@dimen/dim_small_layout_percentage"
    32. app:layout_constraintBottom_toTopOf="@id/fotoapparat_button_container"
    33. app:layout_constraintTop_toBottomOf="@id/fotoapparat_preview_view" />
    34. <LinearLayout
    35. android:id="@+id/fotoapparat_button_container"
    36. android:layout_width="match_parent"
    37. android:layout_height="0dp"
    38. android:layout_gravity="center"
    39. android:layout_marginStart="@dimen/border_margin"
    40. android:layout_marginTop="@dimen/default_margin"
    41. android:layout_marginEnd="@dimen/border_margin"
    42. android:layout_marginBottom="@dimen/border_margin"
    43. android:orientation="horizontal"
    44. app:layout_constraintBottom_toBottomOf="parent"
    45. app:layout_constraintEnd_toEndOf="parent"
    46. app:layout_constraintHeight_percent="@dimen/dim_small_layout_percentage"
    47. app:layout_constraintStart_toStartOf="parent"
    48. app:layout_constraintTop_toBottomOf="@id/fotoapparat_spacer"
    49. app:layout_constraintVertical_bias="0.9"
    50. app:layout_constraintWidth_percent="@dimen/dim_button_layout_percentage">
    51. </LinearLayout>
    52. </android.support.constraint.ConstraintLayout>
    53. </android.support.constraint.ConstraintLayout>
    Alles anzeigen

    Dann die Java:

    Java-Quellcode

    1. public class CameraPreviewFragment extends Fragment {
    2. private BitmapPhoto bitmapPhoto;
    3. private ImageView imageView;
    4. public CameraPreviewFragment() {
    5. }
    6. public static CameraPreviewFragment getInstance(NavigationSteps.Step step, int color) {
    7. CameraPreviewFragment cameraPreviewFragment = new CameraPreviewFragment();
    8. cameraPreviewFragment.setFragmentResourceCarrier(color, step);
    9. return cameraPreviewFragment;
    10. }
    11. @Override
    12. public View onCreateView(LayoutInflater inflater, ViewGroup container,
    13. Bundle savedInstanceState) {
    14. View view = inflater.inflate(R.layout.fragment_camera_preview, container, false);
    15. imageView = view.findViewById(R.id.fotoapparat_preview_view);
    16. return view;
    17. }
    18. @Override
    19. public void onStart() {
    20. super.onStart();
    21. if (bitmapPhoto != null) {
    22. imageView.setImageBitmap(bitmapPhoto.bitmap);
    23. imageView.setForeground(getResources().getDrawable(R.drawable.rounded_shape));
    24. }
    25. }
    26. public void setBitmapPhoto(BitmapPhoto bitmapPhoto) {
    27. this.bitmapPhoto = bitmapPhoto;
    28. }
    29. }
    Alles anzeigen
    Wie gesagt, da ich ab API 19, meckert er über die setForeground(), weil kennt diese nicht. Vorschlag seitens Android Stuio:
    1. @RequiresAPI(M)
    2. @TargetApi(M)
    3. Surround with if (VERSION.SDK_INT >= VERSION_CODES.M)
    4. 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...

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von mrt ()

  • 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.
    Ein Feedback auf Tipps ist auch schön. :P

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von jogimuc ()

  • jogimuc schrieb:

    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()


    jogiMuc schrieb:

    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.

    jogiMuc schrieb:

    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().
  • mrt schrieb:

    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.
    Ein Feedback auf Tipps ist auch schön. :P

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von jogimuc ()

  • habs auf eine sehr einfache weise gelöst:

    XML-Quellcode

    1. <?xml version="1.0" encoding="UTF-8"?>
    2. <layer-list>
    3. <item>
    4. <shape xmlns:android="http://schemas.android.com/apk/res/android"
    5. android:shape="rectangle">
    6. <solid android:color="@android:color/transparent" />
    7. <stroke
    8. android:width="@dimen/default_margin"
    9. android:color="@color/colorBackground" />
    10. <corners android:radius="24dp" />
    11. </shape>
    12. </item>
    13. <item>
    14. <shape xmlns:android="http://schemas.android.com/apk/res/android"
    15. android:shape="rectangle">
    16. <solid android:color="@android:color/transparent" />
    17. <stroke
    18. android:width="@dimen/default_margin"
    19. android:color="@color/colorBackground" />
    20. </shape>
    21. </item>
    22. </layer-list>
    Alles anzeigen

    ich habe zwei shape items,
    1. bei dem einen sind die Ecken nach außen spitz
    2. und bei dem anderen sind die innenEcken abgerundet.