|
我自定义了一个WebView,可随着手势往下滑动,完后这个WebView后面还有一个布局,后面的布局很简单,就一个TextView,WebView下滑的时候就能看到这个布局,现在这些功能都实现了,但有一个问题是,我想在WebView下滑到后面的TextView完全出现时改变TextView的文字,结果发现只要一改变这个TextView,我的WebView就自己又滑上去了(手指始终没有离开屏幕),原因未知,代码如下: 布局很简单activity_main.xml(注意这里com.example.testlayout.MyWebView要改成自己的包名) <FrameLayout 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" > <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center_horizontal"> <TextView android:id="@+id/hint" android:layout_width="wrap_content" android:layout_height="wrap_content" android:paddingTop="20dp" android:text="下拉刷新" /> </LinearLayout> <com.example.testlayout.MyWebView android:id="@+id/web_view" android:layout_width="match_parent" android:layout_height="match_parent" /> </FrameLayout> 主类MainActivity.java
public class MainActivity extends Activity {
MyWebView web;
TextView hint;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
hint = (TextView) findViewById(R.id.hint);
web = (MyWebView) findViewById(R.id.web_view);
initView();
}
private void initView() {
ViewTreeObserver vto = hint.getViewTreeObserver();
vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
hint.getViewTreeObserver().removeGlobalOnLayoutListener(this);
web.setLayoutBottom(hint.getBottom());
}
});
WebSettings webSettings = web.getSettings();
webSettings.setJavaScriptEnabled(true);
web.setWebViewClient(new WebViewClient() {
public boolean shouldOverrideUrlLoading(WebView view, String url) { // 重写此方法表明点击网页里面的链接还是在当前的webview里跳转,不跳到浏览器那边
view.loadUrl(url);
return true;
}
});
web.loadUrl("https://www.baidu.com");
web.setScrollListener(new ScrollListener() {
@Override
public void pullDownRefresh() {
hint.setText("下拉刷新");
}
@Override
public void looseRefresh() {
hint.setText("松开刷新");
}
});
}
}
自定义WebView,MyWebView.java
public class MyWebView extends WebView {
private float preY; // 之前的Y坐标
private float nowY; // 现在的Y坐标
private float distance; // 手势滑动距离
private int right; // WebView右边坐标
private int bottom; // WebView底部坐标
private int backBottom; // 隐藏在WebView后面的布局的bottom
private ScrollListener scrollListener; // 自定义监听接口
private int PULL_DOWN_STATUS = 0; // 下拉状态
private int LOOSE_REFRESH_STATUS = 1; // 松手刷新状态
private int status = PULL_DOWN_STATUS; // 当前状态
public MyWebView(Context context, AttributeSet attrs) {
super(context, attrs);
ViewTreeObserver vto = getViewTreeObserver();
vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
getViewTreeObserver().removeGlobalOnLayoutListener(this);
right = getRight();
bottom = getBottom();
}
});
}
@Override
public boolean onTouchEvent(MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
preY = event.getY();
break;
case MotionEvent.ACTION_MOVE:
nowY = event.getY() + getTop();
distance = (nowY - preY) / 2; // 这里只滑动手势滑动距离的1/2,给用户一种下拉困难的感觉,不允许用户全部拉下去
preY = nowY;
if (getScrollY() == 0) { // WebView内部的内容在顶部的时候(注:不是WebView控件本身)才需要响应手势的下滑
if (getTop() != 0 || distance >= 0) { // WebView控件本身不在顶部或者是手势向下滑动时,响应手势
if (scrollListener != null && backBottom != 0) {
if (status == PULL_DOWN_STATUS && getTop() > backBottom) { // 下滑到文字完全出现,改变文字和状态
status = LOOSE_REFRESH_STATUS;
scrollListener.looseRefresh();
} else if (status == LOOSE_REFRESH_STATUS && getTop() < backBottom){ // 上滑到文字慢慢消失,改变文字和状态
status = PULL_DOWN_STATUS;
scrollListener.pullDownRefresh();
}
}
layout(0, getTop() + (int) distance, right, getBottom()
+ (int) distance);
return true;
}
}
break;
case MotionEvent.ACTION_UP:
TranslateAnimation ta = new TranslateAnimation(0, 0, getTop()
+ (int) distance, 0);
ta.setDuration(200);
startAnimation(ta);
layout(0, 0, right, bottom);
break;
}
// TODO Auto-generated method stub
return super.onTouchEvent(event);
}
public void setLayoutBottom(int backBottom) {
this.backBottom = backBottom;
}
public void setScrollListener(ScrollListener scrollListener) {
this.scrollListener = scrollListener;
}
public interface ScrollListener {
public void pullDownRefresh(); // 下拉刷新
public void looseRefresh(); // 松开刷新
}
}
最后再AndroidManifest.xml里面加上权限<uses-permission android:name=”android.permission.INTERNET” />就OK了 PS:我尝试过很多方法,将改变文字放到handler里面,或者实现onLayout方法等等,均不行,忘高手指点 |
|
| 100分 |
更新textview时整个页面失效了?
|
|
是的,我解决了,将布局中的WebView再包一层LinearLayout就行了,但具体原因我不知道 |
|
|
。。。因为更新TextView时整个页面失效的。。。。。。invalidate();方法。。。。
|
|
|
你加上linerlayout就不会那样了。。。。。这是更新UI的问题
|
|
|
没人回答,就给你吧
|
|