您现在的位置是:首页 > 正文

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

2024-02-29 11:40:12阅读 0

首先进行简单的分析:
判断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);
    }

网站文章

  • JMeter三种参数化方式

    JMeter三种参数化方式

    jmeter在进行测试的时候,每次迭代的数据不一样的时候,需要进行参数化,从参数化的文件中来读取测试数据,那么,jmeter如何参数化呢?下面给大家介绍五种JMeter参数化的方式:一.使用用户定义的变量User Defined Variables1)添加User Defined Variables模块2)配置User Defined Variables界面中的参数及其值...

    2024-02-29 11:40:04
  • SpringBoot自动装配、启动流程及自定义starter

    SpringBoot自动装配、启动流程及自定义starter

    作为一名程序员,框架是我们平常工作中非常重要的一个框架。其为我们提供了容器和的功能,在很大程度上简化了我们项目中的开发,但随着我们使用接入的组件的增加,相应的配置文件也越来越多,这些配置文件的维护也成...

    2024-02-29 11:39:34
  • 构建工具scons让一切变得简单

    你曾经为繁琐的makefile语法纠结过吗?你有想要摆脱VS的束缚,自己构建工程却又苦于无从下手吗?你有为同一个工程要在不同操作系统或不同平台下构建编译环境而苦恼过吗? 本文有我的选择,你的答案。 最近小试了一把用scons来构建编译环境,感觉很不错,跟大家分享一下。 先说明下什么是scons,scons是一个Python写的自动化构建工具,就比如老牌的cmake,或者如果经常跟g...

    2024-02-29 11:39:26
  • java单例_最好懂的Java单例模式,没有之一

    单例(Singleton)模式 也叫单态模式,是java的23种设计模式之一。网上很多介绍,我就言简意赅点了。一、单例模式的应用场景1.整个程序的运行中只允许有一个类的实例;2.需要频繁实例化然后销毁...

    2024-02-29 11:39:19
  • ssm 开发maven项目jar包不能用的问题

    这里写自定义目录标题新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPan...

    2024-02-29 11:38:49
  • 原来编码就是这么简单

    原来编码就是这么简单

    日期:2019年12月26日作者:Commas注释:对于编码,我知道什么?对于编码,我不知道什么?文章目录一、什么是编码?二、为什么是编码?三、怎么样是编码?一、什么是编码?编码在我们生活中无处不在,暂且我们先不讨论计算机编码,举几个生活中的例子:身份证号码:前两位代表省、自治区、直辖市,比如说“44…”,代表广东省,而“43…”,代表湖南省;车牌号:第一个汉字代表车户口所...

    2024-02-29 11:38:42
  • DOM破坏绕过XSSfilter例题

    DOM破坏绕过XSSfilter例题

    DOM破坏(DOM Clobbering)指的是对网页上的DOM结构进行不当的修改,导致页面行为异常、性能问题、安全风险或其他不良影响的情况。就是⼀种将 HTML 代码注⼊⻚⾯中以操纵 DOM 并最终...

    2024-02-29 11:38:34
  • 如何判断链表有环的三种解法(Python)

    一、问题描述 二、解题思路 三、最优解的代码实现 一、问题描述 有一个单向链表,链表中有可能出现环,如何判断链表是否有环? 二、解题思路 方法一: 首先从头节点开始,依次遍历单链表中的每一个节点。每遍...

    2024-02-29 11:38:04
  • 全国计算机考试实验室建设,实验室介绍

    1.2001年计算中心验室被辽宁省教委授予“合格实验室”称号2.2009年东北大学秦皇岛分校考点被教育部评为“全国计算机等级考试优秀点。3.2010年获辽宁省教学厅“2009-2010年度辽宁省普通高...

    2024-02-29 11:37:58
  • C#-2 C#程序

    C#-2 C#程序

    一 C#程序是一组类型声明C#程序或DLL的源代码是一组一种或多种类型声明。对于可执行程序,类型声明中必须有一个包含Main方法的类。命名空间是一种把相关的类型声明分组并命名的方法。是类在程序集中逻辑...

    2024-02-29 11:37:44