Yuvarlatılmış köşeli görünüm nasıl yapılır?


94

Android'de yuvarlak kenarlı bir görünüm oluşturmaya çalışıyorum. Şimdiye kadar bulduğum çözüm, köşeleri yuvarlatılmış bir şekli tanımlamak ve onu o görünümün arka planı olarak kullanmak.

İşte yaptığım şey, aşağıda verildiği gibi bir çekilebilir tanımla:

<padding
android:top="2dp"
android:bottom="2dp"/>
<corners android:bottomRightRadius="20dp"
android:bottomLeftRadius="20dp"
android:topLeftRadius="20dp"
android:topRightRadius="20dp"/>

Şimdi bunu düzenim için aşağıdaki gibi arka plan olarak kullandım:

<LinearLayout
        android:orientation="vertical"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginLeft="10dp"
        android:layout_marginRight="10dp"
        android:layout_marginBottom="10dp"
        android:clipChildren="true"
        android:background="@drawable/rounded_corner">

Bu gayet iyi çalışıyor, görünümün yuvarlak kenarlara sahip olduğunu görebiliyorum.

Ancak düzenimde pek çok başka çocuk görünümü var, örneğin bir ImageView veya a MapView. ImageViewYukarıdaki düzenin içine bir yerleştirdiğimde, görüntünün köşeleri kırpılmıyor / kırpılmıyor, bunun yerine dolu görünüyor.

Burada açıklandığı gibi çalışmasını sağlamak için başka geçici çözümler gördüm .

Ancak bir görünüm için yuvarlatılmış köşeler koymanın bir yöntemi var mı ve tüm alt görünümleri, yuvarlatılmış köşeleri olan ana görünümde yer alıyor mu?


LinearLayout'a uzanan bir Özel düzen kullanırsanız ve nesnesi oluşturulurken, bu Düzenin tüm alt öğelerini yineleyin ve bunlara yuvarlak kenarlık arka planı uygularsanız ne olur?
MysticMagicϡ

3
android.support.v7.widget.CardView bunun için bir çözüm gibi görünüyor
rocketspacer

Bu çözüm benim için çözdü, ancak alt sınıflandırma gerektiriyor: /programming/5574212/android-view-clipping
Aaron


Google'ın yeni çerçevesi var, yeni teknolojiler daha iyi [Jetpack Compose] [1] [1]: stackoverflow.com/questions/6054562/…
Ucdemir

Yanıtlar:


128

Diğer bir yaklaşım, aşağıdaki gibi özel bir düzen sınıfı yapmaktır. Bu düzen önce içeriğini ekran dışı bir bitmap'e çizer, ekran dışı bitmap'i yuvarlatılmış bir dikdörtgenle maskeler ve ardından ekran dışı bitmap'i gerçek tuval üzerine çizer.

Denedim ve işe yarıyor gibi görünüyor (en azından benim basit test olayım için). Elbette, normal bir düzene kıyasla performansı etkileyecektir.

package com.example;

import android.content.Context;
import android.graphics.*;
import android.util.AttributeSet;
import android.util.DisplayMetrics;
import android.util.TypedValue;
import android.widget.FrameLayout;

public class RoundedCornerLayout extends FrameLayout {
    private final static float CORNER_RADIUS = 40.0f;

    private Bitmap maskBitmap;
    private Paint paint, maskPaint;
    private float cornerRadius;

    public RoundedCornerLayout(Context context) {
        super(context);
        init(context, null, 0);
    }

    public RoundedCornerLayout(Context context, AttributeSet attrs) {
        super(context, attrs);
        init(context, attrs, 0);
    }

    public RoundedCornerLayout(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        init(context, attrs, defStyle);
    }

    private void init(Context context, AttributeSet attrs, int defStyle) {
        DisplayMetrics metrics = context.getResources().getDisplayMetrics();
        cornerRadius = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, CORNER_RADIUS, metrics);

