Image slider with parallax effect (FlickR style)
These are the elements of our project:Layout
Main activity layout
1
2
3
4
5
6
7
8
9
10
11
12
13
| android:layout_width="match_parent" android:layout_height="match_parent" tools:context="es.slothdevelopers.parallaximageslider.MainActivity"> <android.support.v4.view.ViewPager android:id="@+id/parallaxSlider" android:layout_width="match_parent" android:layout_height="250dp" android:layout_centerInParent="true"/></RelativeLayout> |
Page adapter element layout:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| <?xml version="1.0" encoding="utf-8"?> android:layout_width="wrap_content" android:layout_height="wrap_content"> <ImageView android:id="@+id/image" android:layout_width="wrap_content" android:layout_height="wrap_content" android:scaleType="centerCrop" android:layout_gravity="center"/></FrameLayout> |
Code
We will start defining the ViewPage adapter. Inside it we will override the intantiateItem method to inflate our layout and attach the image.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
| public class ImagePageAdapter extends PagerAdapter { private final Activity activity; private int[] imagesId; Map<Integer, View> imageViews = new HashMap<Integer, View>(); public ImagePageAdapter(Activity activity, int[] imagesId) { this.activity = activity; this.imagesId = imagesId; } public Map<Integer, View> getImageViews() { return imageViews; } @Override public int getCount() { return imagesId.length; } public boolean isViewFromObject(View view, Object object) { return view == object; } @Override public Object instantiateItem(ViewGroup container, int position) { LayoutInflater inflater = activity.getLayoutInflater(); View view = inflater.inflate(R.layout.page_adapter_element, null); ImageView imageView = (ImageView) view.findViewById(R.id.image); imageView.setImageResource(imagesId[position]); container.addView(view); imageViews.put(position, imageView); return view; } @Override public void destroyItem(ViewGroup container, int position, Object object) { container.removeView((FrameLayout) object); }} |
Saving the views at this point improves the performance due to we don’t have to search for them lather.
Now we will analyze the MainActivity code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
| public class MainActivity extends ActionBarActivity implements ViewPager.OnPageChangeListener { int[] pictures = new int[]{ R.drawable.picture_1, R.drawable.picture_2, R.drawable.picture_3, R.drawable.picture_4, R.drawable.picture_5, R.drawable.picture_6 }; private int width; ViewPager viewPager; private ImagePageAdapter adapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initViewPagerAndSetAdapter(); calculateWidth(); } private void initViewPagerAndSetAdapter(){ viewPager = (ViewPager) findViewById(R.id.parallaxSlider); adapter = new ImagePageAdapter(this, pictures); viewPager.setAdapter(adapter); addPageChangeListenerIfSDKAbove11(); } private void addPageChangeListenerIfSDKAbove11() { if (Build.VERSION.SDK_INT >11) { viewPager.setOnPageChangeListener(this); } } private void calculateWidth() { Display display = getWindowManager().getDefaultDisplay(); Point size = new Point(); viewPager.getWidth(); if (Build.VERSION.SDK_INT <13) { width = display.getWidth(); } else { display.getSize(size); width = size.x; } } @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { parallaxImages(position, positionOffsetPixels); } private void parallaxImages(int position, int positionOffsetPixels) { Map<Integer, View> imageViews = adapter.getImageViews(); for (Map.Entry<Integer, View> entry: imageViews.entrySet()){ int imagePosition = entry.getKey(); int correctedPosition = imagePosition - position; int displace = -(correctedPosition * width/2)+ (positionOffsetPixels / 2); View view = entry.getValue(); view.setX(displace); } } @Override public void onPageSelected(int position) { } @Override public void onPageScrollStateChanged(int state) { }} |
As we can see we don’t do nothing to complicated, all the “magic” its done in the parallaxImages method.
No comments:
Post a Comment