[UI][Detail Activity] Made background of viewpager is average color of ImageView, and scrolling down with parallax effect.
This commit is contained in:
parent
1e20c8ebcc
commit
666e6b2186
Binary file not shown.
@ -34,4 +34,4 @@ dependencies {
|
||||
implementation 'com.squareup.retrofit2:converter-gson:2.4.0'
|
||||
implementation 'com.android.support:recyclerview-v7:27.1.1'
|
||||
implementation 'com.squareup.picasso:picasso:2.71828'
|
||||
}
|
||||
}
|
@ -1,6 +1,9 @@
|
||||
package ru.volgorobot.vrcatalog.additional;
|
||||
|
||||
import android.content.Context;
|
||||
import android.graphics.Bitmap;
|
||||
import android.net.Uri;
|
||||
import android.provider.MediaStore;
|
||||
import android.support.annotation.NonNull;
|
||||
import android.support.v4.view.PagerAdapter;
|
||||
import android.view.View;
|
||||
@ -9,6 +12,9 @@ import android.widget.ImageView;
|
||||
|
||||
import com.squareup.picasso.Picasso;
|
||||
|
||||
import java.io.FileNotFoundException;
|
||||
import java.io.IOException;
|
||||
|
||||
public class ImagePagerAdapter extends PagerAdapter {
|
||||
/**
|
||||
* This class is designed to control the ViewPager (images of item) in the activity of viewing details of items.
|
||||
@ -57,4 +63,14 @@ public class ImagePagerAdapter extends PagerAdapter {
|
||||
public void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) {
|
||||
container.removeView((View) object);
|
||||
}
|
||||
|
||||
public Bitmap getBitmap(int position) {
|
||||
Bitmap bitmap = null;
|
||||
try {
|
||||
bitmap = MediaStore.Images.Media.getBitmap(context.getContentResolver(), Uri.parse(imageUris[position]));
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
return bitmap;
|
||||
}
|
||||
}
|
||||
|
@ -1,22 +1,24 @@
|
||||
package ru.volgorobot.vrcatalog.view;
|
||||
|
||||
import android.content.Intent;
|
||||
import android.graphics.Bitmap;
|
||||
import android.graphics.Color;
|
||||
import android.os.Bundle;
|
||||
import android.support.design.widget.TabLayout;
|
||||
import android.support.v4.view.ViewPager;
|
||||
import android.support.v7.app.AppCompatActivity;
|
||||
import android.text.method.LinkMovementMethod;
|
||||
import android.support.v7.widget.LinearLayoutManager;
|
||||
import android.support.v7.widget.RecyclerView;
|
||||
import android.support.v7.widget.Toolbar;
|
||||
import android.util.Log;
|
||||
import android.view.MenuItem;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.EditText;
|
||||
import android.widget.ListAdapter;
|
||||
import android.widget.ListView;
|
||||
import android.widget.TextView;
|
||||
import android.widget.Toast;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.LinkedHashMap;
|
||||
|
||||
import ru.volgorobot.vrcatalog.ItemPresenter;
|
||||
@ -29,11 +31,14 @@ public class DetailActivity extends AppCompatActivity implements MainContract.It
|
||||
private MainContract.ItemPresenter mPresenter;
|
||||
private ViewPager viewPager;
|
||||
private ListView propertiesList;
|
||||
private ImagePagerAdapter imagePagerAdapter;
|
||||
|
||||
@Override
|
||||
protected void onCreate(Bundle savedInstanceState) {
|
||||
super.onCreate(savedInstanceState);
|
||||
setContentView(R.layout.activity_detail);
|
||||
Toolbar toolbar = findViewById(R.id.itemactivity_toolbar);
|
||||
setSupportActionBar(toolbar);
|
||||
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
|
||||
getSupportActionBar().setHomeButtonEnabled(true);
|
||||
getSupportActionBar().setDisplayShowTitleEnabled(false);
|
||||
@ -135,11 +140,102 @@ public class DetailActivity extends AppCompatActivity implements MainContract.It
|
||||
|
||||
@Override
|
||||
public void setViewPagerContent(String[] uris) {
|
||||
ImagePagerAdapter imagePagerAdapter = new ImagePagerAdapter(DetailActivity.this, uris);
|
||||
imagePagerAdapter = new ImagePagerAdapter(DetailActivity.this, uris);
|
||||
TabLayout tabLayout = (TabLayout) findViewById(R.id.tabDots);
|
||||
viewPager.setAdapter(imagePagerAdapter);
|
||||
setViewPagerScrollListener();
|
||||
tabLayout.setupWithViewPager(viewPager);
|
||||
imagePagerAdapter.notifyDataSetChanged();
|
||||
}
|
||||
|
||||
private int getImageAverageColor(Bitmap bitmap) {
|
||||
if (null == bitmap) return Color.TRANSPARENT;
|
||||
|
||||
int redBucket = 0;
|
||||
int greenBucket = 0;
|
||||
int blueBucket = 0;
|
||||
int alphaBucket = 0;
|
||||
|
||||
boolean hasAlpha = bitmap.hasAlpha();
|
||||
int pixelCount = bitmap.getWidth() * bitmap.getHeight();
|
||||
int[] pixels = new int[pixelCount];
|
||||
bitmap.getPixels(pixels, 0, bitmap.getWidth(), 0, 0, bitmap.getWidth(), bitmap.getHeight());
|
||||
|
||||
for (int y = 0, h = bitmap.getHeight(); y < h; y++)
|
||||
{
|
||||
for (int x = 0, w = bitmap.getWidth(); x < w; x++)
|
||||
{
|
||||
int color = pixels[x + y * w]; // x + y * width
|
||||
redBucket += (color >> 16) & 0xFF; // Color.red
|
||||
greenBucket += (color >> 8) & 0xFF; // Color.greed
|
||||
blueBucket += (color & 0xFF); // Color.blue
|
||||
if (hasAlpha) alphaBucket += (color >>> 24); // Color.alpha
|
||||
}
|
||||
}
|
||||
|
||||
return Color.argb(
|
||||
(hasAlpha) ? (alphaBucket / pixelCount) : 255,
|
||||
redBucket / pixelCount,
|
||||
greenBucket / pixelCount,
|
||||
blueBucket / pixelCount);
|
||||
}
|
||||
|
||||
private void setViewPagerScrollListener() {
|
||||
ViewPager.OnPageChangeListener listener = new ViewPager.OnPageChangeListener() {
|
||||
boolean firstImageProcessed = false;
|
||||
@Override
|
||||
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
|
||||
if(position == 0 && !firstImageProcessed) {
|
||||
viewPager.setBackgroundColor(getImageAverageColor(imagePagerAdapter.getBitmap(position)));
|
||||
firstImageProcessed = true;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onPageSelected(int position) {
|
||||
if(firstImageProcessed) {
|
||||
viewPager.setBackgroundColor(getImageAverageColor(imagePagerAdapter.getBitmap(position)));
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onPageScrollStateChanged(int state) {
|
||||
//
|
||||
}
|
||||
};
|
||||
viewPager.setOnPageChangeListener(listener);
|
||||
}
|
||||
|
||||
public static boolean setListViewHeightBasedOnItems(ListView listView) {
|
||||
|
||||
ListAdapter listAdapter = listView.getAdapter();
|
||||
if (listAdapter != null) {
|
||||
|
||||
int numberOfItems = listAdapter.getCount();
|
||||
|
||||
// Get total height of all items.
|
||||
int totalItemsHeight = 0;
|
||||
for (int itemPos = 0; itemPos < numberOfItems; itemPos++) {
|
||||
View item = listAdapter.getView(itemPos, null, listView);
|
||||
item.measure(0, 0);
|
||||
totalItemsHeight += item.getMeasuredHeight();
|
||||
}
|
||||
|
||||
// Get total height of all item dividers.
|
||||
int totalDividersHeight = listView.getDividerHeight() *
|
||||
(numberOfItems - 1);
|
||||
|
||||
// Set list height.
|
||||
ViewGroup.LayoutParams params = listView.getLayoutParams();
|
||||
params.height = totalItemsHeight + totalDividersHeight;
|
||||
listView.setLayoutParams(params);
|
||||
listView.requestLayout();
|
||||
|
||||
return true;
|
||||
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
@ -5,7 +5,9 @@
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content">
|
||||
|
||||
<LinearLayout
|
||||
|
||||
|
||||
<!-- <LinearLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:orientation="vertical">
|
||||
@ -27,7 +29,7 @@
|
||||
<TextView
|
||||
android:id="@+id/itemName"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="40dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="Item Name"
|
||||
android:textAppearance="@style/TextAppearance.AppCompat.Body1"
|
||||
android:textSize="30sp"
|
||||
@ -46,9 +48,77 @@
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"/>
|
||||
|
||||
</LinearLayout>
|
||||
</LinearLayout>-->
|
||||
|
||||
|
||||
|
||||
<android.support.design.widget.AppBarLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:fitsSystemWindows="true">
|
||||
<android.support.design.widget.CollapsingToolbarLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
app:layout_scrollFlags="scroll|enterAlways">
|
||||
|
||||
<android.support.v4.view.ViewPager
|
||||
android:id="@+id/viewPager"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="311dp"
|
||||
app:layout_collapseMode="parallax" />
|
||||
<android.support.design.widget.TabLayout
|
||||
android:id="@+id/tabDots"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="62dp"
|
||||
android:layout_alignParentBottom="true"
|
||||
app:tabBackground="@drawable/tab_selector"
|
||||
app:tabGravity="center"
|
||||
app:tabIndicatorHeight="0dp" />
|
||||
<android.support.v7.widget.Toolbar
|
||||
android:id="@+id/itemactivity_toolbar"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="?attr/actionBarSize"
|
||||
app:layout_collapseMode="pin"
|
||||
app:popupTheme="@style/AppTheme" />
|
||||
|
||||
</android.support.design.widget.CollapsingToolbarLayout>
|
||||
</android.support.design.widget.AppBarLayout>
|
||||
|
||||
<android.support.v4.widget.NestedScrollView
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="619dp"
|
||||
app:layout_behavior="@string/appbar_scrolling_view_behavior"
|
||||
android:fillViewport="true">
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:orientation="vertical">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/itemName"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginLeft="9dp"
|
||||
android:text="Item Name"
|
||||
android:textAppearance="@style/TextAppearance.AppCompat.Body1"
|
||||
android:textSize="30sp" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/itemPrice"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginLeft="9dp"
|
||||
android:text="Item Price"
|
||||
android:textAppearance="@style/TextAppearance.AppCompat.Body1"
|
||||
android:textSize="24sp" />
|
||||
|
||||
<ListView
|
||||
android:id="@+id/propertiesList"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
app:layout_behavior="@string/appbar_scrolling_view_behavior"
|
||||
android:nestedScrollingEnabled="false"/>
|
||||
</LinearLayout>
|
||||
</android.support.v4.widget.NestedScrollView>
|
||||
</android.support.design.widget.CoordinatorLayout>
|
@ -5,16 +5,13 @@
|
||||
<item name="windowNoTitle">true</item>
|
||||
<item name="android:statusBarColor">@android:color/transparent</item>
|
||||
</style>
|
||||
<style name="ItemActivityTheme" parent="Theme.AppCompat.Light.DarkActionBar">
|
||||
<item name="android:windowDrawsSystemBarBackgrounds">true</item>
|
||||
<item name="colorPrimary">@android:color/transparent</item>
|
||||
<item name="actionBarStyle">@style/MyActionBar</item>
|
||||
<item name="windowActionBarOverlay">true</item>
|
||||
<style name="ItemActivityTheme" parent="AppTheme">
|
||||
<item name="android:windowTranslucentStatus">true</item>
|
||||
<item name="windowActionBar">false</item>
|
||||
<item name="windowNoTitle">true</item>
|
||||
</style>
|
||||
<style name="MyActionBar" parent="Widget.AppCompat.ActionBar.Solid">
|
||||
<item name="android:background">@android:color/transparent</item>
|
||||
<!--For compatibility-->
|
||||
<item name="background">@android:color/transparent</item>
|
||||
</style>
|
||||
</resources>
|
||||
|
Loading…
Reference in New Issue
Block a user