        paint = new Paint(Paint.ANTI_ALIAS_FLAG);

        maskPaint = new Paint(Paint.ANTI_ALIAS_FLAG | Paint.FILTER_BITMAP_FLAG);
        maskPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR));

        setWillNotDraw(false);
    }

    @Override
    public void draw(Canvas canvas) {
        Bitmap offscreenBitmap = Bitmap.createBitmap(canvas.getWidth(), canvas.getHeight(), Bitmap.Config.ARGB_8888);
        Canvas offscreenCanvas = new Canvas(offscreenBitmap);

        super.draw(offscreenCanvas);

        if (maskBitmap == null) {
            maskBitmap = createMask(canvas.getWidth(), canvas.getHeight());
        }

        offscreenCanvas.drawBitmap(maskBitmap, 0f, 0f, maskPaint);
        canvas.drawBitmap(offscreenBitmap, 0f, 0f, paint);
    }

    private Bitmap createMask(int width, int height) {
        Bitmap mask = Bitmap.createBitmap(width, height, Bitmap.Config.ALPHA_8);
        Canvas canvas = new Canvas(mask);

        Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
        paint.setColor(Color.WHITE);

        canvas.drawRect(0, 0, width, height, paint);

        paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR));
        canvas.drawRoundRect(new RectF(0, 0, width, height), cornerRadius, cornerRadius, paint);

        return mask;
    }
}

Bunu normal bir düzen gibi kullanın:

<com.example.RoundedCornerLayout
    android:layout_width="200dp"
    android:layout_height="200dp">

    <ImageView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:src="@drawable/test"/>

    <View
        android:layout_width="match_parent"
        android:layout_height="100dp"
        android:background="#ff0000"
        />

</com.example.RoundedCornerLayout>

1
Bu düzeni, içinde yakınlaştırma işleviyle görüntü görüntüleme için kullanıyorum, ancak bu düzen yakınlaştırmaya çalıştığımda dokunma dinleyiciyi algılamıyor, bu düzene dokunma dinleyici işlevi nasıl eklenir?
Muhammad Nafian Wildana

2
Bu yöntemi kullandım ve iyi çalışıyor. Ancak düzene bir EditText koyduğumda, yazdığımda ekran güncellenmiyor. Pencereyi kapattığımda metin ekrana geliyor. Klavyeyi kapattığımda ekran güncelleniyor. Bunda herhangi bir düzeltme var mı?
Sajib Acharya

1
Recycler görünümüyle kullandığınızda bununla ilgili tek sorun, tüm öğelerin yüklenmesini beklememesidir. Ve sadece birkaç öğeyi yuvarlar. Bunun olması için bir sebep var mı?
Ahmed

2
Bu, yer tutucu geçişleri kullanan kayma kitaplığından yüklenen görüntülerle (veya aslında diğer animasyonlu alt öğelerle) çalışmaz. Alternatif bir çözümüm var ancak arka plan renginizin düz renk olmasını gerektiriyor. Bkz gist.github.com/grennis/da9f86870c45f3b8ae00912edb72e868
Greg Ennis

2
Güzel ve kullanışlı bir çözüm ama çok pahalı. Tek bir resim içeren sadece altı öğeye sahip RecyclerView, sorunsuz bir şekilde kaydırılamaz. Ve cihaz gücüne bağlı değildir (Samsung S9 veya Wileyfox Swift 2). stackoverflow.com/a/41098690/4399323 daha iyi bir cevaptır!
Valentin Yuryev

73

Veya şu şekilde kullanabilirsiniz android.support.v7.widget.CardView:

<android.support.v7.widget.CardView
    xmlns:card_view="http://schemas.android.com/apk/res-auto"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    card_view:cardBackgroundColor="@color/white"
    card_view:cardCornerRadius="4dp">

    <!--YOUR CONTENT-->
</android.support.v7.widget.CardView>

O kadar çok yol denedim ki, sorunuma en iyi çözüm seninki TEŞEKKÜRLER!
wizChen

