android - android中的垂直视差滚动

标签 android parallax

我想在不使用外部库的情况下在 android 中实现视差滚动。无论如何,是否可以像在 google play 商店中那样实现这一点。 谢谢

最佳答案

RecyclerView 中实现:

public class MyScrollListener extends RecyclerView.OnScrollListener {

    private int totalScrollDistance = 0;
    private View parallax;

    @Override
    public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
        totalScrollDistance += dy;
        if (parallax == null) {
            parallax = recyclerView.getChildAt(0);
        }
        parallax.setTranslationY(totalScrollDistance/2);
    }
}

设置:

mRecyclerView.setOnScrollListener(new MyScrollListener());

要在 ScrollView 中实现它,您必须实现 OnScrollListener:

public class MyScrollView extends ScrollView {

    private int lastScrollY;

    private OnScrollListener listener;

    public void setOnScrollListener(OnScrollListener listener) {
        this.listener = listener;
    }

    private Handler handler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            int scrollY = getScrollY();
            if (lastScrollY != scrollY) {
                lastScrollY = scrollY;
                // update when lastScrollY != scrollY and keep sending message till lastScrollY == scrollY
                handler.sendMessageDelayed(handler.obtainMessage(), 5);
            }
            if (listener != null) {
                listener.onScroll(scrollY);
            }
        }
    };

    public MyScrollView(Context context) {
        super(context);
    }

    public MyScrollView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public MyScrollView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    public MyScrollView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
        super(context, attrs, defStyleAttr, defStyleRes);
    }

    @Override
    public boolean onTouchEvent(MotionEvent ev) {
        lastScrollY = getScrollY();
        if (listener != null) {
            listener.onScroll(lastScrollY);
        }
        if (ev.getAction() == MotionEvent.ACTION_UP) {
            //might still scrolling after touching, use a handler to handle it
            handler.sendMessageDelayed(handler.obtainMessage(), 5);
        }
        return super.onTouchEvent(ev);
    }    

    public interface OnScrollListener {
        void onScroll(int dy);
    }
}

然后做我们在 RecyclerViewOnScrollListener 中做的事情:

scrollView = (MyScrollView) findViewById(R.id.my_scrollview);
    final View parallax = ((ViewGoup) scrollView.getChildAt(0)).getChildAt(0);
    scrollView.setOnScrollListener(new MyScrollView.OnScrollListener() {
        @Override
        public void onScroll(int dy) {
            parallax.setTranslationY(dy/2);
        }
    });

关于android - android中的垂直视差滚动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30038915/

相关文章:

android - 如何在 fragment android中实现视差滚动

image - vue.js vuetify : v-parallax doesn't work with local files?

android - 获取运行我的应用程序的 Android 设备的 IP 的最可靠方法是什么?不是公网IP

android - 如何从自定义 View 开始一项 Activity

jquery - 了解 Jquery 插件中的函数

reactjs - 样式组件警告建议我使用 `attrs` 方法,即使我是?

android - 如何在小米设备中以编程方式允许通知声音

android - 开发具有 "share-to"功能的 android 应用程序

Android AccountManager、Oauth、getAccessToken() 除了询问密码外什么都不做

html - 在视差图像上书写文本