X-Git-Url: https://git.mdrn.pl/mobilnebezpieczenstwo.git/blobdiff_plain/4b08fd3d054a0b4872d60adc7627bfdef069c39b..be45943134f44b96728f516e91a66149e51443c0:/app/src/main/java/com/samsung/srpol/parallax/ParallaxListViewHelper.java diff --git a/app/src/main/java/com/samsung/srpol/parallax/ParallaxListViewHelper.java b/app/src/main/java/com/samsung/srpol/parallax/ParallaxListViewHelper.java new file mode 100644 index 0000000..9e1a055 --- /dev/null +++ b/app/src/main/java/com/samsung/srpol/parallax/ParallaxListViewHelper.java @@ -0,0 +1,169 @@ +/* + The MIT License (MIT) + + Copyright (c) 2014 Nir Hartmann + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. + */ +package com.samsung.srpol.parallax; + +import com.samsung.srpol.R; + +import android.content.Context; +import android.content.res.TypedArray; +import android.util.AttributeSet; +import android.view.View; +import android.view.animation.TranslateAnimation; +import android.widget.AbsListView; +import android.widget.AbsListView.OnScrollListener; +import android.widget.ListView; + +public class ParallaxListViewHelper implements OnScrollListener { + + private static final float DEFAULT_ALPHA_FACTOR = -1F; + private static final float DEFAULT_PARALLAX_FACTOR = 1.9F; + private static final boolean DEFAULT_IS_CIRCULAR = false; + private float parallaxFactor = DEFAULT_PARALLAX_FACTOR; + private float alphaFactor = DEFAULT_ALPHA_FACTOR; + private ParallaxedView parallaxedView; + private boolean isCircular; + private OnScrollListener listener = null; + private ListView listView; + + protected ParallaxListViewHelper(Context context, AttributeSet attrs, + ListView listView) { + init(context, attrs, listView); + } + + protected void init(Context context, AttributeSet attrs, ListView listView) { + this.listView = listView; + TypedArray typeArray = context.obtainStyledAttributes(attrs, + R.styleable.ParallaxScroll); + this.parallaxFactor = typeArray.getFloat( + R.styleable.ParallaxScroll_parallax_factor, + DEFAULT_PARALLAX_FACTOR); + this.alphaFactor = typeArray.getFloat( + R.styleable.ParallaxScroll_alpha_factor, DEFAULT_ALPHA_FACTOR); + this.isCircular = typeArray.getBoolean( + R.styleable.ParallaxScroll_circular_parallax, + DEFAULT_IS_CIRCULAR); + typeArray.recycle(); + } + + protected void setOnScrollListener(OnScrollListener l) { + this.listener = l; + } + + protected void addParallaxedHeaderView(View v) { + addParallaxedView(v); + } + + protected void addParallaxedHeaderView(View v, Object data, + boolean isSelectable) { + addParallaxedView(v); + } + + protected void addParallaxedView(View v) { + this.parallaxedView = new ListViewParallaxedItem(v); + } + + protected void parallaxScroll() { + if (isCircular) + circularParallax(); + else + headerParallax(); + } + + private void circularParallax() { + if (listView.getChildCount() > 0) { + int top = -listView.getChildAt(0).getTop(); + if (top >= 0) { + fillParallaxedViews(); + setFilters(top); + } + } + } + + private void headerParallax() { + if (parallaxedView != null) { + if (listView.getChildCount() > 0) { + int top = -listView.getChildAt(0).getTop(); + if (top >= 0) { + setFilters(top); + } + } + } + } + + private void setFilters(int top) { + parallaxedView.setOffset((float) top / parallaxFactor); + if (alphaFactor != DEFAULT_ALPHA_FACTOR) { + float alpha = (top <= 0) ? 1 : (100 / ((float) top * alphaFactor)); + parallaxedView.setAlpha(alpha); + } + parallaxedView.animateNow(); + } + + private void fillParallaxedViews() { + if (parallaxedView == null + || parallaxedView.is(listView.getChildAt(0)) == false) { + if (parallaxedView != null) { + resetFilters(); + parallaxedView.setView(listView.getChildAt(0)); + } else { + parallaxedView = new ListViewParallaxedItem( + listView.getChildAt(0)); + } + } + } + + private void resetFilters() { + parallaxedView.setOffset(0); + if (alphaFactor != DEFAULT_ALPHA_FACTOR) + parallaxedView.setAlpha(1F); + parallaxedView.animateNow(); + } + + @Override + public void onScroll(AbsListView view, int firstVisibleItem, + int visibleItemCount, int totalItemCount) { + parallaxScroll(); + if (this.listener != null) + this.listener.onScroll(view, firstVisibleItem, visibleItemCount, + totalItemCount); + } + + @Override + public void onScrollStateChanged(AbsListView view, int scrollState) { + if (this.listener != null) + this.listener.onScrollStateChanged(view, scrollState); + } + + protected class ListViewParallaxedItem extends ParallaxedView { + + public ListViewParallaxedItem(View view) { + super(view); + } + + @Override + protected void translatePreICS(View view, float offset) { + addAnimation(new TranslateAnimation(0, 0, offset, offset)); + } + } +}