Yükseklik kaldırılamıyor. Tasarım yükseklik gerektiriyorsa iyi çalışıyor.
Abdalrahman Shatou

1
@AbdalrahmanShatou developer.android.com/reference/android/support/v7/widget/… bunun için özellikler var. Onları "0" olarak ayarlamayı denediniz mi?
rocketspacer

5
Bir dezavantajı, <21 android api'yi desteklememesi
Itai Spector

52

shape.xml

<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">

    <solid android:color="#f6eef1" />

    <stroke
        android:width="2dp"
        android:color="#000000" />

    <padding
        android:bottom="5dp"
        android:left="5dp"
        android:right="5dp"
        android:top="5dp" />

    <corners android:radius="5dp" />

</shape>

ve senin içinde düzen

<LinearLayout
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginLeft="10dp"
        android:layout_marginRight="10dp"
        android:layout_marginBottom="10dp"
        android:clipChildren="true"
        android:background="@drawable/shape">

        <ImageView
             android:layout_width="match_parent"
             android:layout_height="match_parent"
             android:src="@drawable/your image"
             android:background="@drawable/shape">

</LinearLayout>

3
@Zach: Ne şekilde işe yaramadı? Orijinal soruyu sorduğunuzda uygulamanızın nasıl çalıştığı ile aynı mı?
LarsH

2
clipChildren işe yaramaz ve görüntü görünümü yine de görünümün dışına uzanır.
Abdalrahman Shatou

1
Keşke bunun için sana bir ödül verebilseydim. Teşekkürler
Odys

3
Arka plan görüntünün içeriğinin arkasına çizileceğinden, görüntü dikdörtgen ise bu yaklaşımın işe yarayacağını düşünmüyorum. Bu, yalnızca şeffaflığı olan ve kendileri yuvarlatılmış köşeleri olan görüntülerde işe yarayabilir.
Harsha Vardhan

23

Jaap van Hengstum'un cevabı harika çalışıyor ancak bunun pahalı olduğunu düşünüyorum ve bu yöntemi örneğin bir Button üzerine uygularsak, görünüm bir bitmap olarak işlendiği için dokunma efekti kayboluyor.

Benim için en iyi ve en basit yöntem, şu şekilde görünüm üzerine bir maske uygulamaktan ibarettir:

@Override
protected void onSizeChanged(int width, int height, int oldWidth, int oldHeight) {
    super.onSizeChanged(width, height, oldWidth, oldHeight);

    float cornerRadius = <whatever_you_want>;
    this.path = new Path();
    this.path.addRoundRect(new RectF(0, 0, width, height), cornerRadius, cornerRadius, Path.Direction.CW);
}

@Override
protected void dispatchDraw(Canvas canvas) {
    if (this.path != null) {
        canvas.clipPath(this.path);
    }
    super.dispatchDraw(canvas);
}

Bu nasıl kullanılır?
Maksim Kniazev

@MaksimKniazev İstediğiniz düzenin bir alt sınıfını oluşturun (örneğin: FrameLayout), ardından bu iki yöntemi bu alt sınıfa yapıştırın ve '<whatever_you_want>' yerine istediğiniz köşe yarıçapı değerini (örneğin kaynaklardan) değiştirin. Bu kadar. Senin için yeterince açık mı yoksa bir örneğe mi ihtiyacın var?
Eşek

Çok teşekkür ederim, RecyclerView için gerçekten daha iyi çalışıyor!
Valentin Yuryev

18

Düzene dokunma dinleyicileri eklerken sorun yaşıyorsanız. Bu düzeni ana sayfa düzeni olarak kullanın.

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.RectF;
import android.graphics.Region;
import android.util.AttributeSet;
import android.util.DisplayMetrics;
import android.util.TypedValue;
import android.view.View;
import android.widget.FrameLayout;

public class RoundedCornerLayout extends FrameLayout {
    private final static float CORNER_RADIUS = 6.0f;
    private float cornerRadius;

