预期结果
Web 视图可以滚动,并且可以响应移动或甩动等手势。
我想要实现的是类似于 Facebook 应用程序的东西。假设我们有一个内容视图,它由一个控制栏(在状态栏正下方的上半部分)和一个显示一些网页的网页视图组成。在上部控制栏中,左上角有一个菜单切换按钮,可以打开和关闭菜单窗格视图。
通过向右移动内容视图来显示菜单,通过将内容视图移回其原始位置来隐藏菜单。
除了单击菜单切换按钮之外,还可以实现 Web 视图的翻转或拖动以隐藏菜单。
问题
在将 Web 视图设置为触摸侦听器后,当我尝试在 Web 视图中滚动时没有发生任何事情。
源代码
MainActivity.java
public class MainActivity extends Activity implements OnTouchListener, OnGestureListener {
@SuppressLint("SetJavaScriptEnabled")
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// WebView
WebView mWebViewContentRight = (WebView) findViewById(R.id.web_view_content_right);
mWebViewContentRight.setWebViewClient(new WebViewClient());
mWebViewContentRight.getSettings().setJavaScriptEnabled(true);
mWebViewContentRight.getSettings().setLoadsImagesAutomatically(true);
mWebViewContentRight.loadUrl("http://m.com2us.com");
mWebViewContentRight.setOnTouchListener(this);
// Gesture detector
mGestureDetector = new GestureDetector(this);
// Dismiss shown keyboard
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
if (imm.isAcceptingText()) {
imm.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0);
}
}
// Implements View.OnTouchListener
@Override
public boolean onTouch(View view, MotionEvent event) {
final int X = (int) event.getRawX();
view = (View) view.getParent(); // i.e. linear_layout_content_right
LinearLayout.LayoutParams mLayoutParams = (LinearLayout.LayoutParams) view.getLayoutParams();
switch (event.getAction() & MotionEvent.ACTION_MASK) {
case MotionEvent.ACTION_DOWN:
_xDelta = X - mLayoutParams.leftMargin;
break;
case MotionEvent.ACTION_UP:
break;
case MotionEvent.ACTION_POINTER_DOWN:
break;
case MotionEvent.ACTION_POINTER_UP:
break;
case MotionEvent.ACTION_MOVE:
if (isMenuHidden == true) {
if (((X - _xDelta) < -384) || ((X - _xDelta) > 0)) {
// The move allows at most 480 * 80% = 384 pixels leftward and zero pixels rightward
} else {
// TODO : Implement later
}
} else { // isMenuHidden == false
if (((X - _xDelta) < -384) || ((X - _xDelta) > 0)) {
// The move allows at most 480 * 80% = 384 pixels leftward and zero pixels rightward
} else {
mLayoutParams.leftMargin = X - _xDelta;
view.setLayoutParams(mLayoutParams);
if (mLayoutParams.leftMargin <= -192) {
mLayoutParams.leftMargin = -384;
view.setLayoutParams(mLayoutParams);
isMenuHidden = true;
}
}
}
break;
}
return true;
//return mGestureDetector.onTouchEvent(event);
}
// End of Implementation of View.OnTouchListener public methods
}
activity_mail.xml
<!-- Content view including a control bar 329dp wide by 40dp high,
and a web view 329dp wide by 509dp high.
Screen size is 329dp (width by 549dp (height).
where the menu takes 80% of the width, that is, 263.2dp.
There is an invisible view as a placeholder above the menu
and to the left of the content view, which may be not necessary,
but this is my way to implement it.
-->
<LinearLayout
android:id="@+id/linear_layout_content_right"
android:layout_width="329dp"
android:layout_height="549dp"
android:layout_marginLeft="-263.2dp"
android:background="#FF0099FF"
android:gravity="left|top"
android:orientation="vertical" >
<!-- The Menu button -->
<Button
android:id="@+id/button_menu"
android:layout_width="55dp"
android:layout_height="40dp"
android:layout_gravity="left|top"
android:onClick="onButtonMenuClicked"
android:text="@string/button_menu" />
<!-- The WebView -->
<WebView
android:id="@+id/web_view_content_right"
android:layout_width="329dp"
android:layout_height="509dp"
android:longClickable="true"
android:scrollbarStyle="insideOverlay" />
</LinearLayout> <!-- End of Content right -->
谢谢你。