Android アプリ内でインタラクティブな視覚化を作成しようとしています。
視覚化されるデータは、sqlite データベースにローカルに保存され、クエリを実行して視覚化を生成します。
ネイティブ アプリと Web アプリのどちらを構築するかはまだ決めていません。
私の調査によると、d3.js はニーズに非常に適しているようですが、モバイル環境での使用方法については不明です。
Android アプリ内でインタラクティブな視覚化を作成しようとしています。
視覚化されるデータは、sqlite データベースにローカルに保存され、クエリを実行して視覚化を生成します。
ネイティブ アプリと Web アプリのどちらを構築するかはまだ決めていません。
私の調査によると、d3.js はニーズに非常に適しているようですが、モバイル環境での使用方法については不明です。
WebView コンポーネントを使用して Javascript を Android アプリに簡単に埋め込むことも、PhoneGap または同様のプラットフォームを使用することもできます。残念ながら、Android 3.0 より前のネイティブ android ブラウザーは svg を表示せず、D3 は SVG に基づいているため、android 2.3 (またはそれ以下) ブラウザーでは動作しません。ただし、Firefox ブラウザーでは機能します。
もう 1 つのオプションは、WebView または電話ギャップでInfoVis Toolkitを使用することです。InfoVis Toolkit は Android でうまく動作するようです。
同等の Android ビジュアライゼーション プラットフォームは知りませんが、D3 とその前身である Protovis、Flare、および Prefuse はすべてオープン ソースです。おそらくそのうちの 1 つを Android に移植してみてください。
関連する質問は次のとおりです。モバイル(タブレット)用の視覚化ツール
このチュートリアルに従って、D3 を Android アプリで動作させました。そこから、チュートリアルのコードを自分のニーズに合わせて簡単に拡張できました。
チュートリアルを少し変更したバージョンを次に示します (ズーム コントロールとスケーリングを追加しました)。
<html>
<head>
<script type="text/javascript" src="file:///android_asset/js/d3.min.js"></script>
<script type="text/javascript" src="file:///android_asset/js/drawGraph.js"></script>
<meta name="viewport" content="width=device-width, user-scalable=yes" />
</head>
<body>
<svg id="piechart"></svg>
</body>
</html>
function initGraph(dataset, pHeight, pWidth) {
var height = parseInt(pHeight);
var width = parseInt(pWidth);
var svg = d3.select("#piechart");
var textLabelSuffix = "%";
showPieChart(dataset, svg, height, width,
textLabelSuffix);
}
function showPieChart(dataset, svg, height, width,
textLabelSuffix)
{
var outerRadius = width / 2;
var innerRadius = 0;
// set height/width to match the SVG element
svg.attr("height", height).attr("width", width);
// create a new pie layout
var pie = d3.layout.pie();
// initialize arcs/wedges to span
// the radius of the circle
var arc = d3.svg.arc()
.innerRadius(innerRadius)
.outerRadius(outerRadius);
// create groups
var arcs = svg.selectAll("g.arc")
// bind dataset to pie layout
.data(pie(dataset))
// create groups
.enter()
// append groups
.append("g")
// create arcs
.attr("class", "arc")
// position each arc in the pie layout
.attr("transform", "translate(" +
outerRadius + "," +
outerRadius + ")");
// initialize color scale - refer to
// https://github.com/mbostock/d3/wiki/Ordinal-Scales
var color = d3.scale.category10();
arcs.append("path")
.attr("fill", function(d,i) { return color(i); })
.attr("d", arc);
arcs.append("text")
.attr("transform", function(d) {
return "translate(" + arc.centroid(d) + ")";
})
.attr("text-anchor", "middle")
.text(function(d) { return d.value +
textLabelSuffix; });
}
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">
<WebView
android:id="@+id/webview"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_below="@id/tvOutgoing"
android:layout_alignParentBottom="true"/>
</RelativeLayout>
public class VisualizationActivity extends AppCompatActivity {
private WebView webview;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_visualization);
// Prepare webview: add zoom controls and start zoomed out
webview = (WebView) findViewById(R.id.webview);
final WebSettings webSettings = webview.getSettings();
webSettings.setJavaScriptEnabled(true);
webSettings.setBuiltInZoomControls(true);
webSettings.setSupportZoom(true);
webSettings.setUseWideViewPort(true);
webview.setWebChromeClient(new WebChromeClient());
webview.setInitialScale(1);
webview.setWebViewClient(new WebViewClient() {
@Override
public void onPageFinished(WebView view, String url) {
// after the HTML page loads, run JS to initialize graph
int dataset[] = new int[] {5,10,15,20,35};
String text = Arrays.toString(dataset);
webview.loadUrl("javascript:initGraph(" +
text + ", "
(webview.getHeight()) + ", "
+ (webview.getWidth()) + ")");
}
});
// Load base html from the assets directory
webview.loadUrl("file:///android_asset/html/graph.html");
}
}
私の知る限り、Android アプリは Java のみです。したがって、d3 を使用するには、Java JavaScript エンジン/ラッパー (Rhino、または明らかに PhoneGapなど) が必要になるか、HTML5 アプリケーション (Android アプリ自体ではない) を作成する必要があります。
PhoneGap に関するそのリンクは、HTML5 からアプリを生成することに関するもののようですが、任意の追加ライブラリを含めることができるかどうかを確認する必要があります。
アプリである必要はありますか?D3 は、アプリよりも HTML5 サイトの作成に適しています。
こんにちは、D3、C3 と phonegap を使用して、インストール可能なアプリでグラフをレンダリングする際に問題が発生しました。問題は、c3.generate を実行しようとすると、ブラウザでは正常に動作しますが、インストール可能なアプリでは動作しません。解決策は、独自のディレクティブを作成し、その中で C3 を使用することです。
これが誰かに役立つことを願っています。