    public RoundedCornerLayout(Context context) {
        super(context);
        init(context, null, 0);
    }

    public RoundedCornerLayout(Context context, AttributeSet attrs) {
        super(context, attrs);
        init(context, attrs, 0);
    }

    public RoundedCornerLayout(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        init(context, attrs, defStyle);
    }

    private void init(Context context, AttributeSet attrs, int defStyle) {
        DisplayMetrics metrics = context.getResources().getDisplayMetrics();
        cornerRadius = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, CORNER_RADIUS, metrics);
        setLayerType(View.LAYER_TYPE_SOFTWARE, null);
    }


    @Override
    protected void dispatchDraw(Canvas canvas) {
        int count = canvas.save();

        final Path path = new Path();
        path.addRoundRect(new RectF(0, 0, canvas.getWidth(), canvas.getHeight()), cornerRadius, cornerRadius, Path.Direction.CW);
        canvas.clipPath(path, Region.Op.REPLACE);

        canvas.clipPath(path);
        super.dispatchDraw(canvas);
        canvas.restoreToCount(count);
    }


}

gibi

<?xml version="1.0" encoding="utf-8"?>
<com.example.view.RoundedCornerLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <RelativeLayout
        android:id="@+id/patentItem"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:paddingRight="20dp">
        ... your child goes here
    </RelativeLayout>
</com.example.view.RoundedCornerLayout>

2
Ekranda birçok kez ekranın tekrar tekrar çizilmesine neden olan çok fazla animasyon yoksa iyi çalışır; çünkü performansı kritik bir şekilde yavaşlatacaktır. Etkili bir yuvarlak köşe yöntemine sahip olan kart görünümünü denemelisiniz (kırpma yolunu veya canvas.drawRoundRect - API 17'nin altında kötü, ancak porterFilterDuffColor kullanın)
Nguyen Tan Dat

18

Adlı bir xml dosyası oluşturun round.xmliçinde drawableklasöre ve bu içeriği yapıştırın:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle">
  <solid android:color="#FFFFFF" />
  <stroke android:width=".05dp" android:color="#d2d2d2" />
  <corners android:topLeftRadius="5dp" android:topRightRadius="5dp" android:bottomRightRadius="5dp" android:bottomLeftRadius="5dp"/>
</shape>

sonra herhangi bir öğede round.xmlolduğu gibi backgroundkullanın. O zaman size yuvarlatılmış köşeler verecektir.


9

Android L'de, bu efekti elde etmek için View.setClipToOutline'ı kullanabileceksiniz . Önceki sürümlerde, rastgele bir ViewGroup içeriğini belirli bir şekilde kırpmanın bir yolu yoktur.

Size benzer bir etki sağlayacak bir şey düşünmeniz gerekecek:

  • ImageView'da yalnızca yuvarlatılmış köşelere ihtiyacınız varsa, görüntüyü arka plan olarak kullandığınız şeklin üzerine 'boyamak' için bir gölgelendirici kullanabilirsiniz. Bir örnek için bu kitaplığa bir göz atın .

  • Her çocuğun kırpılmasına gerçekten ihtiyacın varsa, belki de düzenini başka bir şekilde görebilirsin? Kullandığınız renkte bir arka plan ve ortasında yuvarlak bir 'delik' olan biri mi? Aslında, onDraw yöntemini geçersiz kılarak her alt öğenin üzerine bu şekli çizen özel bir ViewGroup oluşturabilirsiniz.


4

Aşağıdaki kodla çekilebilir klasörünüzün altında bir xml dosyası oluşturun. (Oluşturduğum dosyanın adı rounded_corner.xml)

rounded_corner.xml

    <?xml version="1.0" encoding="utf-8"?>
    <shape
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:shape="rectangle">

        <!-- view background color -->
        <solid
            android:color="#a9c5ac" >
        </solid>

        <!-- view border color and width -->
        <stroke
            android:width="3dp"
            android:color="#1c1b20" >
        </stroke>

        <!-- If you want to add some padding -->
        <padding
            android:left="4dp"
            android:top="4dp"
            android:right="4dp"
            android:bottom="4dp"    >
        </padding>

        <!-- Here is the corner radius -->
        <corners
            android:radius="10dp"   >
        </corners>
    </shape>

Ve bunu drawable, backgroundyuvarlatılmış köşe kenarlığını korumak istediğiniz görünüme koruyun. Bir süre tutalımLinearLayout

    <LinearLayout android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:background="@drawable/rounded_corner"
            android:layout_centerInParent="true">

            <TextView android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:text="Hi, This layout has rounded corner borders ..."
                android:gravity="center"
                android:padding="5dp"/>

    </LinearLayout>

3

bu öğreticiyi ve altındaki tüm tartışmaları izleyin - http://www.curious-creature.org/2012/12/11/android-recipe-1-image-with-rounded-corners/

Android UI araç setinin önde gelen geliştiricilerinden biri olan Guy Romain tarafından yazılan bu gönderiye göre, yuvarlak köşeli bir kap (ve tüm çocuk görüşleri) yapmak mümkündür, ancak bunun çok pahalı olduğunu (performanslarından dolayı) açıkladı. işleme sorunları).

