Hello friends
If you want create beautiful splash screen with animation see this blog and enjoy.
Follow step by step instruction...
Step 1: Create a resource file in values folder by name theme.xml
theme.xml
<?xml version="1.0" encoding="utf-8"?><resources>
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
<!-- Customize your theme here. -->
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item>
<item name="android:windowBackground">@null</item>
</style>
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
<!-- Customize your theme here. -->
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item>
<item name="android:windowBackground">@null</item>
</style>
<style name="AppTheme.Placeholder">
<item name="android:windowBackground">@drawable/toolbar_placeholder</item>
</style>
<item name="android:windowBackground">@drawable/toolbar_placeholder</item>
</style>
</resources>
Step 2: Create a drawable file in drawable folder by name logo.xml and download any type of logo image.
toolbar_placeholder.xml
<?xml version="1.0" encoding="utf-8"?>
<layer-list
xmlns:android="http://schemas.android.com/apk/res/android"
android:opacity="opaque"
>
<item>
<shape>
<solid android:color="@color/grey"/>
</shape>
</item>
<item
android:height="180dp"
android:gravity="top">
<shape android:shape="rectangle">
<solid android:color="?colorPrimary"/>
</shape>
</item>
</layer-list>
<layer-list
xmlns:android="http://schemas.android.com/apk/res/android"
android:opacity="opaque"
>
<item>
<shape>
<solid android:color="@color/grey"/>
</shape>
</item>
<item
android:height="180dp"
android:gravity="top">
<shape android:shape="rectangle">
<solid android:color="?colorPrimary"/>
</shape>
</item>
</layer-list>
Step 3: Go to style.xml and define the button style
style.xml
<resources>
<style name="Button" parent="Theme.AppCompat">
<item name="colorControlHighlight">@color/colorPrimary</item>
<item name="colorButtonNormal">@color/teal</item>
</style>
</resources>
<style name="Button" parent="Theme.AppCompat">
<item name="colorControlHighlight">@color/colorPrimary</item>
<item name="colorButtonNormal">@color/teal</item>
</style>
</resources>
color.xml
<?xml version="1.0" encoding="utf-8"?><resources>
<color name="colorPrimary">#3F51B5</color>
<color name="colorPrimaryDark">#303F9F</color>
<color name="colorAccent">#FF4081</color>
<color name="teal">#009687</color>
</resources>
<color name="colorPrimary">#3F51B5</color>
<color name="colorPrimaryDark">#303F9F</color>
<color name="colorAccent">#FF4081</color>
<color name="teal">#009687</color>
</resources>
actvity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
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"
>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/grey"
android:orientation="vertical"
tools:context=".OnboardingWithPlaceholderActivity"
>
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="156dp"
android:background="?colorPrimary"
android:elevation="4dp"
app:theme="@style/ThemeOverlay.AppCompat.Light"
>
<TextView
android:id="@+id/text_title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:alpha="0"
android:text="Cold starts are evil!"
android:textAppearance="@style/TextAppearance.AppCompat.Widget.ActionBar.Title.Inverse"
/>
</android.support.v7.widget.Toolbar>
<android.support.v7.widget.RecyclerView
android:id="@+id/recycler"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:clipToPadding="false"
android:paddingTop="8dp"
/>
</LinearLayout>
</FrameLayout>
<FrameLayout
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"
>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/grey"
android:orientation="vertical"
tools:context=".OnboardingWithPlaceholderActivity"
>
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="156dp"
android:background="?colorPrimary"
android:elevation="4dp"
app:theme="@style/ThemeOverlay.AppCompat.Light"
>
<TextView
android:id="@+id/text_title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:alpha="0"
android:text="Cold starts are evil!"
android:textAppearance="@style/TextAppearance.AppCompat.Widget.ActionBar.Title.Inverse"
/>
</android.support.v7.widget.Toolbar>
<android.support.v7.widget.RecyclerView
android:id="@+id/recycler"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:clipToPadding="false"
android:paddingTop="8dp"
/>
</LinearLayout>
</FrameLayout>
MainActvity.java
package com.example.saulmm.splashes;
import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
import android.animation.ValueAnimator;
import android.graphics.BitmapFactory;
import android.os.Handler;
import android.support.v4.view.ViewCompat;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.Toolbar;
import android.util.TypedValue;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewTreeObserver;
import android.widget.ImageView;
import android.widget.TextView;
import com.example.saulmm.splashes.itemanimator.ItemAnimatorFactory;
import java.util.ArrayList;
import java.util.List;
public class OnboardingWithPlaceholderActivity extends AppCompatActivity {
private int mContentViewHeight;
private Toolbar mToolbar;
private RecyclerAdapter mAdapter;
private View mFab;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Fake a long startup time
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
onFakeCreate();
}
}, 500);
}
private void onFakeCreate() {
setTheme(R.style.AppTheme);
setContentView(R.layout.activity_onboarding_placeholder);
TextView titleTextView = (TextView) findViewById(R.id.text_title);
ViewCompat.animate(titleTextView).alpha(1).start();
RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recycler);
mFab = findViewById(R.id.fab);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
recyclerView.setItemAnimator(ItemAnimatorFactory.slidein());
mAdapter = new RecyclerAdapter();
recyclerView.setAdapter(mAdapter);
mToolbar = (Toolbar) findViewById(R.id.toolbar);
mToolbar.getViewTreeObserver().addOnPreDrawListener(
new ViewTreeObserver.OnPreDrawListener() {
@Override
public boolean onPreDraw() {
mToolbar.getViewTreeObserver().removeOnPreDrawListener(this);
final int widthSpec = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED);
final int heightSpec = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED);
mToolbar.measure(widthSpec, heightSpec);
mContentViewHeight = mToolbar.getHeight();
collapseToolbar();
return true;
}
});
}
private void collapseToolbar() {
int toolBarHeight;
TypedValue tv = new TypedValue();
getTheme().resolveAttribute(android.R.attr.actionBarSize, tv, true);
toolBarHeight = TypedValue.complexToDimensionPixelSize(tv.data, getResources().getDisplayMetrics());
ValueAnimator valueHeightAnimator = ValueAnimator.ofInt(mContentViewHeight, toolBarHeight);
valueHeightAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
ViewGroup.LayoutParams lp = mToolbar.getLayoutParams();
lp.height = (Integer) animation.getAnimatedValue();
mToolbar.setLayoutParams(lp);
}
});
valueHeightAnimator.start();
valueHeightAnimator.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
super.onAnimationEnd(animation);
// Fire item animator
mAdapter.addAll(ModelItem.getFakeItems());
// Animate fab
ViewCompat.animate(mFab).setStartDelay(600)
.setDuration(400).scaleY(1).scaleX(1).start();
}
});
}
class RecyclerAdapter extends RecyclerView.Adapter<RecyclerAdapter.RecyclerViewHolder> {
private ArrayList<ModelItem> mItems = new ArrayList<>();
@Override
public RecyclerViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_card, parent, false);
return new RecyclerViewHolder(v);
}
public void addAll(List<ModelItem> items) {
int pos = getItemCount();
mItems.addAll(items);
notifyItemRangeInserted(pos, mItems.size());
}
@Override
public void onBindViewHolder(RecyclerViewHolder holder, int position) {
holder.bind(position);
}
@Override
public int getItemCount() {
return mItems.size();
}
class RecyclerViewHolder extends RecyclerView.ViewHolder {
private TextView mTitleTextView;
private ImageView mImageView;
public RecyclerViewHolder(View itemView) {
super(itemView);
mTitleTextView = (TextView) itemView.findViewById(R.id.text_title);
mImageView = (ImageView) itemView.findViewById(R.id.img_sampleimage);
}
public void bind(int position) {
mImageView.setImageBitmap(BitmapFactory.decodeResource(
getResources(), mItems.get(position).getImgId()));
mTitleTextView.setText(mItems.get(position).getAuthor());
}
}
}
}
import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
import android.animation.ValueAnimator;
import android.graphics.BitmapFactory;
import android.os.Handler;
import android.support.v4.view.ViewCompat;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.Toolbar;
import android.util.TypedValue;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewTreeObserver;
import android.widget.ImageView;
import android.widget.TextView;
import com.example.saulmm.splashes.itemanimator.ItemAnimatorFactory;
import java.util.ArrayList;
import java.util.List;
public class OnboardingWithPlaceholderActivity extends AppCompatActivity {
private int mContentViewHeight;
private Toolbar mToolbar;
private RecyclerAdapter mAdapter;
private View mFab;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Fake a long startup time
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
onFakeCreate();
}
}, 500);
}
private void onFakeCreate() {
setTheme(R.style.AppTheme);
setContentView(R.layout.activity_onboarding_placeholder);
TextView titleTextView = (TextView) findViewById(R.id.text_title);
ViewCompat.animate(titleTextView).alpha(1).start();
RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recycler);
mFab = findViewById(R.id.fab);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
recyclerView.setItemAnimator(ItemAnimatorFactory.slidein());
mAdapter = new RecyclerAdapter();
recyclerView.setAdapter(mAdapter);
mToolbar = (Toolbar) findViewById(R.id.toolbar);
mToolbar.getViewTreeObserver().addOnPreDrawListener(
new ViewTreeObserver.OnPreDrawListener() {
@Override
public boolean onPreDraw() {
mToolbar.getViewTreeObserver().removeOnPreDrawListener(this);
final int widthSpec = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED);
final int heightSpec = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED);
mToolbar.measure(widthSpec, heightSpec);
mContentViewHeight = mToolbar.getHeight();
collapseToolbar();
return true;
}
});
}
private void collapseToolbar() {
int toolBarHeight;
TypedValue tv = new TypedValue();
getTheme().resolveAttribute(android.R.attr.actionBarSize, tv, true);
toolBarHeight = TypedValue.complexToDimensionPixelSize(tv.data, getResources().getDisplayMetrics());
ValueAnimator valueHeightAnimator = ValueAnimator.ofInt(mContentViewHeight, toolBarHeight);
valueHeightAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
ViewGroup.LayoutParams lp = mToolbar.getLayoutParams();
lp.height = (Integer) animation.getAnimatedValue();
mToolbar.setLayoutParams(lp);
}
});
valueHeightAnimator.start();
valueHeightAnimator.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
super.onAnimationEnd(animation);
// Fire item animator
mAdapter.addAll(ModelItem.getFakeItems());
// Animate fab
ViewCompat.animate(mFab).setStartDelay(600)
.setDuration(400).scaleY(1).scaleX(1).start();
}
});
}
class RecyclerAdapter extends RecyclerView.Adapter<RecyclerAdapter.RecyclerViewHolder> {
private ArrayList<ModelItem> mItems = new ArrayList<>();
@Override
public RecyclerViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_card, parent, false);
return new RecyclerViewHolder(v);
}
public void addAll(List<ModelItem> items) {
int pos = getItemCount();
mItems.addAll(items);
notifyItemRangeInserted(pos, mItems.size());
}
@Override
public void onBindViewHolder(RecyclerViewHolder holder, int position) {
holder.bind(position);
}
@Override
public int getItemCount() {
return mItems.size();
}
class RecyclerViewHolder extends RecyclerView.ViewHolder {
private TextView mTitleTextView;
private ImageView mImageView;
public RecyclerViewHolder(View itemView) {
super(itemView);
mTitleTextView = (TextView) itemView.findViewById(R.id.text_title);
mImageView = (ImageView) itemView.findViewById(R.id.img_sampleimage);
}
public void bind(int position) {
mImageView.setImageBitmap(BitmapFactory.decodeResource(
getResources(), mItems.get(position).getImgId()));
mTitleTextView.setText(mItems.get(position).getAuthor());
}
}
}
}
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.samset.splashscreen">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity"
package="com.samset.splashscreen">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity"
android:theme="@style/AppTheme.Placeholder">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
Thank you
FullSourceCodeSplashScreen
Live Sample
No comments:
Post a Comment