web-dev-qa-db-fra.com

Image bitmap avec coins arrondis avec contour

J'ai une image avec des bords nets. enter image description here

le tile_mode.xml

<?xml version="1.0" encoding="utf-8"?>
<bitmap xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:src="@drawable/background"
    Android:tileMode="repeat">
</bitmap>

le back.xml

<?xml version="1.0" encoding="UTF-8"?>
<layer-list xmlns:Android="http://schemas.Android.com/apk/res/Android">  
       <item Android:drawable="@drawable/tile_mode" />
    <item>
        <shape>
            <solid/>
            <stroke Android:width="1dip" Android:color="#225786" />
            <corners Android:radius="10dip"/>
            <padding Android:left="0dip" Android:top="0dip" Android:right="0dip" Android:bottom="0dip" />
        </shape>
    </item> 

layout.xml

<LinearLayout
                Android:id="@+id/frame1"
                Android:background="@drawable/back"
                Android:layout_width="fill_parent"
                Android:layout_height="wrap_content">
            </LinearLayout>

Je mets l'image en tant qu'arrière-plan de cette mise en page et y dessine une bordure, mais le problème est que l'image est carrée avec des arêtes vives et que la bordure que je dessine dans le xml a des angles arrondis. Alors, comment faire l'image aussi avec des coins arrondis?

9
Goofy

C’est l’une des solutions dans laquelle vous devez make round to your main layout background et garder à l'intérieur votre imageview with your desire image:

quelque chose comme ci-dessous:

back.xml

_ {Votre image deviendra un coin arrondi} _

<?xml version="1.0" encoding="UTF-8"?> 
<shape xmlns:Android="http://schemas.Android.com/apk/res/Android" Android:shape="rectangle"> 
     <stroke Android:width="1dp" Android:color="#dd7b7a"/>
     <corners Android:bottomRightRadius="10dp" Android:bottomLeftRadius="10dp" 
     Android:topLeftRadius="10dp" Android:topRightRadius="10dp"/> 
     <solid Android:color="#dd7b7a"/>
 </shape>

tile_mode.xml

<?xml version="1.0" encoding="utf-8"?>
<bitmap xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:src="@drawable/background"
Android:tileMode="repeat" />

layout.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:orientation="vertical"
    Android:layout_width="fill_parent"
    Android:layout_height="fill_parent"
    Android:gravity="center"
    >
<LinearLayout 
     Android:padding="4dip"
    Android:orientation="vertical"
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
    Android:background="@drawable/back"
    Android:gravity="center_horizontal"
    >
<LinearLayout  
    Android:layout_width="wrap_content" 
    Android:layout_height="wrap_content" 
   Android:background="@drawable/tile_mode"
    />
</LinearLayout>  
</LinearLayout>

Mise à jour

Après avoir creusé beaucoup, je suis tombé sur une solution qui avait déjà été postée sur stackoverflow 

Changer l'image en tant qu'angle arrondi

Comment créer un ImageView pour avoir des coins arrondis

étape 1@

main.xml

 <RelativeLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
        xmlns:tools="http://schemas.Android.com/tools"
        Android:layout_width="match_parent"
        Android:layout_height="match_parent"
        Android:gravity="center"
        tools:context=".MainActivity" >

        <ImageView
            Android:id="@+id/image"
            Android:layout_width="wrap_content"
            Android:layout_height="wrap_content"
            Android:layout_centerHorizontal="true"

          />

    </RelativeLayout>

Étape 2@

Créez une fonction qui permet d’arrondir à votre bitmap en utilisant canvas.

public static Bitmap getRoundedCornerBitmap(Bitmap bitmap, int pixels) {
        Bitmap output = Bitmap.createBitmap(bitmap.getWidth(), bitmap
                .getHeight(), Config.ARGB_8888);
        Canvas canvas = new Canvas(output);

        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 output;
    }

étape 3@

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        ImageView image=(ImageView)findViewById(R.id.image);


        Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.testing);


    image.setImageBitmap(getRoundedCornerBitmap(bitmap, 20));
15
RobinHood

En fait, j'ai créé une bibliothèque qui répond exactement à vos besoins et vous n'avez pas à vous soucier de ces fichiers xml. 

https://github.com/pungrue26/SelectableRoundedImageView

Avec ce projet open-source, Vous pouvez définir différents rayons sur chaque coin et définir des bordures (largeur et couleurs) , etc. comme ci-dessous. J'espère que cela peut vous aider.

Rounded ImageView inside CardView

2
김준호

La réponse de RobinHood a fonctionné pour moi avec un changement en raison d'une erreur que je recevais à propos de l'affectation de variable.

Je devais changer de ligne:

        Paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN));

A cette ligne:

        Paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));        

Rendre mon code complet ceci:

public class MainActivity extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    requestWindowFeature(Window.FEATURE_NO_TITLE);
    this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);

    setContentView(R.layout.activity_main);

    TextView textViewTitle = (TextView) findViewById(R.id.MYTEXTIDHERE);
    textViewTitle.setText("Some Text");

    ImageButton imageButtonSetter = (ImageButton) findViewById(R.id.MYIMAGEIDHERE);
    Bitmap myBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.MYIMAGENAMEHERE);     
    imageButtonSetter.setImageBitmap(getRoundedCornerBitmap(myBitmap, 40));
}   

