Javascript android中带有水平滚动的自定义webview
自定义webview可以水平滚动并分页。这样我的页面将被分割成块。如何做到这一点?任何建议都表明我陷入了这个问题Javascript android中带有水平滚动的自定义webview,javascript,android,css,webview,webkit,Javascript,Android,Css,Webview,Webkit,自定义webview可以水平滚动并分页。这样我的页面将被分割成块。如何做到这一点?任何建议都表明我陷入了这个问题 webView.setWebViewClient(new WebViewClient(){ public void onPageFinished(WebView view, String url) { //injectJavascript(view); ScreenUtils screen =
webView.setWebViewClient(new WebViewClient(){
public void onPageFinished(WebView view, String url) {
//injectJavascript(view);
ScreenUtils screen = new ScreenUtils(MainActivity.this);
int deviceHeight = screen.getRealHeight();
int deviceWidth = screen.getRealWidth();
String varMySheet = "var mySheet = document.styleSheets[0];";
String addCSSRule = "function addCSSRule(selector, newRule) {"
+ "ruleIndex = mySheet.cssRules.length;"
+ "mySheet.insertRule(selector + '{' + newRule + ';}', ruleIndex);"
+ "}";
float height=webView.getMeasuredHeight() / getResources().getDisplayMetrics().density;
String insertRule1 = "addCSSRule('html', 'margin:0px; padding:0px; height: "
+ (height)
+ "px; -webkit-column-gap: 0px; -webkit-column-width: "
+ webView.getMeasuredWidth() + "px;')";
webView.loadUrl("javascript:" + varMySheet);
webView.loadUrl("javascript:" + addCSSRule);
webView.loadUrl("javascript:" + insertRule1);
}
});
}
我已经尝试了上面的代码,但是没有分页,在底部还有额外的填充 这就是我过去实现分页的方法 您必须使用自定义网络视图才能获得总滚动宽度 这是我用的
public class WebViewWidth extends WebView {
Context context;
private boolean bAllowScroll = true;
public WebViewWidth(Context context) {
super(context);
this.context = context;
}
public WebViewWidth(Context context, AttributeSet attrs) {
super(context, attrs);
}
public int getContentWidth()
{
return this.computeHorizontalScrollRange();
}
public int getTotalHeight()
{
return this.computeVerticalScrollRange();
}
}
在主活动WebViewWidth webView
中作为全局变量
webView = (WebViewWidth) findViewById(R.id.webView);
当您设置webview客户端时
@Override
public void onPageFinished(final WebView view, String url) {
final WebView myWebView = (WebView) view;
String varMySheet = "var mySheet = document.styleSheets[0];";
String addCSSRule = "function addCSSRule(selector, newRule) {"
+ "ruleIndex = mySheet.cssRules.length;"
+ "mySheet.insertRule(selector + '{' + newRule + ';}', ruleIndex);"
+ "}";
String insertRule1 = "addCSSRule('html', 'padding: 0px; height: "
+ (myWebView.getMeasuredHeight() / mContext.getResources().getDisplayMetrics().density)
+ "px; -webkit-column-gap: 0px; -webkit-column-width: "
+ myWebView.getMeasuredWidth() + "px;')";
myWebView.loadUrl("javascript:" + varMySheet);
myWebView.loadUrl("javascript:" + addCSSRule);
myWebView.loadUrl("javascript:" + insertRule1);
view.setVisibility(View.VISIBLE);
super.onPageFinished(view, url);
//giving delay of 2 sec ,else Totalscrollwidth is giving 0
CountDownTimer test = new CountDownTimer(3000, 1000) {
@Override
public void onTick(long millisUntilFinished) { }
@Override
public void onFinish() {
int widthis = webView.getContentWidth();
TotalScrollWidth = widthis;
TotalPages = (TotalScrollWidth / ScreenWidth) - 1;
progressdialog.dismiss();
}
};
test.start();
}
计算webview的屏幕宽度和总滚动宽度
现在totalpages=Totalscrollwidth/screenwidth-1
计算屏幕宽度
Display display = getWindowManager().getDefaultDisplay();
Point size = new Point();
display.getSize(size);
int width = size.x;
ScreenWidth = width;
现在,即使对于webview,也可以实现自定义滑动,当用户向右滑动时,您可以按屏幕宽度和距离滚动webview
像这样的东西
webView.setOnTouchListener(new OnSwipeTouchListener(this) {
@Override
public void onSwipeLeft() {
// Whatever
loadnextpage();
}
@Override
public void onSwipeRight() {
loadpreviouspage();
} }
@Override
public void newTouch() {
// Do what ever needed for single tap action
}
});
及
我的轻扫触摸列表器
public class OnSwipeTouchListener implements OnTouchListener {
private final GestureDetector gestureDetector;
private static final int MAX_CLICK_DURATION = 1000;
private static final int MAX_CLICK_DISTANCE = 15;
static Context mcontext;
private long pressStartTime;
private float pressedX;
private float pressedY;
private boolean stayedWithinClickDistance;
View inflationView;
public int getLocationx() {
return Locationx;
}
public void setLocationx(int locationx) {
Locationx = locationx;
}
public int Locationx;
public int getLocationy() {
return Locationy;
}
public void setLocationy(int locationy) {
Locationy = locationy;
}
public int Locationy;
@SuppressWarnings("static-access")
public OnSwipeTouchListener(Context context) {
gestureDetector = new GestureDetector(context, new GestureListener());
this.mcontext=context;
}
public void onSwipeLeft() {
}
public void onSwipeRight() {
}
public void newTouch(){
}
public boolean onTouch(View v, MotionEvent event) {
this.inflationView=v;
gestureDetector.onTouchEvent(event);
if(event.getAction()== MotionEvent.ACTION_MOVE)
{
if (stayedWithinClickDistance && distance(pressedX, pressedY, event.getX(), event.getY()) > MAX_CLICK_DISTANCE) {
stayedWithinClickDistance = false;
}
return true;
}
else if (event.getAction()== MotionEvent.ACTION_DOWN) {
pressStartTime = System.currentTimeMillis();
pressedX = event.getX();
pressedY = event.getY();
stayedWithinClickDistance = true;
return v.onTouchEvent(event);
}
else if(event.getAction()== MotionEvent.ACTION_UP) {
long pressDuration = System.currentTimeMillis() - pressStartTime;
if (pressDuration < MAX_CLICK_DURATION && stayedWithinClickDistance) {
newTouch();
}
setLocationx((int)event.getX());
setLocationy((int)event.getY());
return v.onTouchEvent(event);
}
else{
return v.onTouchEvent(event);
}
}
private static float distance(float x1, float y1, float x2, float y2) {
float dx = x1 - x2;
float dy = y1 - y2;
float distanceInPx = (float) Math.sqrt(dx * dx + dy * dy);
return pxToDp(distanceInPx);
}
private static float pxToDp(float px) {
return px / mcontext.getResources().getDisplayMetrics().density;
}
private final class GestureListener extends SimpleOnGestureListener {
private static final int SWIPE_DISTANCE_THRESHOLD = 100;
private static final int SWIPE_VELOCITY_THRESHOLD = 100;
@Override
public boolean onDown(MotionEvent e) {
return true;
}
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
float distanceX = e2.getX() - e1.getX();
float distanceY = e2.getY() - e1.getY();
if (Math.abs(distanceX) > Math.abs(distanceY) && Math.abs(distanceX) > SWIPE_DISTANCE_THRESHOLD && Math.abs(velocityX) > SWIPE_VELOCITY_THRESHOLD) {
if (distanceX > 0)
onSwipeRight();
else
onSwipeLeft();
return true;
}
return false;
}
}
}
公共类OnSwipeTouchListener实现OnTouchListener{
私人最终手势检测器手势检测器;
私有静态最终整数最大点击持续时间=1000;
专用静态最终整数最大点击距离=15;
静态语境;
私人长按开始时间;
私有浮点数;
私人浮动压力;
私有布尔stayedWithinClickDistance;
通货膨胀观;
public int getLocationx(){
返回位置X;
}
公共无效设置位置X(内部位置X){
位置X=位置X;
}
公共国际位置X;
public int getLocationy(){
返回位置;
}
公共无效设置位置Y(内部位置Y){
Locationy=Locationy;
}
公共场所;
@抑制警告(“静态访问”)
公共OnSwipeTouchListener(上下文){
gestureDetector=new gestureDetector(上下文,new GestureListener());
this.mcontext=上下文;
}
公共void onswitpeleft(){
}
公共权利{
}
公共无效新触摸(){
}
公共布尔onTouch(视图v,运动事件){
这个.inflationView=v;
手势检测器。onTouchEvent(事件);
if(event.getAction()==MotionEvent.ACTION\u MOVE)
{
如果(包括ICKD距离和距离的静止距离(按X、按Y、event.getX()、event.getY())>最大点击距离){
stayedWithinClickDistance=false;
}
返回true;
}
else if(event.getAction()==MotionEvent.ACTION\u DOWN){
按StartTime=System.currentTimeMillis();
pressedX=event.getX();
pressedY=event.getY();
stayedWithinClickDistance=真;
返回v.onTouchEvent(事件);
}
else if(event.getAction()==MotionEvent.ACTION\u UP){
长按持续时间=System.currentTimeMillis()-按开始时间;
如果(按持续时间<最大值>单击持续时间和停留时间(包括持续时间和停留时间)){
newTouch();
}
setLocationx((int)event.getX());
setLocationy((int)event.getY());
返回v.onTouchEvent(事件);
}
否则{
返回v.onTouchEvent(事件);
}
}
专用静态浮动距离(浮动x1、浮动y1、浮动x2、浮动y2){
浮点数dx=x1-x2;
浮动dy=y1-y2;
浮点距离inpx=(float)Math.sqrt(dx*dx+dy*dy);
返回pxToDp(距离inpx);
}
专用静态浮点pxToDp(浮点px){
返回px/mcontext.getResources().getDisplayMetrics().density;
}
私有最终类GestureListener扩展了SimpleOnGestureListener{
专用静态最终整数滑动距离阈值=100;
专用静态最终整数滑动速度阈值=100;
@凌驾
公共布尔onDown(运动事件e){
返回true;
}
@凌驾
公共布尔onFling(MotionEvent e1、MotionEvent e2、float-velocityX、float-velocityY){
浮点距离x=e2.getX()-e1.getX();
浮点距离y=e2.getY()-e1.getY();
if(Math.abs(distanceX)>Math.abs(distanceY)&&Math.abs(distanceX)>滑动距离(SWIPE\u DISTANCE\u THRESHOLD)&&Math.abs(velocityX)>滑动速度(SWIPE\u THRESHOLD){
如果(距离X>0)
onswipright();
其他的
onswipleft();
返回true;
}
返回false;
}
}
}
您正在使用epub reader吗?是的,我正在使用epub reader请参见下面的答案,我正在使用epub reader tooadded on SwipeTouchListner what is PresentPage如何计算当前页面是用户当前所在的页面,最初它将为1,当用户向右滑动时,它将递增1,当用户向左滑动时,它将递减1,还要确保它的值不低于1且不大于总页数。它从四面八方都有填充,但我们不能删除填充吗
public class OnSwipeTouchListener implements OnTouchListener {
private final GestureDetector gestureDetector;
private static final int MAX_CLICK_DURATION = 1000;
private static final int MAX_CLICK_DISTANCE = 15;
static Context mcontext;
private long pressStartTime;
private float pressedX;
private float pressedY;
private boolean stayedWithinClickDistance;
View inflationView;
public int getLocationx() {
return Locationx;
}
public void setLocationx(int locationx) {
Locationx = locationx;
}
public int Locationx;
public int getLocationy() {
return Locationy;
}
public void setLocationy(int locationy) {
Locationy = locationy;
}
public int Locationy;
@SuppressWarnings("static-access")
public OnSwipeTouchListener(Context context) {
gestureDetector = new GestureDetector(context, new GestureListener());
this.mcontext=context;
}
public void onSwipeLeft() {
}
public void onSwipeRight() {
}
public void newTouch(){
}
public boolean onTouch(View v, MotionEvent event) {
this.inflationView=v;
gestureDetector.onTouchEvent(event);
if(event.getAction()== MotionEvent.ACTION_MOVE)
{
if (stayedWithinClickDistance && distance(pressedX, pressedY, event.getX(), event.getY()) > MAX_CLICK_DISTANCE) {
stayedWithinClickDistance = false;
}
return true;
}
else if (event.getAction()== MotionEvent.ACTION_DOWN) {
pressStartTime = System.currentTimeMillis();
pressedX = event.getX();
pressedY = event.getY();
stayedWithinClickDistance = true;
return v.onTouchEvent(event);
}
else if(event.getAction()== MotionEvent.ACTION_UP) {
long pressDuration = System.currentTimeMillis() - pressStartTime;
if (pressDuration < MAX_CLICK_DURATION && stayedWithinClickDistance) {
newTouch();
}
setLocationx((int)event.getX());
setLocationy((int)event.getY());
return v.onTouchEvent(event);
}
else{
return v.onTouchEvent(event);
}
}
private static float distance(float x1, float y1, float x2, float y2) {
float dx = x1 - x2;
float dy = y1 - y2;
float distanceInPx = (float) Math.sqrt(dx * dx + dy * dy);
return pxToDp(distanceInPx);
}
private static float pxToDp(float px) {
return px / mcontext.getResources().getDisplayMetrics().density;
}
private final class GestureListener extends SimpleOnGestureListener {
private static final int SWIPE_DISTANCE_THRESHOLD = 100;
private static final int SWIPE_VELOCITY_THRESHOLD = 100;
@Override
public boolean onDown(MotionEvent e) {
return true;
}
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
float distanceX = e2.getX() - e1.getX();
float distanceY = e2.getY() - e1.getY();
if (Math.abs(distanceX) > Math.abs(distanceY) && Math.abs(distanceX) > SWIPE_DISTANCE_THRESHOLD && Math.abs(velocityX) > SWIPE_VELOCITY_THRESHOLD) {
if (distanceX > 0)
onSwipeRight();
else
onSwipeLeft();
return true;
}
return false;
}
}
}