Android之向上滑动某控件至顶部悬浮

最近实现一个答题的页面,大致内容:顶部是分数,下面都是题目。实现滑动题目时仍保留顶部的操作。

很常规的操作,因为题目是根据接口动态实现的,极其复杂,所以滑动使用ScrollView实现。

效果:

实现思路:

重写ScrollView中的onScrollChanged方法,通过接口回调计算滑动距离,控制控件的显示隐藏达到这种效果。在布局中,要浮动的控件并不一定在最上面,通过ScrollView滑动接口,计算出滑动距离,当滑动距离达到该控件位置时,便会显示反之隐藏!
 

代码:

1.XML布局文件:




    

        

            

            

            

            

            

            

            

            

        

    

    


2.自定义View:MyScrollView

继承ScrollView重写onScrollChanged方法。

/**
 * Created by zachary on 2019/07/09.
 */
public class MyScrollView extends ScrollView {

    private MyScrollViewListener scrollViewListener = null;

    public void setScrollViewListener(MyScrollViewListener scrollViewListener) {
        this.scrollViewListener = scrollViewListener;
    }

    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);
    }

    @Override
    protected void onScrollChanged(int l, int t, int oldl, int oldt) {
        super.onScrollChanged(l, t, oldl, oldt);
        if (scrollViewListener != null) {
            scrollViewListener.onScrollChanged(this, l, t, oldl, oldt);
        }
    }

    public interface MyScrollViewListener {
        void onScrollChanged(MyScrollView scrollView, int x, int y, int oldx, int oldy);
    }
}

3.Activity页面

Activity实现MyScrollView.MyScrollViewListener这个接口

public class SlideActivity extends SuperActivity implements MyScrollView.MyScrollViewListener {

    @BindView(R.id.sr_view)
    MyScrollView sr_view;
    @BindView(R.id.your_block)
    TextView your_block;
    @BindView(R.id.img_head)
    ImageView img_head;

    private int height;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        getHetght();
    }

    @Override
    public int getContentViewId() {
        return R.layout.activity_slide;
    }

    // 布局完成,计算高度
    private void getHetght() {

        ViewTreeObserver vto = img_head.getViewTreeObserver();
        vto.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
            @Override
            public void onGlobalLayout() {
                height = img_head.getHeight();
                sr_view.setScrollViewListener(SlideActivity.this);
            }
        });
    }

    @Override
    public void onScrollChanged(MyScrollView scrollView, int x, int y, int oldx, int oldy) {
        if (y <= height) {
            your_block.setVisibility(View.INVISIBLE);
        } else {
            your_block.setVisibility(View.VISIBLE);
        }
    }
}

 

你可能感兴趣的:(Android之从头自学,Android之自定义View)