Search code examples
androidandroid-layoutandroid-viewpagerandroid-linearlayout

Custom view that splits layout diagonally with different child views


How can i split LinearLayout or RelativeLayout diagonally into two varying sizes and each having different child view. Example ViewPager in upper half section and a different LinearLayout in bottom section.

something like this :

Irregular shaped View Pager

How can i achieve this? Please help


Solution

  • The easiest approach is to just make a background image with that skewed cut. If you wish to have a dynamic layout and you want to really cut widgets, use Canvas.saveLayer/restore. Like this:

    private Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
    private Xfermode pdMode = new PorterDuffXfermode(PorterDuff.Mode.CLEAR);
    private Path path = new Path();
    
    protected void dispatchDraw(Canvas canvas) {
        int saveCount = canvas.saveLayer(0, 0, getWidth(), getHeight(), null, Canvas.ALL_SAVE_FLAG);
        super.dispatchDraw(canvas);
    
        paint.setXfermode(pdMode);
        path.reset();
        path.moveTo(0, getHeight());
        path.lineTo(getWidth(), getHeight());
        path.lineTo(getWidth(), getHeight() - TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 50, getResources().getDisplayMetrics()));
        path.close();
        canvas.drawPath(path, paint);
    
        canvas.restoreToCount(saveCount);
        paint.setXfermode(null);
    }
    

    Gist: https://gist.github.com/ZieIony/8480b2d335c1aeb51167

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        app:layout_behavior="@string/appbar_scrolling_view_behavior"
        tools:showIn="@layout/activity_main">
    
        <com.example.marcin.splitlayout.CutLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content">
    
            <ImageView
                android:scaleType="centerCrop"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:src="@drawable/mazda" />
    
    
        </com.example.marcin.splitlayout.CutLayout>
    
        <TextView
            android:layout_margin="16dp"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="Mazda 3" />
    
    </LinearLayout>
    

    enter image description here

    Btw. This thing is very popular recently :)