webkit中添加widget显示

widget其实就是一个网页,这样可以理解为在当前webkit多显示一个网页。

因此最低层次也要在page中多实例一个frame,在往上就是多实例page了。

 

可以选择在page中多实例frame,

实际上在page中有个mainFrame,这个是当前网页的主窗口,

因此建一个需要和它平级的frame来显示widget,

这样frame和mainFrame只是共享一个page而已。

 

比较难处理的有两个方面,一个是事件,一个是显示

事件需要在mainFrame和frame之间进行传递,也就是传给mainFrame后是否还传给frame,

相反也是需要判断的,但是给frame传事件和给mainFrame是一样的。

 

显示也需要看是否和mainFrame进行共享一个surface,

如果共享一个,那么就需要在刷新mainFrame后,也刷新一下frame,

这样widget就在web之上了,还好frame的刷新和mainFrame是一样的。

 

在owb中page是webcore的类,webview是其在webkit中的对应类。

以下是实现以上需求的代码,已添加注释说明: ```java import android.os.Bundle; import android.view.MotionEvent; import android.view.View; import android.webkit.WebView; import android.widget.FrameLayout; import androidx.appcompat.app.AppCompatActivity; public class MainActivity extends AppCompatActivity { private FrameLayout mContainer; // 容器 private WebView mWebView; // WebView private boolean isTopNavVisible = false; // 是否显示顶部导航栏 private boolean isBottomNavVisible = false; // 是否显示底部导航栏 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 初始化容器 mContainer = findViewById(R.id.container); // 初始化WebView mWebView = new WebView(this); mWebView.loadUrl("https://www.example.com"); mContainer.addView(mWebView); // 设置触摸事件监听器 mContainer.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: // 如果点击屏幕心区域,则显示/隐藏导航栏 if (event.getX() > mContainer.getWidth() / 4 && event.getX() < mContainer.getWidth() * 3 / 4 && event.getY() > mContainer.getHeight() / 4 && event.getY() < mContainer.getHeight() * 3 / 4) { toggleNav(); } break; } return true; } }); } /** * 显示/隐藏导航栏 */ private void toggleNav() { // 如果导航栏都已显示,则隐藏 if (isTopNavVisible && isBottomNavVisible) { hideNav(); } else { // 否则显示 showNav(); } } /** * 显示导航栏 */ private void showNav() { // 显示顶部导航栏 getSupportActionBar().show(); isTopNavVisible = true; // 显示底部导航栏 // (此处省略代码实现,根据具体情况自行添加) isBottomNavVisible = true; } /** * 隐藏导航栏 */ private void hideNav() { // 隐藏顶部导航栏 getSupportActionBar().hide(); isTopNavVisible = false; // 隐藏底部导航栏 // (此处省略代码实现,根据具体情况自行添加) isBottomNavVisible = false; } @Override protected void onResume() { super.onResume(); // 在转进布局的时候导航栏是隐藏的 hideNav(); } } ``` 需要注意的是,此代码的顶部导航栏使用的是 `getSupportActionBar().show()` 和 `getSupportActionBar().hide()` 方法进行显示和隐藏,需要在 `onCreate()` 方法调用 `setSupportActionBar()` 方法设置支持ActionBar,例如: ```java // 设置支持ActionBar setSupportActionBar(findViewById(R.id.toolbar)); ``` 此外,底部导航栏的实现方式因具体情况而异,此处省略实现代码,需要根据实际情况自行添加
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值