J'ai une image avec des bords nets.
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?
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));
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.
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;
}
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>
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:
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:
vous pouvez obtenir plus d'informations sur la création de 9Patchs dans les liens suivants:
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;
}
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>
<?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>