2012-04-04 11 views
5

Mam aktywność z przyciskiem i obrazem oraz z podglądem strony internetowej. Moim celem jest załadowanie strony, następnie wykonanie javascript na niej, rysowanie grafiki przy użyciu HTML5 itp.Renderowanie webview w systemie Android do bitmapy, javascript html5, problem z oddzwonieniem

Wysokość obrazu rysowanego przez html5 jest nieznana/zmienna, ale szerokość powinna zawsze być taka sama jak szerokość szerokość/lub okno przeglądarki.

Mam interfejs javascript, aby uzyskać wywołanie zwrotne zawierające informacje, które zakończyło wywoływanie funkcji rysowania, a to daje mi wysokość.

Oto konfiguracja z 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); 

      } 
      }); 



     } 

i przycisk mam moim zdaniem Użyłem do zainicjowania czynią moje webview do tekstury z tej funkcji:

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); 
} 

To działa. Naciśnięcie przycisku renderuje narysowaną treść do tekstury, a widok obrazu ma poprawny wynik. Jedynym cavaetem jest to, że muszę poczekać, aż strona załaduje się/narysuje przed naciśnięciem przycisku.

Teraz wdrożyły zwrotnego dostaję od javascript tak:

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); 
        } 
       }); 

     } 

    } 

I za każdym razem, to funkcja zwrotna renderuje białą stronę. Zabawne jest to, że jeśli fizycznie naciskam przycisk renderowania do tekstury, gdy tylko zobaczę, że to wywołanie zwrotne jest wywoływane, pokazuje oczekiwany wynik. Czy to runOnUiThread w jakiś sposób nie działa?

Sen jest czymś, co dodałem, aby sprawdzić, czy nie było jakiegoś śmiesznego opóźnienia renderowania w przeglądarce internetowej i wywołania zwrotnego otrzymywanego z javascript.

Próbowałem również przenieść sen do runOnUiThread, co również nie pomogło.

Mam nadzieję, że ktoś wie w jakim kierunku powinienem szukać rozwiązania tego problemu. Każda pomoc jest doceniana.

Odpowiedz

6

znalazł rozwiązanie, które miało zmienić renderCoupon do tego:

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); 
} 

I oczywiście usunąłem rzeczy spać w moim zwrotnego. Dzięki mojemu koledze, który mnie o tym poinformował. :)

Powiązane problemy