Onun gönderisine göre gitmenizi tavsiye ederim ve eğer yuvarlatılmış köşeler istiyorsanız, o zaman ImageViewbu yazıya göre yuvarlatılmış köşeler uygulayın . daha sonra, herhangi bir arka plana sahip bir kabın içine yerleştirebilir ve istediğiniz etkiyi elde edersiniz.

Ben de sonunda bunu yaptım.


3

Şöyle kullanabilirsiniz androidx.cardview.widget.CardView:

<androidx.cardview.widget.CardView
xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"       
        app:cardCornerRadius="@dimen/dimen_4"
        app:cardElevation="@dimen/dimen_4"
        app:contentPadding="@dimen/dimen_10">

       ...

</androidx.cardview.widget.CardView>

VEYA

shape.xml

<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">

    <solid android:color="#f6eef1" />

    <stroke
        android:width="2dp"
        android:color="#000000" />

    <padding
        android:bottom="5dp"
        android:left="5dp"
        android:right="5dp"
        android:top="5dp" />

    <corners android:radius="5dp" />

</shape>

ve senin içinde düzen

<LinearLayout
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@drawable/shape">

        ...

</LinearLayout>

3

CardViewAndroid Studio 3.0.1 yılında API 27'de benim için çalıştı. colorPrimaryBaşvuruldu res/values/colors.xmldosya ve sadece bir örnektir. Bunun layout_width'i 0dpiçin ebeveynin genişliğine kadar uzar . Kısıtlamaları ve genişliği / yüksekliği ihtiyaçlarınıza göre yapılandırmanız gerekir.

<android.support.v7.widget.CardView
    android:id="@+id/cardView"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    app:cardCornerRadius="4dp"
    app:cardBackgroundColor="@color/colorPrimary">

    <!-- put your content here -->

</android.support.v7.widget.CardView>

3

Malzeme Bileşenleri Kitaplığı Viewile yuvarlatılmış köşeli bir yapmanın en iyi yolu ,MaterialShapeDrawable .

Özel yuvarlak köşelere sahip bir ShapeAppearanceModel oluşturun:

ShapeAppearanceModel shapeAppearanceModelLL1 = new ShapeAppearanceModel()
        .toBuilder()
        .setAllCorners(CornerFamily.ROUNDED,radius16)
        .build();

Oluşturun MaterialShapeDrawable:

MaterialShapeDrawable shapeDrawableLL1 = new MaterialShapeDrawable(shapeAppearanceModeLL1);

Koyu tema için ayrıca bir elevationOverlay uygulamak istiyorsanız şunu kullanın:

