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