2012-04-04 31 views
5

Tôi có hoạt động với nút, hình ảnh và chế độ xem web. Mục tiêu của tôi là tải một trang, sau đó thực hiện javascript trên trang đó để vẽ đồ họa bằng cách sử dụng HTML5, v.v.Hiển thị chế độ xem web trên Android về bitmap, html5 javascript, sự cố gọi lại

Chiều cao của hình ảnh được rút ra bởi html5 không xác định, nhưng chiều rộng phải luôn giống với điện thoại chiều rộng/hoặc cửa sổ trình duyệt.

Tôi có một giao diện javascript để nhận được một cuộc gọi lại chứa thông tin mà bây giờ nó đã hoàn thành gọi hàm vẽ, và nó cho tôi chiều cao.

Đây là thiết lập của webview

mWeb = (WebView) findViewById(R.id.webView1); 
mWeb.clearCache(true); 
mWeb.addJavascriptInterface(new IJavascriptHandler(), "cpjs"); 

mWeb.getSettings().setJavaScriptEnabled(true); 

mWeb.loadUrl(" http://theURL.com "); 
mWeb.setInitialScale(100); 
mWeb.getSettings().setDefaultZoom(WebSettings.ZoomDensity.FAR); 


mWeb.setWebViewClient(new WebViewClient() { 
      public void onPageFinished(WebView view, String url){ 
       mWidth = mWeb.getWidth(); 
       mHeight = mWeb.getHeight(); 

       view.loadUrl("javascript: Tools.adjustWidth(" + mWidth + ")"); 

       String javaCouponRender = "renderCoupon(" + kupongJson + ", 0); void(0)"; 
       view.loadUrl("javascript: " + javaCouponRender); 

      } 
      }); 



     } 

Và nút tôi có trong quan điểm của tôi, tôi đã sử dụng để bắt đầu làm webview của tôi đến một kết cấu có chức năng này:

void renderCoupon(int width,int height){ 


    bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); 
    final Canvas c =new Canvas(bitmap); 
    mWeb.draw(c); 
    imgView.setMinimumWidth(width); 
    imgView.setMinimumHeight(height); 
    imgView.setImageBitmap(bitmap); 
    imgView.setVisibility(View.VISIBLE); 
} 

Tính năng này hoạt động. Nhấn nút, hiển thị nội dung được vẽ cho kết cấu và lần xem hình ảnh có kết quả chính xác. Các cavaet duy nhất là tôi phải đợi cho đến khi trang đã được nạp/rút ra trước khi nhấn nút.

Bây giờ, tôi đã thực hiện các cuộc gọi lại tôi nhận được từ javascript như thế này:

final class IJavascriptHandler { 
     IJavascriptHandler() { 
     } 

     public void couponRenderedCallback(final int height){ 

      mHasGotRenderCallback = true; 
      mHeight = height; 
       Toast t = Toast.makeText(getApplicationContext(), "see if it helps sleeping", 2000); 
       t.show(); 
       try{ 
       Thread.sleep(5000); 
      } 
      catch(InterruptedException ex){ 

      } 
       runOnUiThread(new Runnable() { 
        @Override 
        public void run() { 

         Toast t2 = Toast.makeText(getApplicationContext(), "and now we render to texture", 2000); 
         t2.show();  
         renderCoupon(mWidth, mHeight); 
        } 
       }); 

     } 

    } 

Và mỗi lần, hàm callback này ám một trang trắng. Điều thú vị là nếu tôi bấm vào nút render-to-texture ngay khi tôi thấy gọi lại này, nó sẽ hiển thị kết quả mong đợi. Là nó runOnUiThread đó là không bằng cách nào đó?

Giấc ngủ là thứ tôi đã thêm vào để xem liệu có một số loại chậm trễ hài hước của hiển thị webview và gọi lại mà tôi nhận được từ javascript hay không.

Tôi cũng đã thử di chuyển giấc ngủ vào runOnUiThread, điều này cũng không giúp ích gì.

Tôi hy vọng một người nào đó biết được hướng tôi nên xem xét để giải quyết vấn đề này. Bất kỳ trợ giúp được đánh giá cao.

Trả lời

6

Tìm thấy một giải pháp, đó là thay đổi renderCoupon này:

void renderCoupon(final int width,final int height){ 

    mWeb.postDelayed(new Runnable() { 

     @Override 
     public void run() { 
      // TODO Auto-generated method stub 
      bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); 
      final Canvas c =new Canvas(bitmap); 
      mWeb.draw(c); 

      imgView.setMinimumWidth(width); 
      imgView.setMinimumHeight(height); 
      imgView.setImageBitmap(bitmap); 
      imgView.setVisibility(View.VISIBLE); 
     } 
    }, 100); 
} 

Và dĩ nhiên là tôi loại bỏ những thứ Ngủ trong callback của tôi. Nhờ có đồng nghiệp của tôi đã nói với tôi về điều này. :)

Các vấn đề liên quan