NestedScrollView is just like ScrollView, but it supports acting as both a nested scrolling parent and child on both new and old versions of Android. Nested scrolling is enabled by default.
Nested scroll profile view is used to show large size image on the detail page but when user scroll screen then this image resize to a small circular view.
Steps to use Nested scroll profile view in your project.
- Crate a project in android studio.
- Open your build.gradle(app) and add a dependency to it-
//_______add design dependencycompile 'com.android.support:design:25.0.+'
apply plugin: 'com.android.application'
android {
compileSdkVersion 25
buildToolsVersion "25.0.0"
defaultConfig {
applicationId "com.pankaj.nested_scroll_view.demo"
minSdkVersion 15
targetSdkVersion 25
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
exclude group: 'com.android.support', module: 'support-annotations'
})
compile 'com.android.support:appcompat-v7:25.0.1'
testCompile 'junit:junit:4.12'
//_______add design dependency
compile 'com.android.support:design:25.0.+'
}
- Open your main_activity.xml and update it-
<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout 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:id="@+id/coordinatorLayout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true"
tools:context=".MainActivity">
<!--add AppBar-->
<android.support.design.widget.AppBarLayout
android:id="@+id/appBarLayout"
android:layout_width="match_parent"
android:layout_height="250dp"
android:theme="@style/AppTheme.AppBarOverlay">
<!--add collapsing toolbar-->
<android.support.design.widget.CollapsingToolbarLayout
android:id="@+id/collapsing_toolbar"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/colorPrimary"
app:contentScrim="@color/colorPrimary"
app:layout_scrollFlags="scroll|exitUntilCollapsed">
<!--add large image which will be collapsing-->
<ImageView
android:id="@+id/ivImage"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true"
android:scaleType="centerCrop"
android:src="@drawable/monley"
app:layout_collapseMode="pin"
app:layout_collapseParallaxMultiplier="0.7" />
<!--add toolbar-->
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="50dp"
android:minHeight="50dp"
app:layout_collapseMode="pin"
app:popupTheme="@style/ThemeOverlay.AppCompat.ActionBar">
<!--back icon-->
<ImageView
android:layout_width="20dp"
android:layout_height="wrap_content"
android:onClick="clickOnBack"
android:paddingBottom="5dp"
android:paddingTop="5dp"
android:src="@drawable/back" />
<!--user circular image-->
<com.pankaj.nested_scroll_view.demo.CircleImageView
android:id="@+id/ivcImage"
android:layout_width="40dp"
android:layout_height="40dp"
android:layout_margin="5dp"
android:onClick="clickOnProfileImage"
android:scaleType="fitXY"
android:src="@drawable/monley" />
<!--right side images-->
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="right"
android:layout_marginRight="10dp"
android:onClick="clickOnMap"
android:padding="5dp"
android:src="@android:drawable/ic_dialog_map" />
<!--right side images-->
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="right"
android:layout_marginRight="10dp"
android:onClick="clickOnMail"
android:padding="5dp"
android:src="@android:drawable/ic_dialog_email" />
</android.support.v7.widget.Toolbar>
</android.support.design.widget.CollapsingToolbarLayout>
</android.support.design.widget.AppBarLayout>
<android.support.v4.widget.NestedScrollView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_margin="@dimen/activity_vertical_margin"
app:layout_behavior="@string/appbar_scrolling_view_behavior">
<!--layout content-->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:paddingBottom="50dp">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="You can place all the content here." />
</LinearLayout>
</android.support.v4.widget.NestedScrollView>
</android.support.design.widget.CoordinatorLayout> - Open your MainActivity.JAVA class and update it for change text at run time-
package com.pankaj.nested_scroll_view.demo;
import android.os.Bundle;
import android.support.design.widget.AppBarLayout;
import android.support.design.widget.CollapsingToolbarLayout;
import android.support.v4.view.ViewCompat;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity implements AppBarLayout.OnOffsetChangedListener {
//__________create objects
private CollapsingToolbarLayout collapsingToolbarLayout = null;
private AppBarLayout appBarLayout;
private CircleImageView ivcImage;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//__________initialization
collapsingToolbarLayout = (CollapsingToolbarLayout) findViewById(R.id.collapsing_toolbar);
collapsingToolbarLayout.setCollapsedTitleTextAppearance(R.style.collapsedappbar);
collapsingToolbarLayout.setExpandedTitleTextAppearance(R.style.expandedappbar);
ivcImage = (CircleImageView) findViewById(R.id.ivcImage);
appBarLayout = (AppBarLayout) findViewById(R.id.appBarLayout);
//__________set title
collapsingToolbarLayout.setTitle("Pankaj Gurjar");
//__________add OnOffsetChangeListener
appBarLayout.addOnOffsetChangedListener(this);
}
//__________methode will be call when click on "Back"
public void clickOnBack(View view) {
Toast.makeText(this, "click On Back", Toast.LENGTH_SHORT).show();
}
//__________methode will be call when click on "Profile Image"
public void clickOnProfileImage(View view) {
Toast.makeText(this, "click On Profile Image", Toast.LENGTH_SHORT).show();
}
//__________methode will be call when click on "Mail"
public void clickOnMail(View view) {
Toast.makeText(this, "click OnMail", Toast.LENGTH_SHORT).show();
}
//__________methode will be call when click on "Map"
public void clickOnMap(View view) {
Toast.makeText(this, "click On Map", Toast.LENGTH_SHORT).show();
}
@Override
public void onOffsetChanged(AppBarLayout appBarLayout, int verticalOffset) {
//__________methode will be call when user scroll for show hide main image
if (collapsingToolbarLayout.getHeight() + verticalOffset < 2 * ViewCompat.getMinimumHeight(collapsingToolbarLayout)) {
//__________show circular profile image
ivcImage.animate().alpha(1).setDuration(600);
} else {
//__________hide circular profile image
ivcImage.animate().alpha(0).setDuration(600);
}
}
} - Create an class(CircleImageView.java) which will be use to show circuler image. Open your CircleImageView.java and update it-
package com.pankaj.nested_scroll_view.demo;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Bitmap.Config;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.PorterDuff.Mode;
import android.graphics.PorterDuffXfermode;
import android.graphics.Rect;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.widget.ImageView;
public class CircleImageView extends ImageView {
public CircleImageView(Context context) {
this(context, null);
}
public CircleImageView(Context context, AttributeSet attrs) {
super(context, attrs);
// newWidth = Integer.parseInt( attrs.getAttributeIntValue(1, "50"));
// = Integer.parseInt(attrs.getAttributeValue(2));
}
@Override
protected void onDraw(Canvas canvas) {
Drawable d = getDrawable();
if(d == null) {
return;
}
if(d.getIntrinsicHeight() == 0 || d.getIntrinsicWidth() == 0) {
return;
}
System.out.println("newWidth...."+getWidth());
int radius = getWidth();
Bitmap bitmap = ((BitmapDrawable)d).getBitmap();
Bitmap resized = Bitmap.createScaledBitmap(bitmap, getWidth(), getWidth(), true);
Bitmap b = createCroppedBitmap(radius, resized);
canvas.drawBitmap(b, 0, 0, null);
}
private Bitmap createCroppedBitmap(int radius, Bitmap bitmap) {
Bitmap output = Bitmap.createBitmap(bitmap.getWidth(),
bitmap.getHeight(), Config.ARGB_8888);
Canvas canvas = new Canvas(output);
final int color = 0xff424242;
final Paint paint = new Paint();
final Rect rect = new Rect(0, 0, bitmap.getWidth(),
bitmap.getHeight());
paint.setAntiAlias(true);
canvas.drawARGB(0, 0, 0, 0);
// paint.setColor(color);
canvas.drawCircle(bitmap.getWidth() / 2,
bitmap.getHeight() / 2, bitmap.getWidth() / 2, paint);
paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN));
canvas.drawBitmap(bitmap, rect, rect, paint);
return output;
}
}
- . Open your style.xml and update it-
<resources>
<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<!-- Customize your theme here. -->
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item>
</style>
<!--Them which will be use for no action bar-->
<style name="AppTheme.NoActionBar">
<item name="windowActionBar">false</item>
<item name="windowNoTitle">true</item>
</style>
<style name="AppTheme.AppBarOverlay" parent="ThemeOverlay.AppCompat.Dark.ActionBar"></style>
<style name="AppTheme.PopupOverlay" parent="ThemeOverlay.AppCompat.Light"></style>
<!--properties which will be use in expande condition-->
<style name="expandedappbar" parent="@android:style/TextAppearance.Medium">
<item name="android:textSize">25sp</item>
<item name="android:textColor">@android:color/white</item>
<item name="android:textStyle">bold</item>
</style>
<!--properties which will be use in collapse condition-->
<style name="collapsedappbar" parent="@android:style/TextAppearance.Medium">
<item name="android:textSize">18sp</item>
<item name="android:textColor">@android:color/white</item>
<item name="android:textStyle">normal</item>
</style>
</resources>
- Now all the development process has completed, Please run the application.
- Now scroll the screen and check it.
- Good bye, Thanks to read this blog.


