J'essaie d'implémenter une sous-classe LinearLayout qui se dessine avec des coins arrondis. De mes recherches, j'ai mis setWillNotDraw(false)
et substitué onDraw()
pour dessiner un rectangle arrondi dans la toile:
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
int sc = canvas.saveLayer(0, 0, getWidth(), getHeight(), drawPaint, Canvas.MATRIX_SAVE_FLAG | Canvas.CLIP_SAVE_FLAG | Canvas.HAS_ALPHA_LAYER_SAVE_FLAG
| Canvas.FULL_COLOR_LAYER_SAVE_FLAG | Canvas.CLIP_TO_LAYER_SAVE_FLAG);
canvas.drawRoundRect(bounds, mCornerRadius, mCornerRadius, roundPaint);
canvas.restoreToCount(sc);
}
où:
drawPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
drawPaint.setColor(0xffffffff);
drawPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN));
roundPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
roundPaint.setColor(0xffffffff);
DST_IN
semble être la bonne option ici (selon l'exemple APIDemos), mais la zone devant être transparente (celle arrondie) a plutôt un fond noir et les coins des enfants sont toujours visibles. Voici le résultat sur un Galaxy Nexus avec Android 4.2.2:
Des allusions?
EDIT: Voici ce que je voudrais réaliser, désolé pour la grossièreté de photoshopping :)
EDIT 2: J'ai ajouté à GitHub un exemple de projet exécutable: https://github.com/venator85/RoundClippingLayout
Merci ;)
Ce n’est pas tout à fait pareil: Romain Guy a publié un article sur le recadrage d’images sur des images à l’aide de shaders bitmap.
http://www.curious-creature.org/2012/12/11/Android-recipe-1-image-with-rounded-corners/
Essaye ça,
Disposition:-
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_width="match_parent"
Android:layout_height="match_parent">
<LinearLayout
Android:id="@+id/linearLayout"
Android:layout_width="300dp"
Android:gravity="center"
Android:layout_height="300dp"
Android:layout_centerInParent="true"
Android:background="@drawable/rounded_Edge">
<TextView
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:text="foo" />
</LinearLayout>
</RelativeLayout>
Forme (Drawable): - arrondi_Edge.xml
<shape
xmlns:Android="http://schemas.Android.com/apk/res/Android">
<solid
Android:color="@Android:color/darker_gray">
</solid>
<stroke
Android:width="0dp"
Android:color="#424242">
</stroke>
<corners
Android:topLeftRadius="100dip"
Android:topRightRadius="100dip"
Android:bottomLeftRadius="100dip"
Android:bottomRightRadius="100dip">
</corners>
</shape>
Je pourrais réaliser un LinearLayout avec des coins arrondis comme celui-ci.
Steps :
1. Créer une mise en page personnalisée
public class RoundedLayout extends LinearLayout {
private RectF rect;
private Paint paint;
public RoundedLayout(Context context) {
super(context);
init();
}
public RoundedLayout(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
private void init() {
rect = new RectF(0.0f, 0.0f, getWidth(), getHeight());
Paint = new Paint(Paint.ANTI_ALIAS_FLAG);
Paint.setColor(Color.parseColor("#7EB5D6"));
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.drawRoundRect(rect, 20, 20, Paint);
}
}
2. Utilisez-le dans la disposition principale comme ceci
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_width="fill_parent"
Android:layout_height="fill_parent"
Android:orientation="vertical"
Android:background="#336699" >
<com.example.rounded.RoundedLayout
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:layout_margin="10dp"
Android:padding="30dp"
Android:background="@Android:color/transparent" >
<TextView
Android:id="@+id/textView1"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:text="foo" />
</com.example.rounded.RoundedLayout>
</LinearLayout>
Essayez ceci !! Tiré de ceci post
Ajoutez ce qui suit dans un fichier (par exemple, customshape.xml), puis placez-le dans (res/drawable/customshape.xml)
<?xml version="1.0" encoding="UTF-8"?>
<shape xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:shape="rectangle">
<gradient
Android:startColor="#SomeGradientBeginColor"
Android:endColor="#SomeGradientEndColor"
Android:angle="270"/>
<corners
Android:bottomRightRadius="7dp"
Android:bottomLeftRadius="7dp"
Android:topLeftRadius="7dp"
Android:topRightRadius="7dp"/>
</shape>
Une fois que vous avez terminé avec la création de ce fichier, définissez l’arrière-plan de l’une des manières suivantes:
Par code:
yourObject.setBackgroundResource(R.drawable.customshape);
Ou via XML, ajoutez simplement l'attribut suivant au conteneur (ex: LinearLayout ou à n'importe quel champ):
Android:background="@drawable/customshape"
Que diriez-vous...
myLayout.setBackgroundResource(R.drawable.my_rounded_drawable);
Ensuite...
my_rounded_drawable.xml
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:Android="http://schemas.Android.com/apk/res/Android">
<item>
<shape>
<solid Android:color="#FFFFFFFF" />
<stroke Android:width="1dip" Android:color="#FF000000" />
<corners Android:radius="10dp" />
</shape>
</item>
</selector>
[EDIT: on dirait que cela sera ajouté dans L: https://developer.Android.com/preview/material/views-shadows.html#clip , ce qui vous permet de découper une vue à la forme d’un rectangulaires, circulaires ou rectangulaires ronds pouvant être dessinés.]
J'ai juste essayé de le faire moi-même pendant très longtemps et je suis tombé sur cette réponse qui suggère que ce n'est pas possible, car la classe View est basée sur la classe Rect. Je viens de vérifier la source et d'après les commentaires, il semble que ce soit toujours le cas.
Motorola publiera la Moto 360 (montre Android Wear à cadran rond) plus tard cet été. Il sera peut-être mis à jour le cadre afin de permettre des vues avec des formes autres que des rectangles.
Au lieu d'essayer de couper les coins de votre mise en page, pourquoi ne pas placer un dessin sur celui-ci comme une sorte de cadre qui correspond à la couleur de votre fond?