Plastic Sturgeon
Plastic Sturgeon

Reputation: 12527

Is it possible to mask a View in android?

Is it possible to mask views? For example, if I have a design that calls for a List View to be visible within an oval shaped opening. Is there a way to create a mask for a view? Is it called something else? Because all the references I find to masking in the android docs are talking about masking a canvas object or drawable. But I don't think making a drawable of an interactive object like a list View would be a good approach. Is this just a limitation to deal with for now?

Upvotes: 23

Views: 31053

Answers (2)

Christophe Smet
Christophe Smet

Reputation: 870

Yes, you can even mask complete layouts. Shameless selfplug

<com.christophesmet.android.views.maskableframelayout.MaskableFrameLayout
android:id="@+id/frm_mask_animated"
android:layout_width="100dp"
app:porterduffxfermode="DST_IN"
app:mask="@drawable/animation_mask"
android:layout_height="100dp">

<ImageView android:layout_width="match_parent"
           android:layout_height="match_parent"
           android:scaleType="centerCrop"
           android:src="@drawable/unicorn"/>

You can find it here

Upvotes: 14

asenovm
asenovm

Reputation: 6517

Yes, it is - you have to override the drawing method of your view - i.e:

......
final Path path = new Path();
path.addRoundRect(new RectF(0,0,getWidth(),getHeight()),10,10,Direction.CW);
......
@Override
protected void dispatchDraw(Canvas canvas){
    canvas.clipPath(path);
    super.dispatchDraw(canvas);
}

this will draw your view only in the boundaries set by path.

Upvotes: 41

Related Questions