public static Bitmap getRoundedCornerBitmap(Bitmap bitmap, int pixels) {
    Bitmap output = Bitmap.createBitmap(bitmap.getWidth(), bitmap
            .getHeight(), Config.ARGB_8888);
    Canvas canvas = new Canvas(output);

    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(PorterDuff.Mode.SRC_IN));        
    canvas.drawBitmap(bitmap, rect, rect, Paint);

    return output;
}
2
MGM

ok essayons en dessous 

     <?xml version="1.0" encoding="utf-8"?>
 <shape
    Android:shape="rectangle" xmlns:Android="http://schemas.Android.com/apk/res/Android">
    <corners Android:radius="30dp"/>
    <stroke Android:width="2dp" Android:color="#000000"/>
</shape>

<LinearLayout
    Android:id="@+id/frame1"
    Android:background="@drawable/corner_background"
    Android:layout_width="fill_parent"
    Android:layout_height="wrap_content"
    Android:padding="5dp"
    >
    <ImageView 
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
    Android:src="@drawable/background" 
    />
</LinearLayout>
1
Bhavdip Sagar

J'ai eu un problème similaire aujourd'hui, mais mon image était une carte Google. pour ce faire, vous devez masquer les angles. Pour ce faire, vous devez créer un 9Patch comme suit:

enter image description here

et l'appliquez comme arrière-plan sur l'ensemble de votre mise en page ou sur une autre mise en page couvrant votre mise en page. Consultez le lien suivant pour plus d'informations:

Est-il possible d'implémenter des coins arrondis à un Mapfragment?

Je suis effectivement allé sur ce site: http://www.sumopaint.com/app/
et tout peint à la main, vous pouvez prendre mon exemple et changer les couleurs à votre convenance. vous auriez probablement besoin du suivant:

enter image description here

vous pouvez obtenir plus d'informations sur la création de 9Patchs dans les liens suivants:

http://radleymarx.com/blog/simple-guide-to-9-patch/

http://Android9patch.blogspot.co.il/

0
Emil Adz

Passez le bitmap original à la fonction suivante et vous obtiendrez un bitmap arrondi :). J'espère que ça aide quelqu'un. 

 public Bitmap getRoundedBitmap(Bitmap bitmap) {
        Bitmap resultBitmap;
        int originalWidth = bitmap.getWidth();
        int originalHeight = bitmap.getHeight();
        float r;

        if (originalWidth > originalHeight) {
            resultBitmap = Bitmap.createBitmap(originalHeight, originalHeight,
                    Bitmap.Config.ARGB_8888);
            r = originalHeight / 2;
        } else {
            resultBitmap = Bitmap.createBitmap(originalWidth, originalWidth,
                    Bitmap.Config.ARGB_8888);
            r = originalWidth / 2;
        }

        Canvas canvas = new Canvas(resultBitmap);

        final Paint paint = new Paint();
        final Rect rect = new Rect(ConstsCore.ZERO_INT_VALUE,
                ConstsCore.ZERO_INT_VALUE, originalWidth, originalHeight);

        Paint.setAntiAlias(true);
        canvas.drawARGB(ConstsCore.ZERO_INT_VALUE, ConstsCore.ZERO_INT_VALUE,
                ConstsCore.ZERO_INT_VALUE, ConstsCore.ZERO_INT_VALUE);
        canvas.drawCircle(r, r, r, Paint);
        Paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
        canvas.drawBitmap(bitmap, rect, rect, Paint);

        return resultBitmap;
    }
0
Saamzzz

essayez votre back.xml quelque chose comme ça.

<?xml version="1.0" encoding="UTF-8"?>

<shape xmlns:Android="http://schemas.Android.com/apk/res/Android" Android:shape="rectangle"> 
<solid Android:color="#ffffffff"/>    

<stroke Android:width="3dp"
        Android:color="#ff000000"
        />

<padding Android:left="1dp"
         Android:top="1dp"
         Android:right="1dp"
         Android:bottom="1dp"
         /> 

<corners Android:bottomRightRadius="7dp" Android:bottomLeftRadius="7dp" 
 Android:topLeftRadius="7dp" Android:topRightRadius="7dp"/> 
</shape>
0
Raj
<?xml version="1.0" encoding="utf-8"?>

<item>
    <bitmap
        Android:src="@drawable/bg_striped_img"
        Android:tileMode="repeat" />
</item>
<item Android:left="-20dp" Android:top="-20dp" Android:right="-20dp" Android:bottom="-20dp">
    <shape Android:shape="oval" >
        <stroke
            Android:width="20dp"
            Android:color="#ffffffff" />

        <solid Android:color="#00000000" />

        <size
            Android:height="120dp"
            Android:width="120dp" />
    </shape>
</item>

    <item >
    <shape Android:shape="oval" >
        <stroke
            Android:width="1dp"
            Android:color="#ff999999" />

        <solid Android:color="#00000000" />

        <size
            Android:height="120dp"
            Android:width="120dp" />
    </shape>
</item>

0
coldmn3