MaterialShapeDrawable shapeDrawableLL1 = MaterialShapeDrawable.createWithElevationOverlay(this, 4.0f);
shapeDrawableLL1.setShapeAppearanceModel(shapeAppearanceModelLL1);

İsteğe bağlı: şekle uygulama Arka plan rengi ve kontur çizilebilir

shapeDrawableLL1.setFillColor(
       ContextCompat.getColorStateList(this,R.color...));
 shapeDrawableLL1.setStrokeWidth(2.0f);
 shapeDrawableLL1.setStrokeColor(
       ContextCompat.getColorStateList(this,R.color...));

Son olarak, shapeDrawable'ı sizin LinearLayout(veya başka bir görünümde) arka plan olarak uygulayın :

LinearLayout linearLayout1= findViewById(R.id.ll_1);
ViewCompat.setBackground(linearLayout1,shapeDrawableLL1);

görüntü açıklamasını buraya girin


2

Jaap van Hengstum'un cevabından farkı:

  1. Kullanım BitmapShader yerine maske bitmap.
  2. Yalnızca bir kez bitmap oluşturun.
public class RoundedFrameLayout extends FrameLayout {
    private Bitmap mOffscreenBitmap;
    private Canvas mOffscreenCanvas;
    private BitmapShader mBitmapShader;
    private Paint mPaint;
    private RectF mRectF;

    public RoundedFrameLayout(Context context) {
        super(context);
        init();
    }

    public RoundedFrameLayout(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    public RoundedFrameLayout(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init();
    }

    private void init() {
        setWillNotDraw(false);
    }

    @Override
    public void draw(Canvas canvas) {
        if (mOffscreenBitmap == null) {
            mOffscreenBitmap = Bitmap.createBitmap(canvas.getWidth(), canvas.getHeight(), Bitmap.Config.ARGB_8888);
            mOffscreenCanvas = new Canvas(mOffscreenBitmap);
            mBitmapShader = new BitmapShader(mOffscreenBitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);
            mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
            mPaint.setShader(mBitmapShader);
            mRectF = new RectF(0f, 0f, canvas.getWidth(), canvas.getHeight());
        }
        super.draw(mOffscreenCanvas);

        canvas.drawRoundRect(mRectF, 8, 8, mPaint);
    }
}

2
public class RoundedCornerLayout extends FrameLayout {
    private double mCornerRadius;

    public RoundedCornerLayout(Context context) {
        this(context, null, 0);
    }

    public RoundedCornerLayout(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public RoundedCornerLayout(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        init(context, attrs, defStyle);
    }

    private void init(Context context, AttributeSet attrs, int defStyle) {
        DisplayMetrics metrics = context.getResources().getDisplayMetrics();
        setLayerType(View.LAYER_TYPE_SOFTWARE, null);
    }

    public double getCornerRadius() {
        return mCornerRadius;
    }

    public void setCornerRadius(double cornerRadius) {
        mCornerRadius = cornerRadius;
    }

    @Override
    public void draw(Canvas canvas) {
        int count = canvas.save();

        final Path path = new Path();
        path.addRoundRect(new RectF(0, 0, canvas.getWidth(), canvas.getHeight()), (float) mCornerRadius, (float) mCornerRadius, Path.Direction.CW);
        canvas.clipPath(path, Region.Op.REPLACE);

        canvas.clipPath(path);
        super.draw(canvas);
        canvas.restoreToCount(count);
    }
}

1

Sağladığınız eğitici bağlantısı, alt öğelerinizin layout_width ve layout_height özelliklerini match_parent olarak ayarlamanız gerektiğini öneriyor gibi görünüyor.

<ImageView
    android:layout_width="match_parent"
    android:layout_height="match_parent">

1

Com.google.android.material kullanarak yuvarlak köşe görüntüsü oluşturmak için: material: 1.2.0-beta01

