2012-04-04 5 views
5

Ich habe eine Aktivität mit einer Schaltfläche und einem Bild und einem Webview. Mein Ziel ist es, eine Seite zu laden, dann JavaScript ausführen, um Grafiken mit HTML5 etc. zu zeichnen.Rendering Android Webview zu Bitmap, HTML5 Javascript, Callback-Problem

Die Höhe des Bildes von der html5 gezeichnet ist unbekannt/variabel, aber die Breite sollte immer die gleiche wie die des Telefons sein Breite/oder Browserfenster.

Ich habe eine Javascript-Schnittstelle, um einen Rückruf zu erhalten, der Informationen enthält, dass es jetzt beendet hat, die Zeichnungsfunktion aufzurufen, und es gibt mir die Höhe. Hier

ist der Aufbau der Webansicht

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

      } 
      }); 



     } 

Und die Schaltfläche ich in meiner Sicht habe, habe ich verwendet, um meine Webansicht auf eine Textur zu initiieren machen mit dieser Funktion:

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

Das funktioniert. Durch Drücken der Taste wird der gezeichnete Inhalt in die Textur gerendert und die Bildansicht hat ein korrektes Ergebnis. Der einzige Cavaet ist, dass ich warten muss, bis die Seite geladen/gezeichnet wurde, bevor ich den Knopf drücke.

Jetzt habe ich den Rückruf ich von Javascript wie diese zu erhalten implementiert:

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

     } 

    } 

Und jedes Mal, diese Callback-Funktion macht eine weiße Seite. Das Lustige daran ist, dass wenn ich den Render-to-Texture-Button physisch drücke, sobald ich diesen Callback aufgerufen habe, zeigt er das erwartete Ergebnis. Ist es runOnUiThread, das irgendwie scheitert?

Der Schlaf ist etwas, das ich hinzugefügt habe, um zu sehen, ob es eine Art lustige Verzögerung des webview-Renderings und des Rückrufs gab, den ich von Javascript erhalte.

Ich habe auch versucht, den Schlaf in den runOnUiThread zu verschieben, was auch nicht geholfen hat.

Ich hoffe jemand weiß, in welche Richtung ich schauen sollte, um dieses Problem zu lösen. Jede Hilfe wird geschätzt.

Antwort

6

eine Lösung gefunden, die die renderCoupon dazu verändern sollte:

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

Und natürlich ich den Schlaf Sachen in meinem Rückruf entfernt. Danke an meine Kollegin, die mir das gesagt hat. :)

Verwandte Themen