2013-06-06 3 views
2

Мне нужно нарисовать WebView с холстом. Я ищу ответ на два дня, но не могу найти ничего, что мне нужно.Android: нарисуйте WebView с холстом

На данный момент я могу показать WebView как этот

WebView wv = new WebView(this); 
String htmlContent = foo_getHtmlContent(); 
wv.loadData(htmlContent, "text/html", "UTF-8"); 
setContentView(wv); 

, который работает довольно хорошо, но начинается представление в пос 0,0. Кроме того, я в состоянии сделать вид (раздутый из XML) с Canvas, как этот

LayoutInflater li = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
View v = li.inflate(R.layout.layout_test, null); 
v.measure(MeasureSpec.getSize(v.getMeasuredWidth()), MeasureSpec.getSize(v.getMeasuredHeight())); 
v.layout(400, 400, 400, 400); 
canvas.translate(100, 100); 
v.draw(canvas); 

, который именно так, как я хочу сделать, но с неправильным видом. Я не могу найти способ объединить эти два способа, чтобы нарисовать вид из первого кода на втором коду (или любым другим способом)

Кто-нибудь знает, как нарисовать WebView с холстом?

EDIT:
Никто не имеет понятия?
Теперь я пробовал это, но я получаю исключение NullPointerException из-за недостающих атрибутов.

LayoutInflater li =(LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
WebView wv = null; 
try 
{ 
    wv = (WebView) li.createView("WebView", "android.webkit.", null); 
    wv.loadData(htmlContent, "text/html", "UTF-8"); 

    wv.measure(MeasureSpec.getSize(wv.getMeasuredWidth()),MeasureSpec.getSize(wv.getMeasuredHeight())); 
    wv.layout(100, 100, 400, 400); 

    canvas.translate(100, 100); 
    wv.draw(canvas); 
}catch (InflateException e) 
{ 
    Log.e("Meassure", "InflateException: " + e); 
} catch (ClassNotFoundException e) 
{ 
    Log.e("Meassure", "ClassNotFoundException: " + e); 
} 

Кто-нибудь знает, как создать атрибуты фитинга?

EDIT2:
Me again.
Я пробовал что-то еще и нашел способ, который работает с TextView, но не с веб-представлением. Это

LayoutInflater li = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
View v = li.inflate(R.layout.layout_test, null); 
TextView textView = (TextView) v.findViewById(R.id.textView1); 
textView.setText("Hello World"); 
v.measure(MeasureSpec.getSize(v.getMeasuredWidth()), MeasureSpec.getSize(v.getMeasuredHeight())); 
v.layout(400, 400, 400, 400); 
canvas.translate(100, 100); 
v.draw(canvas); 

работает довольно хорошо, и делает все TextView должен делать, но это

View v = li.inflate(R.layout.web_layout, null); 
WebView wv = (WebView) v.findViewById(R.id.webView); 
wv.loadData(htmlContent, "text/html", "UTF-8"); 
v.measure(MeasureSpec.getSize(v.getMeasuredWidth()), MeasureSpec.getSize(v.getMeasuredHeight())); 
v.layout(400, 400, 400, 400); 
canvas.translate(100, 100); 
v.draw(canvas);//if i substitute this line by setContentView(v); it works but without positioning 

абсолютно ничего не делает (кроме метания забавного материала для LogCat).
LogCat-вывода является следующее (повторяющимися каждые 10 мс):

06-17 14:04:06.210: D/webview(19424): [InitTabEffectPivot] >> nScreenWidth = 720 
06-17 14:04:06.210: D/webview(19424): [InitTabEffectPivot] >> nScreenHeight = 1280 
06-17 14:04:06.220: D/skia(19424): notifyPluginsOnFrameLoad not postponed 

Я также пытался позвонить Thread.sleep (10) после строки wv.loadData, потому что я где-то читал, что через WebView потребности некоторое время для загрузки его содержимого, но это тоже не работает. По крайней мере, кто-нибудь знает, что означает logcat-output?

+0

Вы все еще ищете решение? Я позиционировал представление внутри WebView и раздул макет с компонентом. Если вам интересно, я могу опубликовать код. – Gibberish

+0

Да, пожалуйста. Мне все еще интересно найти решение. – viper1209

+0

Я ищу способ преобразования координат javascript в координаты android, там должна быть формула для этого. Как только у меня появится, я обновлю. https: // GitHub.com/GitHK/DivToView – Gibberish

ответ

0

Есть несколько вещей, которые вам нужно знать. Первых, если вы хотите, чтобы убедиться, что страница была загружена, вы можете сделать это путем создания пользовательского WebViewClient, и установить его в WebView

private class CustomWebViewClient extends WebViewClient { 
... 
@Override 
public void onPageFinished(WebView view, String url) { 
super.onPageFinished(view, url); 
// YOUR CODE HERE 
} 
... 

wv.setWebViewClient(new CustomWebViewClient()); 

Для рисования на холсте, на самом деле есть более чем одним способом. Один простой способ, вы можете создать растровое изображение с веб-представления, например:

webView.setDrawingCacheEnabled(true); 
wv.buildDrawingCache(false); 
Bitmap bmp = wv.getDrawingCache(false); 
webView.setDrawingCacheEnabled(false); 

Canvas canvas = new Canvas(bmp); 
+0

Я уже пробовал создать Bitmap из своего WebView, но после Bitmap bmp = wv.getDrawingCache (false); bmp Null каждый раз. Что мне нужно в разделе // ВАШЕ КОДЕКС ЗДЕСЬ? Я уже пробовал wv.setWebViewClient (новый WebViewClient()); бит это ничего не меняет (видимо) – viper1209

+0

Я написал часть onPageFinished, так как вы упомянули о ожидании загрузки страницы. В принципе, это должно сработать. Во всяком случае, этот вопрос обсуждался довольно много, я предлагаю вам попробовать: http://stackoverflow.com/questions/4633988/generate-bitmap-from-html-in-android http://www.mailinglistarchive.com/ html/[email protected]/2009-09/msg01732.html – yakobom

Смежные вопросы