 float radius = context.getResources().getDimension(R.dimen.border_radius_hug);
    shapeAppearanceModel = new ShapeAppearanceModel()
            .toBuilder()
            .setAllCorners(CornerFamily.ROUNDED,radius)
            .build();

imageView.setShapeAppearanceModel(shapeAppearanceModel)

veya xml dosyasında kullanmak istiyorsanız:

  <com.google.android.material.imageview.ShapeableImageView
            android:id="@+id/thumb"
            android:layout_width="80dp"
            android:layout_height="60dp"
            app:shapeAppearanceOverlay="@style/circleImageView"
            />

style.xml'de şunu ekleyin:

<style name="circleImageView" parent="">
      <item name="cornerFamily">rounded</item>
      <item name="cornerSize">10%</item>
</style>

0

bu özelliği doğrusal düzeninizle deneyin,
araçlara yardımcı olacaktır : context = ". youractivity"


0
public static Bitmap getRoundedCornerBitmap(Bitmap bitmap, int pixels) {

        Bitmap roundedBitmap = Bitmap.createBitmap(bitmap.getWidth(), bitmap
                .getHeight(), Config.ARGB_8888);
        Canvas canvas = new Canvas(roundedBitmap);

        final int color = 0xff424242;
        final Paint paint = new Paint();
        final Rect rect = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight());
        final RectF rectF = new RectF(rect);
        final float roundPx = pixels;

        paint.setAntiAlias(true);
        canvas.drawARGB(0, 0, 0, 0);
        paint.setColor(color);
        canvas.drawRoundRect(rectF, roundPx, roundPx, paint);

        paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN));
        canvas.drawBitmap(bitmap, rect, rect, paint);

        return roundedBitmap;
    }

0

Belirli bir köşeyi yuvarlamak istemeniz durumunda.

fun setCorners() {
        
        val mOutlineProvider = object : ViewOutlineProvider() {
            override fun getOutline(view: View, outline: Outline) {

                val left = 0
                val top = 0;
                val right = view.width
                val bottom = view.height
                val cornerRadiusDP = 16f
                val cornerRadius = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, cornerRadiusDP, resources.displayMetrics).toInt()

                // all corners
                outline.setRoundRect(left, top, right, bottom, cornerRadius.toFloat())

                /* top corners
                outline.setRoundRect(left, top, right, bottom+cornerRadius, cornerRadius.toFloat())*/

                /* bottom corners
                outline.setRoundRect(left, top - cornerRadius, right, bottom, cornerRadius.toFloat())*/

                /* left corners
                outline.setRoundRect(left, top, right + cornerRadius, bottom, cornerRadius.toFloat())*/

                /* right corners
                outline.setRoundRect(left - cornerRadius, top, right, bottom, cornerRadius.toFloat())*/

                /* top left corner
                outline.setRoundRect(left , top, right+ cornerRadius, bottom + cornerRadius, cornerRadius.toFloat())*/

                /* top right corner
                outline.setRoundRect(left - cornerRadius , top, right, bottom + cornerRadius, cornerRadius.toFloat())*/

                /* bottom left corner
                outline.setRoundRect(left, top - cornerRadius, right + cornerRadius, bottom, cornerRadius.toFloat())*/

                /* bottom right corner
                outline.setRoundRect(left - cornerRadius, top - cornerRadius, right, bottom, cornerRadius.toFloat())*/

            }
        }

        myView.apply {
            outlineProvider = mOutlineProvider
            clipToOutline = true
        }
    }

-1

Dikdörtgen ile xml'de şekil kullanın. Alt veya üst yarıçapın özelliğini istediğiniz gibi ayarlayın. Sonra bu xml'yi görünümünüze arka plan olarak uygulayın .... veya ... bunu koddan yapmak için degradeleri kullanın.


Bunu zaten yaptım, ancak daha iyi bir yöntem olup olmadığını mı bilmek istiyorum?
Zach

Talep eden, sorusunda bu yaklaşımı denemekten zaten bahsetti.
Michael Krause
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.