In this section, we will delve into advanced UI components in Android development. These components allow you to create more sophisticated and interactive user interfaces, enhancing the user experience of your applications.

Key Concepts

  1. Custom Views: Creating your own views to achieve unique UI elements.
  2. View Binding: Efficiently binding UI components in your layouts to data sources.
  3. ConstraintLayout: A powerful layout manager for creating complex layouts.
  4. MotionLayout: For creating rich animations and transitions.
  5. CoordinatorLayout: For creating complex scrolling effects.
  6. Material Design Components: Utilizing Google's Material Design components for a modern look and feel.

Custom Views

Custom views allow you to create unique UI elements that are not available in the standard Android SDK.

Example: Creating a Custom View

public class MyCustomView extends View {
    private Paint paint;

    public MyCustomView(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    private void init() {
        paint = new Paint();
        paint.setColor(Color.RED);
        paint.setStyle(Paint.Style.FILL);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        canvas.drawCircle(getWidth() / 2, getHeight() / 2, 100, paint);
    }
}

Explanation

  • Constructor: Initializes the view and sets up any necessary resources.
  • init() Method: Sets up the paint object used to draw the circle.
  • onDraw() Method: Draws a red circle in the center of the view.

View Binding

View Binding is a feature that allows you to more easily write code that interacts with views.

Example: Using View Binding

  1. Enable View Binding in build.gradle
android {
    ...
    viewBinding {
        enabled = true
    }
}
  1. Using View Binding in an Activity
public class MainActivity extends AppCompatActivity {
    private ActivityMainBinding binding;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        binding = ActivityMainBinding.inflate(getLayoutInflater());
        setContentView(binding.getRoot());

        binding.textView.setText("Hello, View Binding!");
    }
}

Explanation

  • Enable View Binding: Add the viewBinding block in your build.gradle file.
  • Binding Object: Use the binding object to access views directly without findViewById.

ConstraintLayout

ConstraintLayout is a powerful layout manager that allows you to create complex layouts with a flat view hierarchy.

Example: Using ConstraintLayout

<androidx.constraintlayout.widget.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <Button
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Button"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toEndOf="parent"/>

</androidx.constraintlayout.widget.ConstraintLayout>

Explanation

  • Constraints: Use app:layout_constraint attributes to define relationships between views.

MotionLayout

MotionLayout is a subclass of ConstraintLayout that helps you manage motion and widget animation.

Example: Using MotionLayout

<androidx.constraintlayout.motion.widget.MotionLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:layoutDescription="@xml/scene">

    <ImageView
        android:id="@+id/imageView"
        android:layout_width="100dp"
        android:layout_height="100dp"
        android:src="@drawable/ic_launcher_foreground"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintStart_toStartOf="parent"/>

</androidx.constraintlayout.motion.widget.MotionLayout>

Explanation

  • MotionScene: Define transitions and animations in a separate XML file (e.g., scene.xml).

CoordinatorLayout

CoordinatorLayout is a super-powered FrameLayout that allows you to create complex scrolling effects.

Example: Using CoordinatorLayout

<androidx.coordinatorlayout.widget.CoordinatorLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <com.google.android.material.appbar.AppBarLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <com.google.android.material.appbar.CollapsingToolbarLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            app:layout_scrollFlags="scroll|exitUntilCollapsed">

            <ImageView
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:src="@drawable/header"/>

        </com.google.android.material.appbar.CollapsingToolbarLayout>
    </com.google.android.material.appbar.AppBarLayout>

    <androidx.recyclerview.widget.RecyclerView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:layout_behavior="@string/appbar_scrolling_view_behavior"/>

</androidx.coordinatorlayout.widget.CoordinatorLayout>

Explanation

  • AppBarLayout and CollapsingToolbarLayout: Used to create a collapsible header.
  • RecyclerView: Scrolls under the header with the help of layout_behavior.

Material Design Components

Material Design components provide a consistent and modern look and feel for your app.

Example: Using Material Design Components

<com.google.android.material.button.MaterialButton
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Material Button"
    app:cornerRadius="8dp"/>

Explanation

  • MaterialButton: A button with Material Design styling.
  • Attributes: Customize the appearance with attributes like cornerRadius.

Practical Exercise

Task

Create an Android app with the following features:

  1. A custom view that draws a blue rectangle.
  2. Use View Binding to set the text of a TextView.
  3. Use ConstraintLayout to center a Button on the screen.
  4. Implement a simple MotionLayout animation that moves an ImageView from the top to the bottom of the screen.

Solution

  1. Custom View
public class BlueRectangleView extends View {
    private Paint paint;

    public BlueRectangleView(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    private void init() {
        paint = new Paint();
        paint.setColor(Color.BLUE);
        paint.setStyle(Paint.Style.FILL);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        canvas.drawRect(50, 50, 200, 200, paint);
    }
}
  1. View Binding
public class MainActivity extends AppCompatActivity {
    private ActivityMainBinding binding;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        binding = ActivityMainBinding.inflate(getLayoutInflater());
        setContentView(binding.getRoot());

        binding.textView.setText("Hello, View Binding!");
    }
}
  1. ConstraintLayout
<androidx.constraintlayout.widget.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <Button
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Centered Button"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toEndOf="parent"/>

</androidx.constraintlayout.widget.ConstraintLayout>
  1. MotionLayout
<androidx.constraintlayout.motion.widget.MotionLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:layoutDescription="@xml/scene">

    <ImageView
        android:id="@+id/imageView"
        android:layout_width="100dp"
        android:layout_height="100dp"
        android:src="@drawable/ic_launcher_foreground"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintStart_toStartOf="parent"/>

</androidx.constraintlayout.motion.widget.MotionLayout>

scene.xml

<MotionScene xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:motion="http://schemas.android.com/apk/res-auto">

    <Transition
        motion:constraintSetStart="@id/start"
        motion:constraintSetEnd="@id/end"
        motion:duration="1000">
        <OnSwipe
            motion:touchAnchorId="@id/imageView"
            motion:touchAnchorSide="top"
            motion:dragDirection="dragDown"/>
    </Transition>

    <ConstraintSet android:id="@+id/start">
        <Constraint
            android:id="@id/imageView"
            android:layout_width="100dp"
            android:layout_height="100dp"
            motion:layout_constraintTop_toTopOf="parent"
            motion:layout_constraintStart_toStartOf="parent"/>
    </ConstraintSet>

    <ConstraintSet android:id="@+id/end">
        <Constraint
            android:id="@id/imageView"
            android:layout_width="100dp"
            android:layout_height="100dp"
            motion:layout_constraintBottom_toBottomOf="parent"
            motion:layout_constraintStart_toStartOf="parent"/>
    </ConstraintSet>
</MotionScene>

Conclusion

In this section, we explored advanced UI components in Android development, including custom views, view binding, ConstraintLayout, MotionLayout, CoordinatorLayout, and Material Design components. These tools and techniques allow you to create sophisticated and interactive user interfaces, enhancing the overall user experience of your applications. In the next module, we will dive into professional Android development practices, including implementing MVVM architecture and dependency injection.

© Copyright 2024. All rights reserved