rasoulmiri / Skeleton

Skeleton for Android
Apache License 2.0
326 stars 62 forks source link
andoird animation cardview gradient java placeholder skeleton

Skeleton Android

Simple yet powerful skeleton animation for all view in android
Android Arsenal Minimum API 17

alt tag

See demo project
See demo APK

Setup :

Add JitPack repository in your root build.gradle at the end of repositories.

allprojects {
    repositories {
        ...
        maven { url 'https://jitpack.io' }
    }
}

Add dependency in your app level build.gradle.

dependencies {
      compile 'com.github.rasoulmiri:Skeleton:v1.1.4'
}

Usage XML:

Step 1:

add name space on top layout

xmlns:Skeleton="http://schemas.android.com/apk/res-auto" 

Step 2:

use SkeletonGroup and SkeletonView in layout

<io.rmiri.skeleton.SkeletonGroup
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

         <io.rmiri.skeleton.SkeletonView ...>
            <View ... />
        </io.rmiri.skeleton.SkeletonView>

        <io.rmiri.skeleton.SkeletonView ...>
            <View ... />
        </io.rmiri.skeleton.SkeletonView>

</io.rmiri.skeleton.SkeletonGroup>

Example:

<android.support.v7.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:Skeleton="http://schemas.android.com/apk/res-auto"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    app:cardBackgroundColor="@color/white"
    app:cardCornerRadius="10dp"
    app:cardElevation="10dp"
    app:cardUseCompatPadding="true"
    app:contentPadding="0dp">

    <io.rmiri.skeleton.SkeletonGroup
        android:id="@+id/skeletonGroup"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        Skeleton:SK_BackgroundViewsColor="#EEEEEE"
        Skeleton:SK_animationAutoStart="true"
        Skeleton:SK_animationDirection="LTR"
        Skeleton:SK_animationDuration="1000"
        Skeleton:SK_animationFinishType="gradient"
        Skeleton:SK_animationNormalType="gradient"
        Skeleton:SK_backgroundMainColor="@android:color/transparent"
        Skeleton:SK_highLightColor="#DEDEDE">

        <RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content">

            <io.rmiri.skeleton.SkeletonView
                android:id="@+id/skeletonViewPhoto"
                android:layout_width="match_parent"
                android:layout_height="300dp"
                Skeleton:SK_cornerRadius="0dp"
                Skeleton:SK_padding="0dp"
                Skeleton:SK_shapeType="rect">

                <android.support.v7.widget.AppCompatImageView
                    android:layout_width="match_parent"
                    android:layout_height="match_parent"
                    android:scaleType="centerCrop"
                    app:srcCompat="@drawable/photoTest" />

            </io.rmiri.skeleton.SkeletonView>

            <io.rmiri.skeleton.SkeletonView
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_below="@+id/skeletonViewPhoto"
                Skeleton:SK_cornerRadius="10dp"
                Skeleton:SK_padding="5dp"
                Skeleton:SK_shapeType="rect">

                <TextView
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_alignParentBottom="true"
                    android:layout_alignParentEnd="true"
                    android:text="Title" />
            </io.rmiri.skeleton.SkeletonView>
        </RelativeLayout>
    </io.rmiri.skeleton.SkeletonGroup>
</android.support.v7.widget.CardView>

Final step

Nothing really! Just build your app, watch the magic happen ;) .

Configure XML

SkeletonGroup

SkeletonView

Way 1: Defined by 1 view

Way 2: Defined by 1 view and custom width and height

Way 3: Defined by 1 view and fill parent

Way 4: Defined by 2 views (draw from left-top startView to right-bottom endView)

SkeletonViewGroup skeletonViewGroup = new SkeletonViewGroup(getApplicationContext());
ArrayList<SkeletonModel> skeletonModels = new ArrayList<>();

// Add view 
skeletonModels.add(new SkeletonModelBuilder()
        .setChildView(btn1)
        .setIsMatchViewBoolean(true) //MatchView
        .build());

skeletonModels.add(new SkeletonModelBuilder()
        .setStartView(btn2) // AddView start
        .setEndView(btn3)// AddView end
        .build());

skeletonModels.add(new SkeletonModelBuilder()
        .setChildView(btn4)// AddView
        .setCustomWidth(ConverterUnitUtil.dpToPx(getApplicationContext(), 140f)) // CustomWidth
        .setCustomHeight(ConverterUnitUtil.dpToPx(getApplicationContext(), 50f)) // CustomHeight
        .build());

skeletonViewGroup.setSkeletonModels(skeletonModels);

// Add SkeletonViewGroup
ViewGroup.LayoutParams layout = new ViewGroup.LayoutParams(
         ViewGroup.LayoutParams.MATCH_PARENT,
         ViewGroup.LayoutParams.MATCH_PARENT)
mainLayout.addView(skeletonViewGroup, layout);

SkeletonModelBuilder

new SkeletonModelBuilder()
      .setChildView(view)
      .setCustomHeight(float)
      .setCustomHeight(float)
      .setStartView(view)
      .setEndView(view)
      .setIsMatchViewBoolean(boolean)

      .setShapeType(SkeletonModel.SHAPE_TYPE_RECT) -> SHAPE_TYPE_RECT, SHAPE_TYPE_OVAL, SHAPE_TYPE_TEXT

      .setPadding(float)
      .setPaddingTop(float)
      .setPaddingBottom(float)
      .setPaddingLeft(float)
      .setPaddingRight(float)

      .setCornerRadius(int)
      .setCornerRadiusTopRight(int)
      .setCornerRadiusTopLeft(int)
      .setCornerRadiusBottomLRight(int)
      .setCornerRadiusBottomLeft(int)

      .build();
skeletonGroup.setSkeletonListener(new SkeletonGroup.SkeletonListener() {
      @Override
      public void onStartAnimation() {
    ...
      }

      @Override
      public void onFinishAnimation() {
    ...
      }
});

for use in RecyclerView and Adapter See sample 1 activity in this project

Contributing

You are welcome to contribute with issues, PRs or suggestions.