Android 判断控件是否在屏幕中可见 ScrollView

首先进行简单的分析:
判断ScrollView某个控件是否在屏幕中可见,这里有两种可能,第一种该控件直接就是在屏幕中可见,另外一种需要滑动到一定位置方可见
下面一一给出具体的实现代码
1、自定义ScrollView

public class MyScrollView extends ScrollView {
    public OnScrollChangeListener onScrollChangeListener;

    public View contentView;

    public void setOnScrollChangeListener(OnScrollChangeListener onScrollChangeListener) 
    {
        this.onScrollChangeListener = onScrollChangeListener;
    }

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

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

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

    @Override
    protected void onFinishInflate() {
        if (getChildCount() > 0) {
            contentView = getChildAt(0);
        }
    }

    public interface OnScrollChangeListener {
        void onScrollChange(MyScrollView view, int x, int y, int oldx, int oldy);

        void onScrollBottomListener();

        void onScrollTopListener();
    }

    /**
     * l当前水平滚动的开始位置
     * t当前的垂直滚动的开始位置
     * oldl上一次水平滚动的位置。
     * oldt上一次垂直滚动的位置。
     **/
    @Override
    protected void onScrollChanged(int l, int t, int oldl, int oldt) {
        super.onScrollChanged(l, t, oldl, oldt);
        if (onScrollChangeListener != null) 
        {
            onScrollChangeListener.onScrollChange(this, l, t, oldl, oldt);
        }
        {
            onScrollChangeListener.onScrollBottomListener();
        }
        if (t == 0 || t + getHeight() > contentView.getHeight() && onScrollChangeListener != null) 
        {
            onScrollChangeListener.onScrollTopListener();
        }
    }
}

2、页面布局文件示例

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <xx.xx.MyScrollView
        android:id="@+id/scrollView"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="vertical">

            <TextView
                android:id="@+id/tv_title"
                android:layout_width="match_parent"
                android:layout_height="match_parent"/>
            <TextView
                android:id="@+id/tv_remark"
                android:layout_width="match_parent"
                android:layout_height="match_parent"/>

        </LinearLayout>

    </xx.xx.MyScrollView>

</LinearLayout>

3、Activity代码


public class MainActivity extends Activity implements MyScrollView.OnScrollChangeListener {


    private Boolean isFirst = true;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.ac_xx);
        scrollView = (MyScrollView)findViewById(R.id.scrollView);
        tvTitle = (TextView) findViewById(R.id.tv_title);
        tvRemark = (TextView) findViewById(R.id.tv_remark);
        scrollView.setOnScrollChangeListener(this);
    }


    /**
     * 如果直接在onCreate中判断是没有效果的
     * @param hasFocus
     */
    @Override
    public void onWindowFocusChanged(boolean hasFocus) {
        super.onWindowFocusChanged(hasFocus);
        if (hasFocus && isFirst){
            if (checkIsVisible(this, tvRemark)) {
                Log.e("slantech","tvRemark已经可见");
            }
            isFirst = false;
        }
    }


    @TargetApi(Build.VERSION_CODES.HONEYCOMB_MR2)
    @Override
    public void onScrollChange(MyScrollView view, int x, int y, int oldx,
                               int oldy) {

            if (checkIsVisible(this, tvRemark)) {
                Log.e("slantech","tvRemark已经可见");
            }

    }


    @Override
    public void onScrollBottomListener() {
        Log.e("slantech","滑动到底部");
    }


    @Override
    public void onScrollTopListener() {
        Log.e("slantech","滑动到顶部");
    }


    MyScrollView scrollView;
    TextView tvTitle;
    TextView tvRemark;
}

4、

public static Boolean checkIsVisible(Context context, View view) {
        // 如果已经加载了,判断广告view是否显示出来,然后曝光
        int screenWidth = getScreenMetrics(context).x;
        int screenHeight = getScreenMetrics(context).y;
        Rect rect = new Rect(0, 0, screenWidth, screenHeight);
        int[] location = new int[2];
        view.getLocationInWindow(location);
        if (view.getLocalVisibleRect(rect)) {
            return true;
        } else {
            //view已不在屏幕可见区域;
            return false;
        }
    }

    /**
     * 获取屏幕宽度和高度,单位为px
     * @param context
     * @return
     */
    public static Point getScreenMetrics(Context context){
        DisplayMetrics dm =context.getResources().getDisplayMetrics();
        int w_screen = dm.widthPixels;
        int h_screen = dm.heightPixels;
        return new Point(w_screen, h_screen);
    }
  • 12
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值